如何直接在Kestrel中使用PEM证书?

问题描述 投票:0回答:3

我想在我的 ASP.Net Core 2.0(带有 Kestrel Web 服务器)应用程序中使用 HTTPS。

官方文档使用pfx格式,但我想直接使用PEM格式(从Let's encrypt生成)无需任何转换(至少我的C#代码之外没有任何转换)。可以吗?

c# asp.net-core .net-core ssl-certificate kestrel-http-server
3个回答
11
投票

对于那些发现这个并且正在使用 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


8
投票

更新:您可以在.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),但由于它尚未完成(更不用说发布了)现在这对你没有帮助。


6
投票

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 目录的,但也可以是绝对路径。他们不支持环境变量或〜。

https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel/endpoints?view=aspnetcore-7.0#replace-the-default-certificate-from-configuration

© www.soinside.com 2019 - 2024. All rights reserved.