生成的 SSL 证书在“个人”>“证书”中不起作用,只有当它也在“受信任的根证书颁发机构”>“证书”中时才起作用

生成的 SSL 证书在“个人”>“证书”中不起作用,只有当它也在“受信任的根证书颁发机构”>“证书”中时才起作用

我正在尝试使用 certutil 自动安装 SSL 证书,并且已使用以下命令成功完成此操作:

certutil -addstore -user -f "My" "$CERT_FILE_CERT"

查看 certmgr 中的证书,已安装的证书按预期显示在“个人”>“证书”下。当我的浏览器(Chrome、Edge)使用该证书为 SAN 列表中提到的主机名之一提供页面时,这似乎不足以验证该证书。

为了成功验证证书并接受其合法性,我还必须将证书安装到受信任的根证书颁发机构。有没有办法可以更改我用于 OpenSSL 的配置文件,以便只需要个人 > 证书条目?还是我总是需要在两个地方安装证书?

就上下文而言,我的目标是尽可能简化在公司中设置本地开发环境的过程。我们要求的一件事是本地服务必须通过 HTTPS 提供(一项服务是身份服务,如果您的重定向 URL 不安全,“使用 Google 登录”将不起作用)。

我使用具有以下配置的 OpenSSL 来生成证书:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
C = JP
ST = Shizuoka
L = Hamamatsu
O = COMPANY
OU = Development
CN = localhost

[v3_req]
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
IP.1 = 127.0.0.1
DNS.1 = localhost
DNS.2 = host.docker.internal

以及以下命令:

openssl ecparam -genkey -name prime256v1 | openssl ec -aes256 -out $CERT_FILE_KEY -passout "pass:$CERT_PWD"

openssl req -new -x509 -nodes -days 3650 -key $CERT_FILE_KEY -out $CERT_FILE_CERT -passin "pass:$CERT_PWD" -passout "pass:$CERT_PWD" -config cert-input.conf

openssl pkcs12 -export -out $CERT_FILE_PFX -inkey $CERT_FILE_KEY -in $CERT_FILE_CERT -passin "pass:$CERT_PWD" -passout "pass:$CERT_PWD" -name "Local Dev"

由此获得了以下证书:

-----BEGIN CERTIFICATE-----
MIICODCCAd6gAwIBAgIUNrzhFtF68r7gVL5isCrZNUoOzS4wCgYIKoZIzj0EAwIw
cDELMAkGA1UEBhMCSlAxETAPBgNVBAgMCFNoaXp1b2thMRIwEAYDVQQHDAlIYW1h
bWF0c3UxEDAOBgNVBAoMB0NPTVBBTlkxFDASBgNVBAsMC0RldmVsb3BtZW50MRIw
EAYDVQQDDAlsb2NhbGhvc3QwHhcNMjEwODI2MDMyMjMyWhcNMzEwODI0MDMyMjMy
WjBwMQswCQYDVQQGEwJKUDERMA8GA1UECAwIU2hpenVva2ExEjAQBgNVBAcMCUhh
bWFtYXRzdTEQMA4GA1UECgwHQ09NUEFOWTEUMBIGA1UECwwLRGV2ZWxvcG1lbnQx
EjAQBgNVBAMMCWxvY2FsaG9zdDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJRO
TwcPcq2ZI8y6vDqiKaxJ1IGcIsVup1xpBdgGOTpKMQ5IZWyIttFEXjBVytSPJXJx
4NXiryNnWdMEPNdu7JujVjBUMAsGA1UdDwQEAwIF4DATBgNVHSUEDDAKBggrBgEF
BQcDATAwBgNVHREEKTAnhwR/AAABgglsb2NhbGhvc3SCFGhvc3QuZG9ja2VyLmlu
dGVybmFsMAoGCCqGSM49BAMCA0gAMEUCIQDC6qzBjPB8Wj/G7a4x8O8ccX3Gqs5O
W2vwk78A/dDaJAIgdsBlg8kc1MNPuHHXEfp1PvOFAR0DWEilUPJDgbQw6eA=
-----END CERTIFICATE-----

答案1

一切正常。受信任的根证书颁发机构存储区是您放置您信任的证书(根证书)的地方。如果证书不在那里,您的依赖方就不知道您已选择信任它们。

个人的存储是您放置订户(也称为终端实体)证书的地方。这些是服务用来向依赖方呈现的证书。如果您有一个作为服务器/服务的 Windows 应用程序(例如 IIS),则仅需要此处的证书。

由于您的 SAN 是用于localhost此目的,因此您需要确保该机器上运行的任何服务都可以访问证书和私钥。如果它不是 Windows 本机应用程序,或者不是可以访问 Windows 证书存储的应用程序,那么您将需要根据其文档在该服务上配置证书和私钥;而不是将其放在个人的存储。当您将证书添加到受信任的根证书颁发机构商店,这表明您可能已经这样做了。

你最好创建一个 CA 密钥和证书 (basicConstraints = CA),并将其放在受信任的根证书颁发机构存储。然后使用它来签署最终实体证书,供您的应用程序使用。

相关内容