如何更改 ASP.NET Core 中本地开发的默认 SSL 证书?

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

在 Linux 上运行本地 ASP.NET Core 应用程序时,如何将自己的证书配置为 Kestrel 使用的“默认”证书?

我知道我可以运行

dotnet dev-certs https
命令来生成新的开发证书,但这将生成新的自签名证书。我不想必须信任这个证书 - 我已经有自己的本地 CA 用于开发,并且想签署一个证书以供 ASP.NET core 使用。

我还知道您可以在我的应用程序代码中配置 Kestrel 使用的证书 (https://devblogs.microsoft.com/aspnet/configuring-https-in-asp-net-core-across- Different-platforms/) ,但我不认为这应该是应用程序的一部分。我个人倾向于在本地使用我自己的 CA 签名证书,并且如果其他开发人员愿意信任自动生成的证书,我不想强迫他们管理自己的证书。

我尝试将证书放入创建自签名开发证书的本地“我的”证书存储中(

~/.dotnet/corefx/cryptography/x509stores/my/
),但它没有被使用 - 我收到当您没有证书时发生的错误完全有证书:

暴击:Microsoft.AspNetCore.Server.Kestrel[0] 无法启动 Kestrel。 System.InvalidOperationException:无法配置 HTTPS 端点。未指定服务器证书,默认开发者证书找不到或已过期。

是否可以配置我自己的证书,或者我是否被迫使用 dotnet core 生成的证书?

asp.net-core security .net-core ssl-certificate
2个回答
8
投票

简短回答:

事实证明,ASP.NET Core 在配置 Kestrel 时会在其使用的默认证书上查找特定扩展。如果您想要获取证书,则需要设置扩展名“1.3.6.1.4.1.311.84.1.1”,并且该扩展名的原始字节值应>= 2(来自阅读源代码)。

将具有此扩展名(以及其他一些基本扩展名)的证书拖放到“我的”存储中可以默认使用该证书。

长答案:

(先阅读简答)

您不能使用现有的证书。由于 ASP.NET Core 需要对其使用的证书进行特定扩展,因此您需要创建一个要使用的新证书。但是,只要正确生成请求,您仍然可以使用由 CA 签名的证书。

假设使用 openssl,您可以在生成证书请求时通过配置文件来实现此目的:

asp_config.conf

[ req ]
default_bits = 2048
distinguished_name = dn
req_extensions = aspnet

[ dn ]
CN = localhost

[ aspnet ]
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = critical, serverAuth
subjectAltName = critical, DNS:localhost
1.3.6.1.4.1.311.84.1.1 = DER:02

然后您可以运行 openssl 命令以使用此配置生成签名请求:

openssl req -new -config asp_config.conf -keyout local_asp_dev.key -out local_asp_dev.csr -nodes

生成请求后,使用您的 CA 对其进行签名。

openssl x509 -req -in local_asp_dev.csr -CA /path/to/CA.pem -CAkey /path/to/CA.key -CAcreateserial -out local_asp_dev.crt -days 365 -sha256 -extensions aspnet -extfile asp_config.conf

您需要使用

-extensions
选项指定授予证书的扩展。此选项查看引用文件中指定的配置部分。

签名后,您需要将证书打包成pfx文件:

openssl pkcs12 -in local_asp_dev.crt -inkey local_asp_dev.key -export -out local_asp_dev.pfx

打包证书后,只需将其放入“我的”存储中 - ASP.NET 将拾取它并使用它来为您的 HTTPS 端点提供服务。 (您可能需要删除在此商店中自动创建的任何其他开发证书)。

mv local_asp_dev.pfx ~/.dotnet/corefx/cryptography/x509stores/my/

请注意,该存储在 Linux 上的位置被视为内部实现细节,可能会发生变化。 ASP.NET core 的未来版本也完全有可能需要不同的扩展值。

此解决方案是针对 ASP.NET Core 3.1 开发和测试的

其他参考资料:


2
投票

您可以使用环境变量将任何证书指定为默认证书。这就是我的机器上的工作原理:

setx ASPNETCORE_Kestrel__Certificates__Default__Location LocalMachine
setx ASPNETCORE_Kestrel__Certificates__Default__Store My
setx ASPNETCORE_Kestrel__Certificates__Default__Subject example.com

在 Linux 上你可以有这样的东西:

export ASPNETCORE_Kestrel__Certificates__Default__Path=path_to_pem
export ASPNETCORE_Kestrel__Certificates__Default__KeyPath=path_to_key
export ASPNETCORE_Kestrel__Certificates__Default__Password=password_to_key_file

说明

可以使用多个配置源提供 ASP.Net Core 应用程序的设置:

  • 设置文件,例如appsettings.json
  • 环境变量
  • Azure 密钥保管库
  • Azure 应用程序配置
  • 命令行参数
  • 已安装或创建的自定义提供程序
  • 目录文件
  • 内存中的 .NET 对象

在 MSDN 中搜索 ASP.NET Core 中的配置以获取更多详细信息。

默认情况下,Kestrel 配置是从设置文件的 Kestrel 部分加载的。这是默认证书的配置示例。

{
  "Kestrel": {
    "Certificates": {
      "Default": {
        "Path": "<path to .pfx file>",
        "Password": "$CREDENTIAL_PLACEHOLDER$"
      }
    }
  }
}

证书可以指定为:

  • 加载 .pfx 文件的路径和密码。
  • 加载 .pem/.crt 和 .key 文件的路径、KeyPath 和密码。
  • 要从证书存储加载的主题和存储。
© www.soinside.com 2019 - 2024. All rights reserved.