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

ale*_*roy 10 security ssl-certificate .net-core asp.net-core

在 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/),但它没有被使用 - 当您根本没有证书时,我会收到错误消息:

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

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

ale*_*roy 10

简短回答:

事实证明,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
Run Code Online (Sandbox Code Playgroud)

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

openssl req -new -config asp_config.conf -keyout local_asp_dev.key -out local_asp_dev.csr -nodes
Run Code Online (Sandbox Code Playgroud)

生成请求后,使用您的 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
Run Code Online (Sandbox Code Playgroud)

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

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

openssl pkcs12 -in local_asp_dev.crt -inkey local_asp_dev.key -export -out local_asp_dev.pfx
Run Code Online (Sandbox Code Playgroud)

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

mv local_asp_dev.pfx ~/.dotnet/corefx/cryptography/x509stores/my/
Run Code Online (Sandbox Code Playgroud)

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

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

附加参考资料: