ssl - 是否可以为 Kestrel 服务器的单个实例指定 2 个不同的 SSL 证书?

标签 ssl https kestrel-http-server

我知道“KestrelServerOptions”类中有一个接受单个证书的方法“UseHttps”,但是是否可以指定多个 SSL 证书以便能够在单个实例中使用多个域和多个证书红隼?

最佳答案

可以通过在调用 UseHttps() 时设置 ServerCertificateSelector 属性来实现。
选择器是您自己实现的回调,它提供了一个字符串参数,该参数指示客户端用于与您的服务器通信的 DNS 主机是什么。您可以处理此参数并返回相关证书。
取自 Microsoft docs :

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.ListenAnyIP(5005, listenOptions =>
    {
        listenOptions.UseHttps(httpsOptions =>
        {
            var localhostCert = CertificateLoader.LoadFromStoreCert(
                "localhost", "My", StoreLocation.CurrentUser,
                allowInvalid: true);
            var exampleCert = CertificateLoader.LoadFromStoreCert(
                "example.com", "My", StoreLocation.CurrentUser,
                allowInvalid: true);
            var subExampleCert = CertificateLoader.LoadFromStoreCert(
                "sub.example.com", "My", StoreLocation.CurrentUser,
                allowInvalid: true);
            var certs = new Dictionary<string, X509Certificate2>(
                StringComparer.OrdinalIgnoreCase)
            {
                ["localhost"] = localhostCert,
                ["example.com"] = exampleCert,
                ["sub.example.com"] = subExampleCert
            };

            httpsOptions.ServerCertificateSelector = (connectionContext, name) =>
            {
                if (name is not null && certs.TryGetValue(name, out var cert))
                {
                    return cert;
                }

                return exampleCert;
            };
        });
    });
});

关于ssl - 是否可以为 Kestrel 服务器的单个实例指定 2 个不同的 SSL 证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41261203/

相关文章:

visual-studio-2017 - VS2017下Kestrel端口设置被忽略

mono - Kestrel 命令抛出无法加载 libuv。确保 libuv 已安装并可用作 libuv.so.1

linux - 如何在 bash 脚本中获取控制台输入以使用 SSL?

ssl - Confluent REST 代理 API SSL 握手失败

php - 我如何在 PHP 中解决 ldap_start_tls() "Unable to start TLS: Connect error"?

silverlight - 为什么我的 Silverlight 客户端在切换到 SSL 时找不到 clientaccesspolicy 文件?

javascript - 如何在客户端使用 JavaScript 来检测页面是否已加密?

nginx - 为什么Linux上的ASP.NET 5需要使用Kestrel?

python - 从 Flask 应用程序中访问 SSL 证书信息

c++ - 使用 C++ 通过 HTTPS 的 json-rpc 服务器?