我已经生成了自签名证书,其中包含别名服务器和 IP 地址的主题备用名称。我已将证书导入 Windows 受信任的证书颁发机构。Chrome 接受来自 SAN 的 URL 证书,但拒绝主题中所述的 URL。
OpenSSL:
openssl req -x509 -newkey rsa:4096 -sha256 -days 999 -nodes \
-keyout nginx.key -out nginx.crt -subj '/CN=www.X.eu' \
-extensions san \
-config <(echo '[req]'; echo 'distinguished_name=req'; echo '[san]'; echo 'subjectAltName=DNS:X.eu,DNS:re1.X.eu,DNS:10.105.1.11')
证书:
Subject: CN = www.X.eu
Subject Alternative Name:
DNS Name=sandbox.X.eu
DNS Name=re1.X.eu
DNS Name=10.105.1.11
此 URL 失败,并显示“此站点缺少有效的、可信的证书 (net::ERR_CERT_COMMON_NAME_INVALID)。”
https://www.X.eu/favicon.ico
Chrome 接受此 URL:
https://re1.X.eu/favicon.ico
哪里有问题?
答案1
在 HTTPS 中,CN 字段是不是与 subjectAltName 合并 - 相反,当 SAN 扩展中包含任何域时,它将被完全忽略。因此,无论您在 CN 中拥有什么域,您必须也添加到 SAN。
事实上,您甚至可以完全从主题中省略 CN,因为所有 TLS 客户端都支持 SAN。
RFC 2818:TLS 上的 HTTP,第 3.1 节“服务器身份”:
如果存在 dNSName 类型的 subjectAltName 扩展,则必须 作为身份。否则,(最具体的)通用名称 必须使用证书主题字段中的字段。