最近,Chrome 已停止使用我的自签名 SSL 证书,并认为它们不安全。当我查看DevTools | Security
选项卡中的证书时,我可以看到它说
缺少主题备用名称 此站点的证书不包含包含域名或 IP 地址的主题备用名称扩展。
证书错误 站点的证书链 (net::ERR_CERT_COMMON_NAME_INVALID) 存在问题。
我怎样才能解决这个问题?
最近,Chrome 已停止使用我的自签名 SSL 证书,并认为它们不安全。当我查看DevTools | Security
选项卡中的证书时,我可以看到它说
缺少主题备用名称 此站点的证书不包含包含域名或 IP 地址的主题备用名称扩展。
证书错误 站点的证书链 (net::ERR_CERT_COMMON_NAME_INVALID) 存在问题。
我怎样才能解决这个问题?
要解决此问题,您需要openssl
在创建证书时提供一个额外的参数,基本上
-sha256 -extfile v3.ext
v3.ext
像这样的文件在哪里,%%DOMAIN%%
替换为与Common Name
. 更多信息在这里和在这里。请注意,通常您会将Common Name
and设置%%DOMAIN%%
为您尝试为其生成证书的域。因此,如果它是www.mysupersite.com
,那么您将同时使用它。
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = %%DOMAIN%%
另一个注意事项:如果您想要做的只是在查看自签名证书时阻止 chrome 抛出错误,您可以通过使用特殊的命令行选项启动 Chrome 来告诉 Chrome 忽略所有站点的所有 SSL 错误,如此处详述在超级用户上
以下解决方案在 chrome 65 ( ref ) 上为我工作 -
创建一个 OpenSSL 配置文件(例如:req.cnf)
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = US
ST = VA
L = SomeCity
O = MyCompany
OU = MyDivision
CN = www.company.com
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.company.com
DNS.2 = company.com
DNS.3 = company.net
创建引用此配置文件的证书
openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
-keyout cert.key -out cert.pem -config req.cnf -sha256
正如其他人所提到的,NET::ERR_CERT_COMMON_NAME_INVALID
发生错误是因为生成的证书不包含 SAN ( subjectAltName
) 字段。
自 2000 年 5 月以来, RFC2818已弃用回退到该字段。自版本 58 以来,Chrome 已强制commonName
使用该字段(请参阅Chrome 58 deprecations)。subjectAltName
OpenSSL 接受x509v3 配置文件以向证书添加扩展配置(有关配置选项,请参阅subjectAltName字段)。
我创建了一个带有简单选项的自签名 tls bash 脚本,以便轻松生成证书颁发机构并使用 OpenSSL 签署 x509 证书(在 Chrome 中使用该subjectAltName
字段有效)。
该脚本将引导您完成一系列问题,以包含必要的信息(包括subjectAltName
字段)。您可以参考README.md了解更多详细信息和自动化选项。
请务必在安装新证书后重新启动 chrome。
chrome://restart
在 macos/Chrome 上使用自签名证书时,我遇到了很多问题。最后我找到了 Mkcert,“一个简单的零配置工具,可以使用您想要的任何名称制作本地受信任的开发证书。” https://github.com/FiloSottile/mkcert
我只是使用-subj
参数添加机器IP地址。所以只用一个命令就解决了。
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -sha256 -subj '/CN=my-domain.com/subjectAltName=DNS.1=192.168.0.222/' -keyout my-domain.key -out my-domain.crt
您可以添加其他属性,如 C、ST、L、O、OU、emailAddress 以生成证书而无需提示。
在主目录中复制 OpenSSL 配置:
cp /System/Library/OpenSSL/openssl.cnf ~/openssl-temp.cnf
或在 Linux 上:
cp /etc/ssl/openssl.cnf ~/openssl-temp.cnf
openssl-temp.cnf
在 下添加主题备用名称[v3_ca]
:
[ v3_ca ]
subjectAltName = DNS:localhost
替换localhost
为您要为其生成该证书的域。
生成证书:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-config ~/openssl-temp.cnf
-keyout /path/to/your.key -out /path/to/your.crt
然后你可以删除openssl-temp.cnf
这是创建 Chrome 信任的 IP 证书的一种非常简单的方法。
ssl.conf 文件...
[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
req_extensions = req_ext
prompt = no
[ req_distinguished_name ]
commonName = 192.168.1.10
[ req_ext ]
subjectAltName = IP:192.168.1.10
当然,192.168.1.10 是我们希望 Chrome 信任的本地网络 IP。
创建证书:
openssl genrsa -out key1.pem
openssl req -new -key key1.pem -out csr1.pem -config ssl.conf
openssl x509 -req -days 9999 -in csr1.pem -signkey key1.pem -out cert1.pem -extensions req_ext -extfile ssl.conf
rm csr1.pem
在 Windows 上,将证书导入所有客户端计算机上的受信任根证书存储区。在 Android 手机或平板电脑上下载证书进行安装。现在 Chrome 将信任 Windows 和 Android 上的证书。
在 Windows 开发框中,获取 openssl.exe 的最佳位置是从“c:\Program Files\Git\usr\bin\openssl.exe”
通过更改 v3.ext 文件的 DNS.1 值,我能够摆脱 (net::ERR_CERT_AUTHORITY_INVALID)
[alt_names] DNS.1 = domainname.com
将 domainname.com 更改为您自己的域。
2021 年 6 月更新 - Windows 10 - Chrome v91答案在这里
在 从 chrome 版本 67.0.3396.99 开始的MAC上,我的自签名证书停止工作。
用这里写的所有内容进行再生都不起作用。
更新
有机会确认我的方法今天有效:)。如果它对您不起作用,请确保您使用的是这种方法
v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = <specify-the-same-common-name-that-you-used-while-generating-csr-in-the-last-step>
$
结束更新
最终只有在从系统中删除我的证书并将其添加到本地钥匙串时才能看到绿色安全。(如果有 - 先放下它)。不确定它是否重要,但在我的情况下,我通过 chrome 下载了证书,并验证了创建日期是今天 - 所以它是我刚刚创建的那个。
希望对花一天时间的人有所帮助。
永远不要更新chrome!
如果要运行服务器 localhost,则需要设置CN = localhost
和DNS.1 = localhost
.
[req]
default_bits = 2048
default_md = sha256
distinguished_name = req_distinguished_name
prompt = no
prompt = no
x509_extensions = v3_req
[req_distinguished_name]
C = BR
CN = localhost
emailAddress=contact@example.com
L = Sao Paulo
O = example.com
OU = example.com
ST = Sao Paulo
[v3_req]
authorityKeyIdentifier = keyid, issuer
basicConstraints = CA:FALSE
extendedKeyUsage = serverAuth
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost