无效的自签名 SSL 证书 - "Subject Alternative Name Missing"
Invalid self signed SSL cert - "Subject Alternative Name Missing"
最近,Chrome 停止使用我的自签名 SSL 证书,并认为它们不安全。当我查看 DevTools | Security
选项卡中的证书时,我可以看到上面写着
Subject Alternative Name Missing The certificate for this site does
not contain a Subject Alternative Name extension containing a domain
name or IP address.
Certificate Error There are issues with the site's certificate chain
(net::ERR_CERT_COMMON_NAME_INVALID).
我该如何解决这个问题?
要解决此问题,您需要在创建证书时向 openssl
提供一个额外的参数,基本上
-sha256 -extfile v3.ext
其中 v3.ext
是这样的文件,其中 %%DOMAIN%%
替换为与 Common Name
相同的名称。更多信息 here and over here。请注意,通常您会将 Common Name
和 %%DOMAIN%%
设置为您尝试为其生成证书的域。因此,如果它是 www.mysupersite.com
,那么您将同时使用它。
v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = %%DOMAIN%%
注意:解决此问题的脚本,以及 create fully trusted ssl certs for use in Chrome, Safari and from Java clients can be found here
另一个注意事项:如果你想做的只是阻止chrome在查看自己时抛出错误签名证书,您可以告诉 Chrome 通过使用特殊的命令行选项 as detailed here on SuperUser
启动它来忽略所有站点的所有 SSL 错误
我能够通过更改 v3.ext 文件
的 DNS.1 值来摆脱 (net::ERR_CERT_AUTHORITY_INVALID)
[alt_names]
DNS.1 = domainname.com
将 domainname.com 更改为您自己的域。
我简单地使用-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 以生成证书,而无需提示。
问题
正如其他人所提到的,出现 NET::ERR_CERT_COMMON_NAME_INVALID
错误是因为生成的证书不包含 SAN (subjectAltName
) 字段。
RFC2818 has deprecated falling back to the commonName
field since May of 2000. The use of the subjectAltName
field has been enforced in Chrome since version 58 (see Chrome 58 deprecations).
OpenSSL 接受 x509v3 configuration files to add extended configurations to certificates (see the subjectAltName 配置选项字段).
Bash 脚本
我创建了一个 self-signed-tls bash script,其中包含简单的选项,以便轻松生成证书颁发机构并使用 OpenSSL 签署 x509 证书(在 Chrome 中使用 subjectAltName
字段).
该脚本将指导您完成一系列问题以包含必要的信息(包括 subjectAltName
字段)。您可以参考 README.md 了解更多详细信息和自动化选项。
确保在安装新证书后重新启动chrome。
chrome://restart
其他资源
- Docker 文档有一个 great straightforward example 用于创建自签名证书颁发机构和使用 OpenSSL 签署证书。
- cfssl 也是一个非常强大的工具,被广泛使用,值得一试。
- mkcert 是一个用 GoLang 编写的工具。看起来简单易用,非常适合本地开发。
以下解决方案对我有用 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
于 MAC
从 chrome 版本 67.0.3396.99 开始,我的自签名证书停止工作。
重新生成此处所写的所有内容均无效。
更新
今天有机会确认我的方法有效 :)。如果它对您不起作用,请确保您使用的是这种方法
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>
$
更新结束
只有当从系统中删除我的证书并添加[=39时,才最终能够看到绿色安全=] 它到 local 钥匙串。 (如果有的话 - 先放下它)。 不确定它是否重要,但就我而言,我通过 chrome 下载了证书,并验证了创建日期是今天 - 所以这是我刚刚创建的。
希望它会对花一天时间的人有所帮助。
永不更新chrome!
在您的主目录中复制您的 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 Phone 或平板电脑上下载证书进行安装。现在 Chrome 将信任 windows 和 Android 上的证书。
在 windows 开发箱上获得 openssl.exe 的最佳位置来自 "c:\Program Files\Git\usr\bin\openssl.exe"
我在 macos/Chrome 上获取自签名证书时遇到了很多问题。终于找到Mkcert了,"A simple zero-config tool to make locally trusted development certificates with any names you'd like." https://github.com/FiloSottile/mkcert
如果您想 运行 您的服务器本地主机,您需要设置 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
2021 年 6 月更新 - Windows 10 - Chrome v91 答案是 here
最近,Chrome 停止使用我的自签名 SSL 证书,并认为它们不安全。当我查看 DevTools | Security
选项卡中的证书时,我可以看到上面写着
Subject Alternative Name Missing The certificate for this site does not contain a Subject Alternative Name extension containing a domain name or IP address.
Certificate Error There are issues with the site's certificate chain (net::ERR_CERT_COMMON_NAME_INVALID).
我该如何解决这个问题?
要解决此问题,您需要在创建证书时向 openssl
提供一个额外的参数,基本上
-sha256 -extfile v3.ext
其中 v3.ext
是这样的文件,其中 %%DOMAIN%%
替换为与 Common Name
相同的名称。更多信息 here and over here。请注意,通常您会将 Common Name
和 %%DOMAIN%%
设置为您尝试为其生成证书的域。因此,如果它是 www.mysupersite.com
,那么您将同时使用它。
v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = %%DOMAIN%%
注意:解决此问题的脚本,以及 create fully trusted ssl certs for use in Chrome, Safari and from Java clients can be found here
另一个注意事项:如果你想做的只是阻止chrome在查看自己时抛出错误签名证书,您可以告诉 Chrome 通过使用特殊的命令行选项 as detailed here on SuperUser
启动它来忽略所有站点的所有 SSL 错误我能够通过更改 v3.ext 文件
的 DNS.1 值来摆脱 (net::ERR_CERT_AUTHORITY_INVALID)[alt_names] DNS.1 = domainname.com
将 domainname.com 更改为您自己的域。
我简单地使用-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 以生成证书,而无需提示。
问题
正如其他人所提到的,出现 NET::ERR_CERT_COMMON_NAME_INVALID
错误是因为生成的证书不包含 SAN (subjectAltName
) 字段。
RFC2818 has deprecated falling back to the commonName
field since May of 2000. The use of the subjectAltName
field has been enforced in Chrome since version 58 (see Chrome 58 deprecations).
OpenSSL 接受 x509v3 configuration files to add extended configurations to certificates (see the subjectAltName 配置选项字段).
Bash 脚本
我创建了一个 self-signed-tls bash script,其中包含简单的选项,以便轻松生成证书颁发机构并使用 OpenSSL 签署 x509 证书(在 Chrome 中使用 subjectAltName
字段).
该脚本将指导您完成一系列问题以包含必要的信息(包括 subjectAltName
字段)。您可以参考 README.md 了解更多详细信息和自动化选项。
确保在安装新证书后重新启动chrome。
chrome://restart
其他资源
- Docker 文档有一个 great straightforward example 用于创建自签名证书颁发机构和使用 OpenSSL 签署证书。
- cfssl 也是一个非常强大的工具,被广泛使用,值得一试。
- mkcert 是一个用 GoLang 编写的工具。看起来简单易用,非常适合本地开发。
以下解决方案对我有用 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
于 MAC 从 chrome 版本 67.0.3396.99 开始,我的自签名证书停止工作。
重新生成此处所写的所有内容均无效。
更新
今天有机会确认我的方法有效 :)。如果它对您不起作用,请确保您使用的是这种方法
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>
$
更新结束
只有当从系统中删除我的证书并添加[=39时,才最终能够看到绿色安全=] 它到 local 钥匙串。 (如果有的话 - 先放下它)。 不确定它是否重要,但就我而言,我通过 chrome 下载了证书,并验证了创建日期是今天 - 所以这是我刚刚创建的。
希望它会对花一天时间的人有所帮助。
永不更新chrome!
在您的主目录中复制您的 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 Phone 或平板电脑上下载证书进行安装。现在 Chrome 将信任 windows 和 Android 上的证书。
在 windows 开发箱上获得 openssl.exe 的最佳位置来自 "c:\Program Files\Git\usr\bin\openssl.exe"
我在 macos/Chrome 上获取自签名证书时遇到了很多问题。终于找到Mkcert了,"A simple zero-config tool to make locally trusted development certificates with any names you'd like." https://github.com/FiloSottile/mkcert
如果您想 运行 您的服务器本地主机,您需要设置 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
2021 年 6 月更新 - Windows 10 - Chrome v91 答案是 here