我想在我的 ASP.Net Core 2.0(带有 Kestrel Web 服务器)应用程序中使用 HTTPS。
官方文档使用pfx格式,但我想直接使用PEM格式(从Let's encrypt生成)无需任何转换(至少我的C#代码之外没有任何转换)。可以吗?
对于那些发现这个并且正在使用 dotnet 5+ 的人
var pem = File.ReadAllText("path/to/my.pem");
var key = X509Certificate2.CreateFromPem(pem);
如果您需要私人+公共,
var certPem = File.ReadAllText("path/to/fullchain.pem");
var keyPem = File.ReadAllText("path/to/privkey.pem");
var x509 = X509Certificate2.CreateFromPem(certPem, keyPem);
然后可以像这样将其连接到 Kestrel 中:
webApplicationBuilder.WebHost.ConfigureKestrel(s => {
s.ListenAnyIP(443, options => {
options.UseHttps(x509);
}
也许还可以看看https://www.scottbrady91.com/c-sharp/pem-loading-in-dotnet-core-and-dotnet
更新:您可以在.NET 5+ 中! Iain 已经对此问题进行了描述:https://stackoverflow.com/a/72816407/6535399,或者直接从配置作为路径,如 carlin.scott 的回答:https://stackoverflow.com/ a/75178736/6535399
原答案:
简短的回答是你不能。 至少,如果没有大量的工作或使用 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$"
}
}
}
}
请注意,路径是相对于 bin 目录的,但也可以是绝对路径。他们不支持环境变量或〜。