在 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 在配置 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 开发和测试的
其他参考资料:
您可以使用环境变量将任何证书指定为默认证书。这就是我的机器上的工作原理:
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 和密码。
- 要从证书存储加载的主题和存储。