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

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#代码之外没有任何转换)。有可能吗?

Iai*_*ard 9

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


bar*_*njs 7

简短的答案是您不能这样做。至少,您不能没有大量的工作或使用诸如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),但是由于尚未完成(发行量少得多),因此暂时无法帮助您。

  • 为了供将来参考,.NET Core 3.0 包括最终的 API https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0#cryptographic-key-importexport (3认同)
  • 根据github问题,直到.NET Core 3.0才提供FWIW (2认同)

car*_*ott 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$"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,路径是相对于 bin 目录的,但也可以是绝对路径。它们不支持环境变量或〜。

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