首页 > 解决方案 > 如何使用商店证书为 NET Core 2.1 正确设置 HTTPS

问题描述

我使用在 Stackoverflow 找到的这个建议使用 powershell 生成了一个证书:

New-SelfSignedCertificate -Subject "CN=Test Code Signing" -Type CodeSigningCert -KeySpec "Signature" -KeyUsage "DigitalSignature" -FriendlyName "Test Code Signing" -NotAfter (get-date).AddYears(5)

在此处输入图像描述

我已将此证书复制并粘贴到受信任的根证书颁发机构中。

我的 NET Core WebAPI Program.cs 设置如下:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(options=> {
            options.Listen(IPAddress.Loopback, 5000);  // http:localhost:5000
            options.Listen(IPAddress.Any, 80);         // http:*:80
            options.Listen(IPAddress.Loopback, 443, listenOptions =>
            {
                //how to use a certificate store here? 
                //listenOptions.UseHttps("certificate.pfx", "password");
                //listenOptions.UseHttps(StoreName.My, "Test Code Signing", allowInvalid: true);
                listenOptions.UseHttps(StoreName.My, "localhost", allowInvalid: true);

            }); 
});

localhost测试代码签名在此代码中都不起作用,因为找不到它们。也许我错过了一些东西。试图按照这个MSDN文档没有运气。

目前,Google Chrome 上显示的证书与我在个人受信任的根证书颁发机构中的证书不同:

在此处输入图像描述

如何设置 Kestrel 以选择浏览器信任的自签名证书并避免阻塞消息,例如NET::ERR_CERT_AUTHORITY_INVALID

标签: c#httpsssl-certificateasp.net-core-webapikestrel-http-server

解决方案


您正在使用的 UseHttps 重载不允许您指定存储位置,因此它默认为 StoreLocation.CurrentUser。您需要调用一个从存储中检索证书并将其传递给 UseHttps 方法的方法。有一篇 MSDN 文章提供了我在底部包含的更多详细信息,但这里有一个示例(您需要将“您的通用名称”替换为证书通用名称):

    static void Main(string[] args)
    {
        var host = new WebHostBuilder()
             .UseKestrel(options =>
            {
                options.Listen(IPAddress.Any, 443, listenOptions =>
                {
                    listenOptions.UseHttps(GetHttpsCertificateFromStore());
                    listenOptions.NoDelay = true;
                });

            })
            .Build();
    }

    private static X509Certificate2 GetHttpsCertificateFromStore()
    {
        using (var store = new X509Store(StoreName.My, StoreLocation.LocalMachine))
        {
            store.Open(OpenFlags.ReadOnly);
            var certCollection = store.Certificates;
            var currentCerts = certCollection.Find(X509FindType.FindBySubjectDistinguishedName, "CN=[your common name here]", false);

            if (currentCerts.Count == 0)
            {
                throw new Exception("Https certificate is not found.");
            }

            return currentCerts[0];
        }
    }

https://docs.microsoft.com/bs-latn-ba/azure/service-fabric/service-fabric-tutorial-dotnet-app-enable-https-endpoint


推荐阅读