我正在使用 .NET Core 2.1.1 在 Kestrel Linux 服务器上设置 SSL。
SSL 证书由中间 CA 签名。
PFX 包含中间和根 CA 证书。
我将 pfx 文件作为 X509Certificate2 对象加载,并将其用作服务器证书。
按照我的设置方式,中间 CA 不会作为握手的一部分发送,而只发送叶子(这非常顽皮)。
return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(options =>
{
options.Listen(IPAddress.Any,443, listenOptions =>
{
listenOptions.UseHttps("ssl.pfx", "password123");
});
}
)
.Build();
所以我执行这个命令,它只显示叶子而不显示中间部分:
openssl s_client -showcerts -connect myserver:443
我希望它包括中间 ca 和叶子,正如人们所期望的那样:
openssl s_client -showcerts -connect google.com:443
我最近遇到过这种情况,发现托管 Web 服务的服务器(在本例中为 debian)除了根证书之外还需要对中间证书的显式信任。如果没有这个,它只会发送主题证书,但是当我将中间体直接添加到信任时,它开始正常工作。
在 .NET 8 上验证可以将中间 CA 作为 HTTPS 握手的一部分发送。
// Program.cs
using System.Security.Cryptography.X509Certificates;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((_, serverOptions) =>
{
var certificate = X509Certificate2.CreateFromPemFile("certs/server-certificate.crt", "certs/server-certificate.key");
serverOptions.ListenLocalhost(7000, listenOptions => listenOptions.UseHttps(certificate, https =>
{
var x509Certificate2Collection = new X509Certificate2Collection();
// ca-chain-bundle should contain all intermediate CA certificates that are part of the certificate chain with server-certificate.crt
x509Certificate2Collection.ImportFromPemFile("certs/ca-chain-bundle.crt");
https.ServerCertificateChain = x509Certificate2Collection;
}));
});
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();