在 Kestrel .NET Core 中加载中间 CA 签名的 SSL 证书的正确方法

问题描述 投票:0回答:2

我正在使用 .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
c# ssl .net-core x509certificate kestrel
2个回答
3
投票

我最近遇到过这种情况,发现托管 Web 服务的服务器(在本例中为 debian)除了根证书之外还需要对中间证书的显式信任。如果没有这个,它只会发送主题证书,但是当我将中间体直接添加到信任时,它开始正常工作。


0
投票

在 .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();
© www.soinside.com 2019 - 2024. All rights reserved.