我已经为localhostCN创建了一个自签名的SSL证书。正如预期的那样,Firefox在最初抱怨后接受了这个证书。然而,Chrome和IE拒绝接受它,即使在将证书添加到Trusted Roots下的系统证书存储之后。尽管当我在Chrome的HTTPS弹出窗口中单击“查看证书信息”时,证书被列为正确安装,但它仍然坚称证书不可信。
我该怎么做才能让Chrome接受证书并停止抱怨?
我已经为localhostCN创建了一个自签名的SSL证书。正如预期的那样,Firefox在最初抱怨后接受了这个证书。然而,Chrome和IE拒绝接受它,即使在将证书添加到Trusted Roots下的系统证书存储之后。尽管当我在Chrome的HTTPS弹出窗口中单击“查看证书信息”时,证书被列为正确安装,但它仍然坚称证书不可信。
我该怎么做才能让Chrome接受证书并停止抱怨?
当前回答
截至2020年3月,在使用Chrome81的MacOSCatalina上,一旦您使用openssl创建了一个有效的证书,上述情况就会发生变化。
首先,我使用Safari浏览了我的网站,并单击了警告页面底部的链接,该链接允许我无论如何访问该网站。这将证书添加到我的Mac Keychain(即Keychain.app)。Safari将允许我查看该页面。Chrome显示证书是可信的,但不允许我查看该页面。我继续收到CERTIFICATE_INVALID错误。
在Keychain中,选择左下角窗格中的“所有项目”。然后搜索本地主机DNS名称(即myhost.example.com)。
双击证书。它将打开证书的编辑对话框。
将“使用此证书时”更改为“始终信任”
这完全违反直觉,因为SSL已经设置为Always Trust,可能是Safari在添加证书时设置的。Chrome只有在我将其全局更改为“始终信任”后才开始工作。当我把它换回来时,它停止了工作。
其他回答
Chrome 58+更新(发布于2017-04-19)
从Chrome 58开始,仅使用commonName识别主机的功能被删除。证书现在必须使用subjectAltName来标识其主机。请参阅此处的进一步讨论和此处的bug跟踪器。在过去,subjectAltName仅用于多主机证书,因此一些内部CA工具不包括这些证书。
如果您的自签名证书在过去运行良好,但突然开始在Chrome 58中生成错误,这就是原因。
因此,无论您使用什么方法来生成自签名证书(或由自签名CA签名的证书),请确保服务器的证书包含具有正确DNS和/或IP条目的subjectAltName,即使它仅适用于单个主机。
对于openssl,这意味着您的openssl配置(Ubuntu上的/etc/ssl/openssl.cnf)对于单个主机应该具有类似于以下内容的内容:
[v3_ca] # and/or [v3_req], if you are generating a CSR
subjectAltName = DNS:example.com
或对于多个主机:
[v3_ca] # and/or [v3_req], if you are generating a CSR
subjectAltName = DNS:example.com, DNS:host1.example.com, DNS:*.host2.example.com, IP:10.1.2.3
在Chrome的证书查看器(已移动到F12下的“安全”选项卡)中,您应该看到它列在“扩展名”下作为证书主题替代名称:
在Mac上,您可以使用Keychain Access实用程序将自签名证书添加到系统密钥链,然后Chrome将接受它。我在这里找到了分步说明:
Google Chrome、Mac OS X和自签名SSL证书
基本上:
双击带有X的锁定图标并将证书图标拖放到桌面,打开此文件(以.cer扩展名结尾);这将打开允许您批准证书的密钥链应用程序。
您确定站点的地址与证书相同吗?我对Chrome和自签名证书也有同样的问题,但最后我发现它对证书上域名的验证非常挑剔(应该如此)。
Chrome没有自己的证书存储,而是使用Windows自己的证书。然而,Chrome不提供将证书导入商店的方法,因此您应该通过IE添加证书。
在Google Chrome中安装证书
在Internet Explorer中安装证书
还可以看看这两种不同的创建自签名证书的方法(我假设您使用的是您没有提到的IIS)。
如何在IIS 7中创建自签名证书
仅适用于本地主机
只需将其粘贴到您的铬中:
chrome://flags/#allow-insecure-localhost
您应该看到突出显示的文本:
允许从本地主机加载的资源的证书无效
单击启用。
其他站点
尝试在窗口的任何位置键入thisisnsafe,浏览器将允许您访问该页面。
-OR-
对于本地自签名证书,可以避免晦涩难懂的命令、专门知识和手动步骤,请尝试从这个答案中选择mkcert。
对于使用NX的带有Angular Micro前端的mac
步骤1:创建自签名根证书
openssl req -x509 -nodes -new -sha256 -days 390 -newkey rsa:2048 -keyout "RootCA.key" -out "RootCA.pem" -subj "/C=de/CN=localhost.local"
openssl x509 -outform pem -in "RootCA.pem" -out "RootCA.crt"
步骤2:定义应包含在证书中的域和子域
为此,只需创建一个名为vhosts_domains.ext的文本文件并插入以下内容:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
DNS.2 = *.mixable.blog.local
DNS.3 = mixable.blog.local
此示例包括域mixeble.blog.local的本地开发环境的子域以及所有子域,如www.mixable.blog.loal或apps.mixeble.blog.local。
步骤3:创建证书
openssl req -new -nodes -newkey rsa:2048 -keyout localhost.key -out localhost.csr -subj "/C=de/ST=State/L=City/O=Organization/CN=localhost.local"
openssl x509 -req -sha256 -days 1024 -in localhost.csr -CA RootCA.pem -CAkey RootCA.key -CAcreateserial -extfile vhosts_domains.ext -out localhost.crt
步骤4:使证书可用于Angular应用程序
nx serve host --open --devRemotes=<app names> --ssl --ssl-key <folder_location>/localhost.key --ssl-cert <folder_location>/localhost.crt
步骤5:将证书从导入添加到macOS密钥链
在chrome上,如果您仍然获得无效证书,则下载证书并添加到密钥链,并使所有证书都可信。