无效的自签名SSL证书 - "主题备用名称丢失"

Bra*_*rks 85 ssl https google-chrome pkix

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

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

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

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

Bra*_*rks 96

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

-sha256 -extfile v3.ext

v3.ext是一个像这样的文件,%%DOMAIN%%替换为您用作您的相同名称Common Name.更多信息在这里这里.请注意,通常您将设置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%%
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我得到`未知选项-extfile`.我该如何解决? (30认同)
  • 不确定您正在使用哪个版本的XAMPP,但如果您在该文件中查找包含"openssl x509"的行,则应该能够将上述内容添加到文件中该行的末尾.例如,这个版本的[makecert.bat](https://sourceforge.net/p/xampp/code/HEAD/tree/win32/xampp/apache/makecert.bat#l9)在第9行有它,最终将成为:`bin\openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 -sha256 -extfile v3.ext`.当然,你仍然需要将`v3.ext`保存到同一文件夹中的文件中. (2认同)
  • @NickManning - 也许您在错误的 openssl 命令中使用了 `extfile` 指令?它不是在 `openssl req -new ...` 中使用,而是在 `openssl x509 -req ...` 中使用。至少[这里有人说](https://www.devside.net/wamp-server/generating-and-installing-wildcard-and-multi-domain-ssl-certificates),从[示例我有另一个关于如何完全生成这些证书的类似问题的答案](/sf/answers/3056640191/) (2认同)
  • "为openssl提供额外的参数"具体到哪个命令?涉及多个步骤,这个答案太模糊了:https://www.ibm.com/support/knowledgecenter/en/SSWHYP_4.0.0/com.ibm.apimgmt.cmc.doc/task_apionprem_gernerate_self_signed_openSSL.html (2认同)

Ans*_*hul 25

以下解决方案为我在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
Run Code Online (Sandbox Code Playgroud)

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

openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
 -keyout cert.key -out cert.pem -config req.cnf -sha256
Run Code Online (Sandbox Code Playgroud)

  • 这很棒!正是我所需要的,它也跳过了诸如公司名称和州之类的烦人提示。 (2认同)
  • 我尝试了一些替代解决方案,但这是唯一对我有用的解决方案。谢谢!! (2认同)

Log*_*gan 16

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

self-signed-tls bash脚本

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


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

cfssl

  • 您应该在此处添加脚本并对其进行解释。 (2认同)
  • 看起来剧本不错。但是脚本并不能(直接)提供OP问题的真正答案。也许也解释一下他的问题是什么。 (2认同)

AQu*_*rky 6

这是创建 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
Run Code Online (Sandbox Code Playgroud)

当然,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
Run Code Online (Sandbox Code Playgroud)

在 Windows 上,将证书导入到所有客户端计算机上的受信任根证书存储中。在 Android 手机或平板电脑上下载证书进行安装。现在 Chrome 将信任 Windows 和 Android 上的证书。

在 Windows 开发盒上,获取 openssl.exe 的最佳位置是“c:\Program Files\Git\usr\bin\openssl.exe”