111

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

缺少主题备用名称 此站点的证书不包含包含域名或 IP 地址的主题备用名称扩展。

证书错误 站点的证书链 (net::ERR_CERT_COMMON_NAME_INVALID) 存在问题。

我怎样才能解决这个问题?

4

11 回答 11

113

要解决此问题,您需要openssl在创建证书时提供一个额外的参数,基本上

-sha256 -extfile v3.ext

v3.ext像这样的文件在哪里,%%DOMAIN%%替换为与Common Name. 更多信息在这里在这里。请注意,通常您会将Common Nameand设置%%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%%

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

另一个注意事项:如果您想要做的只是在查看自签名证书时阻止 chrome 抛出错误,您可以通过使用特殊的命令行选项启动 Chrome 来告诉 Chrome 忽略所有站点的所有 SSL 错误,如此处详述在超级用户上

于 2017-04-27T18:17:51.410 回答
41

以下解决方案在 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
于 2018-04-06T12:00:18.200 回答
26

问题

正如其他人所提到的,NET::ERR_CERT_COMMON_NAME_INVALID发生错误是因为生成的证书不包含 SAN ( subjectAltName) 字段。

自 2000 年 5 月以来, RFC2818已弃用回退到该字段。自版本 58 以来,Chrome 已强制commonName使用该字段(请参阅Chrome 58 deprecationssubjectAltName

OpenSSL 接受x509v3 配置文件以向证书添加扩展配置(有关配置选项,请参阅subjectAltName字段)


Bash 脚本

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

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

请务必在安装新证书后重新启动 chrome。

chrome://restart

其他资源

  • Docker 文档有一个非常简单的示例,用于创建自签名证书颁发机构和使用 OpenSSL 签署证书。
  • cfssl也是一个非常强大的工具,被广泛使用,值得一试。
  • mkcert是一个用 GoLang 编写的工具。它似乎易于使用并且非常适合本地开发。
于 2017-09-15T16:13:58.443 回答
4

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

于 2019-12-06T00:48:52.257 回答
4

我只是使用-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 以生成证书而无需提示。

于 2017-07-26T17:53:17.163 回答
3
  • 在主目录中复制 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

于 2019-06-10T17:20:32.313 回答
2

这是创建 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”

于 2019-10-02T22:41:08.060 回答
1

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

[alt_names] DNS.1 = domainname.com

将 domainname.com 更改为您自己的域。

于 2017-05-16T11:51:51.210 回答
0

2021 年 6 月更新 - Windows 10 - Chrome v91答案在这里

于 2021-06-06T03:13:13.787 回答
0

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

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

结束更新

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

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

永远不要更新chrome!

于 2018-07-02T20:55:29.787 回答
-1

如果要运行服务器 localhost,则需要设置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
于 2020-08-09T04:06:57.187 回答