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

16

我想在我的ASP.Net Core 2.0(配备Kestrel web服务器)应用程序中使用HTTPS。

官方文档使用pfx格式,但我想直接使用PEM格式(从Let's encrypt生成),而不需要进行任何转换(至少不在我的C#代码之外)。这是否可行?


你可以尝试从https://dev59.com/aWs05IYBdhLWcg3wLO6Q中获取一个答案,虽然我认为使用openssl命令行工具转换证书会更容易。 - junichiro
2
使用以下命令:openssl pkcs12 -inkey privkey.pem -in cert.pem -export -out cert_pfx.pfx然后会提示您输入密码。将 cert_pfx.pfx 复制到 dotnet 发布文件夹中,最后在 Program.cs 中更改: .UseKestrel(options => { options.Listen(IPAddress.Any, 3000, listenOptions => { listenOptions.UseHttps("cert_pfx.pfx", "选择的密码"); }); //https } ) - David Soler
1
对于新手,可以查看https://www.scottbrady91.com/C-Sharp/PEM-Loading-in-dotnet-core-and-dotnet - Mugen
3个回答

8
对于那些发现这篇文章,并且正在使用 .NET 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


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),但由于目前还没有完成(更不用说发布了),这并不能帮助您。


3
据 Github 问题,FWIW 将在 .NET Core 3.0 后才可用。 - Chris Marisic
3
供以后参考,.NET Core 3.0 包含最终 API。 https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0#cryptographic-key-importexport - Lex Li

6
ASP.NET 5引入了appsettings来配置PEM crt/key用于默认证书:
{
  "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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接