关于谷歌浏览器:无效的自签名SSL证书 – “主题备用名称丢失”

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的相同名称。更多信息在这里和这里。请注意,通常您将Common Name%%DOMAIN%%设置为您尝试为其生成证书的域。所以,如果它是www.mysupersite.com,那么你就可以使用它。

v3.ext

1
2
3
4
5
6
7
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = %%DOMAIN%%

注意:可以在此处找到解决此问题的脚本,并创建用于Chrome,Safari和Java客户端的完全受信任的ssl证书

另一个注意事项:如果你想要做的就是在查看自签名证书时阻止chrome抛出错误,你可以通过一个特殊的命令行选项告诉Chrome忽略所有站点的所有SSL错误,详见此处在SuperUser上


以下解决方案为我在chrome 65(ref)上工作 -

创建一个OpenSSL配置文件(例如:req.cnf)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[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

创建引用此配置文件的证书

1
2
openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
 -keyout cert.key -out cert.pem -config req.cnf -sha256


我创建了一个bash脚本,以便更轻松地生成在Chrome中有效的自签名TLS证书。

self-signed-tls bash script

安装证书后,请确保重新启动chrome(chrome://restart)。在Chrome 65.x上测试它仍然有效。

值得一试的另一个(更强大的)工具是CloudFlare的cfssl工具包:

cfssl


我只是使用-subj参数添加机器的ip地址。所以只用一个命令解决了。

1
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配置的副本:

    1
    cp /System/Library/OpenSSL/openssl.cnf ~/openssl-temp.cnf

    或者在Linux上:

    1
    cp /etc/ssl/openssl.cnf ~/openssl-temp.cnf
  • [v3_ca]下将主题备用名称添加到openssl-temp.cnf

    1
    2
    [ v3_ca ]
    subjectAltName = DNS:localhost

    localhost替换为要为其生成该证书的域。

  • 生成证书:

    1
    2
    3
    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


在MAC上
从chrome版本67.0.3396.99开始,我的自签名证书停止工作。

所有写在这里的东西再生都没有用。

UPDATE

有机会确认我的方法今天有效:)。如果它不起作用,请确保您使用此方法

1
2
3
4
5
6
7
8
9
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>
$

从这里复制
Generate and import a Self-Signed SSL certificate on Mac OS X Sierra

结束更新

最后只有在从系统中删除我的证书时才能看到绿色安全,并将其添加到本地钥匙串。 (如果有的话 - 首先丢弃它)。不确定它是否匹配,但在我的情况下,我通过chrome下载了证书,并确认创建日期是今天 - 所以它是我刚创建的那个。

希望有人花一天时间来帮助它。

永远不会更新铬!


通过更改v3.ext文件的DNS.1值,我能够摆脱(net :: ERR_CERT_AUTHORITY_INVALID)

[alt_names]
DNS.1 = domainname.com

使用您自己的域名更改domainname.com。