c# - 如何使用商店证书为 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
?
解决方案
您正在使用的 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];
}
}
推荐阅读
- c# - 带有 CKEditor 到 Azure WebApp 的 ASP.Net MVC 应用程序给出“无法启动 CKFinder:语言文件丢失或损坏”
- c++ - FHD 视频流上 OpenCV 文本覆盖的 CPU 占用太高
- moodle - 无法在 Catalina 上安装最新版本的 moodle4mac
- algorithm - 如何使用 Dijkstra 算法找到具有顶点约束的最短路径
- intellij-idea - 如何在 Intellij Idea 的项目选项卡中添加“选择打开的文件”图标?
- math - 找到小于 n 的偶数个数?
- prolog - 如何在 prolog 中修复 Einstein Zebra 中的错误 >
- php - 无法获得 Echo 的字幕,只有标题
- android - 如何在适配器内膨胀回收视图?
- hyperledger-fabric - Hyperledger Fabric - 块检查错误