Invalid self signed SSL cert - "Subject Alternative Name Missing"

最近,Chrome 已经停止使用我自己签名的 SSL 证书,并认为它们是不安全的。当我查看 DevTools | Security选项卡中的 cert 时,我可以看到它说

缺少主题替代名称此网站的证书 不包含包含域的主题替代名称扩展名 名称或 IP 地址。

网站的证书链有问题 (net: : ERR _ CERT _ COMMON _ NAME _ INVALID).

我该怎么补救?

219682 次浏览

为了解决这个问题,您需要在创建 cert 时为 openssl提供一个额外的参数

-sha256 -extfile v3.ext

其中 v3.ext是这样一个文件,将 %%DOMAIN%%替换为与 Common Name相同的名称。更多信息 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%%

注意: 解决此问题的脚本和 可以在这里找到在 Chrome、 Safari 和 Java 客户端中使用的完全可信的 ssl 证书

另一个注意事项 : 如果你所做的只是在浏览自签名证书时阻止 Chrome 抛出错误,你可以通过一个特殊的命令行选项来告诉 Chrome 忽略所有站点的所有 SSL 错误,< a href = “ https://SuperUser.com/a/1036062/38941”> 详见 SuperUser

通过更改 v3.ext 文件的 DNS.1值,我可以去掉(net: : ERR _ CERT _ AUTHORITY _ INVALID)

[ alt _ name ] 1 = domainname.com

Change domainname.com with your own domain.

我只是使用 -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,以便在不提示的情况下生成证书。

问题

正如其他人所提到的,由于生成的证书不包括 SAN (subjectAltName)字段,因此出现了 NET::ERR_CERT_COMMON_NAME_INVALID错误。

自2000年5月以来,RFC2818 一直反对回到 commonName领域。从58(参见: “ https://developers.google.com/web/update/2017/03/Chrome-58-depreations # move _ support _ for _ commname _ match _ in _ securities”rel = “ nofollow norefrer”> Chrome 58 depreations )版本开始,Chrome 就强制使用 subjectAltName字段。

OpenSSL 接受 X509v3配置文件为证书 (参见 < a href = “ https://www.openssl.org/docs/manmaster/man5/x509v3 _ config.html # Subject-Alternative-Name”rel = “ nofollow noReferrer”> subjectAltName 字段中的配置选项)添加扩展配置。


Bash Script

我创建了一个带有简单选项的 自签名 tls bash 脚本,以便于生成证书颁发机构和使用 OpenSSL(在 Chrome 中使用 subjectAltName字段有效)签署 x509证书。

该脚本将引导您通过一系列的问题,包括必要的信息 (包括 subjectAltName字段)。您可以参考 README.md了解更多细节和自动化选项。

请确保在安装新证书后重新启动 chrome。

chrome://restart

其他资源

  • Docker 文档有一个用于创建自签名证书颁发机构和使用 OpenSSL 签名证书的 直截了当的例子
  • Cfssl 也是一个非常健壮的工具,被广泛使用,值得一试。
  • mkcert is a tool written in GoLang. It seems simple to use and great for local development.

以下解决方案为我工作的铬65(裁判)-

创建一个 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 Version 67.0.3396.99开始,我的自签名证书停止工作。

regeneration with all what written here didn't work.

UPDATE

有机会证实我的方法今天是有效的:)。如果它不适合你,确保你正在使用这种方法

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>
$

从这里复制的 Https://ksearch.wordpress.com/2017/08/22/generate-and-import-a-self-signed-ssl-certificate-on-mac-osx-sierra/

END UPDATE

最后能够看到绿色安全只有当 removed我的证书从 系统,和 补充它到 本地钥匙链。(如果有一个-先放下它)。不知道这是否重要,但在我的情况下,我通过 chrome 下载证书,并验证创建日期是今天-所以这是我刚刚创建的一个。

希望对花一天时间在上面的人有所帮助。

永远不要更新 chrome!

  • 在主目录中复制一份 OpenSSL 配置:

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

    或者在 Linux 上:

    cp /etc/ssl/openssl.cnf ~/openssl-temp.cnf
    
  • Add Subject Alternative Name to openssl-temp.cnf, under [v3_ca]:

    [ v3_ca ]
    subjectAltName = DNS:localhost
    

    Replace localhost by the domain for which you want to generate that certificate.

  • 生成证书:

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -config ~/openssl-temp.cnf
    -keyout /path/to/your.key -out /path/to/your.crt
    

You can then delete openssl-temp.cnf

这里有一个非常简单的方法来创建一个 Chrome 信任的 IP 证书。

The ssl.conf file...

[ 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 dev box 中,获取 openssl.exe 的最佳位置是“ c: Program Files Git usr bin openssl.exe”

在 macos/Chrome 上获得自签名证书有很多问题。最后,我找到了 Mkcert,“一个简单的零配置工具,用于制作具有您想要的任何名称的本地可信开发证书。”https://github.com/FiloSottile/mkcert

如果要运行服务器本地主机,则需要设置 CN = localhostDNS.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 答案是 < a href = “ https://stackoverflow. com/a/67855484/3009639”>