Moh*_*din 4 c# ssl-certificate .net-core kestrel-http-server asp.net-core
我想在我的ASP.Net Core 2.0(带有Kestrel Web服务器)应用程序中使用HTTPS。
官方文档使用pfx格式,但是我想直接使用PEM格式(由Let's crypto生成),而无需进行任何转换(至少在我的C#代码之外没有任何转换)。有可能吗?
对于那些发现这个并且正在使用 dotnet 5+ 的人
var pem = File.ReadAllText("path/to/my.pem");
var key = X509Certificate2.CreateFromPem(pem);
Run Code Online (Sandbox Code Playgroud)
如果您需要私人+公共,
var certPem = File.ReadAllText("path/to/fullchain.pem");
var keyPem = File.ReadAllText("path/to/privkey.pem");
var x509 = X509Certificate2.CreateFromPem(certPem, keyPem);
Run Code Online (Sandbox Code Playgroud)
然后可以像这样将其连接到 Kestrel 中:
webApplicationBuilder.WebHost.ConfigureKestrel(s => {
s.ListenAnyIP(443, options => {
options.UseHttps(x509);
}
Run Code Online (Sandbox Code Playgroud)
也许还可以看看https://www.scottbrady91.com/c-sharp/pem-loading-in-dotnet-core-and-dotnet
简短的答案是您不能这样做。至少,您不能没有大量的工作或使用诸如Bouncy Castle之类的东西。
当将证书和密钥放到PFX中时,X509Certificate2对象将具有cert.HasPrivateKey == true,并且能够通过Get[Algorithm]PrivateKey扩展方法系列使用私钥。当您加载PEM证书时,仅会加载公共证书部分(如果它是粘贴了PEM密钥的PEM证书,那仍然只是PEM证书)。
获得与证书关联的私钥的简单方法是使用新的(.NET Core 2.0)certWithKey = cert.CopyWithPrivateKey(key)扩展方法系列。因此,现在您“只是”需要加载私钥。.NET当前不具备加载(或保存)“。key”文件的能力(无论其扩展名如何)。如果您想在加载时有所作为,则可能需要检查一些现有技术:
好消息是.NET计划在将来支持加载密钥(https://github.com/dotnet/corefx/issues/20414),但是由于尚未完成(发行量少得多),因此暂时无法帮助您。
ASP.NET 5 引入了用于为默认证书配置 PEM crt/key 的 appsettings:
{
"Kestrel": {
"Certificates": {
"Default": {
"Path": "<path to .pem/.crt file>",
"KeyPath": "<path to .key file>",
"Password": "$CREDENTIAL_PLACEHOLDER$"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,路径是相对于 bin 目录的,但也可以是绝对路径。它们不支持环境变量或〜。