简短回答:
事实证明,ASP.NET Core 在配置 Kestrel 时会在其使用的默认证书上查找特定扩展。如果要获取证书,则需要设置扩展名“1.3.6.1.4.1.311.84.1.1”,并且该扩展名的原始字节值应 >= 2 (从阅读源代码).
将具有此扩展名(以及其他一些基本扩展名)的证书放入“我的”存储中允许默认使用该证书。
长答案:
(先阅读简短答案)
您不能使用现有的证书。由于 ASP.NET Core 需要对其使用的证书进行特定扩展,因此您需要创建一个要使用的新证书。然而,你还是can只要您正确生成请求,就可以使用由 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 开发和测试的
附加参考资料:
- “我的”商店:https://learn.microsoft.com/en-us/dotnet/standard/security/cross-platform-cryptography#the-my-store
- openssl 配置:https://www.openssl.org/docs/manmaster/man5/x509v3_config.html
- 与 CA 签名时授予扩展:https://access.redhat.com/solutions/28965