我已经为localhostCN创建了一个自签名的SSL证书。正如预期的那样,Firefox在最初抱怨后接受了这个证书。然而,Chrome和IE拒绝接受它,即使在将证书添加到Trusted Roots下的系统证书存储之后。尽管当我在Chrome的HTTPS弹出窗口中单击“查看证书信息”时,证书被列为正确安装,但它仍然坚称证书不可信。
我该怎么做才能让Chrome接受证书并停止抱怨?
我已经为localhostCN创建了一个自签名的SSL证书。正如预期的那样,Firefox在最初抱怨后接受了这个证书。然而,Chrome和IE拒绝接受它,即使在将证书添加到Trusted Roots下的系统证书存储之后。尽管当我在Chrome的HTTPS弹出窗口中单击“查看证书信息”时,证书被列为正确安装,但它仍然坚称证书不可信。
我该怎么做才能让Chrome接受证书并停止抱怨?
当前回答
我成功地遵循了凯伦的回答,并得到了托比·J的重要更新,但我不得不做出修改:
创建自签名证书时,必须将新的subjectAltName字段放在v3_ca扩展下,而不是v3_req。我将/etc/ssl/openssl.conf复制到一个临时文件中,然后在[v3_ca]下添加了一行subjectAltName=DNS:*.example.com。然后将该文件传递给cert创建命令,类似于
openssl req -x509 -nodes -newkey rsa:2048 \
-config /tmp/openssl-revised.cfg \
-keyout example.com.key -out example.com.crt
并遵循kellen更新的步骤。
其他回答
更新日期:2020年4月23日
铬团队推荐
https://www.chromium.org/Home/chromium-security/deprecating-powerful-features-on-insecure-origins#TOC-测试强大功能
快速超级简单解决方案
有一个秘密的绕过短语,可以在错误页面中输入,让Chrome不顾安全错误继续运行:这是不安全的(在早期版本的Chrome中,键入baddidea,甚至更早版本的危险)。除非你完全明白为什么需要它,否则不要使用它!
资料来源:
https://chromium.googlesource.com/chromium/src/+/d8fc089b62cd4f8d907acff6fb3f5ff58f168697%5E%21/
(注意,window.atob('dGhpc2lzdW5zYWZl')解析为此isnsafe)
源的最新版本为@https://chromium.googlesource.com/chromium/src/+/refs/heads/master/components/security_interentials/corebrowser/resources/intertial_large.js和window.atob函数可以在js控制台中执行。
有关Chrome团队为何更改旁路短语(第一次)的背景信息:
https://bugs.chromium.org/p/chromium/issues/detail?id=581189
如果所有其他方法都失败(解决方案1)
对于快速一次性,如果“无论如何继续”选项不可用,或者旁路短语也不起作用,这个黑客很好:
通过启用此标志,允许来自本地主机的证书错误(注意,更改标志值后,Chrome需要重新启动):chrome://flags/#allow-不安全的本地主机(并投票赞成答案https://stackoverflow.com/a/31900210/430128作者@Chris)如果要连接的站点是localhost,那么就完成了。否则,设置TCP隧道以在本地侦听端口8090,并连接到端口443上的broken-remote-site.com,确保已安装socat并在终端窗口中运行以下内容:socat tcp侦听:8090,reuseddr,fork tcp:断开远程站点.com:443去https://localhost:8090在浏览器中。
如果所有其他方法都失败(解决方案#2)
类似于“如果所有其他都失败(解决方案#1)”,这里我们使用ngok为本地服务配置代理。因为您可以通过TLS访问ngrok http隧道(在这种情况下,它由ngrok使用有效证书终止),也可以通过非TLS端点访问,所以浏览器不会抱怨证书无效。
下载并安装ngrok,然后通过ngrok.io公开它:
ngrok http https://localhost
ngok将启动并为您提供一个可以连接到的主机名,所有请求都将通过隧道传输回本地计算机。
单击页面上的任意位置并键入BYPASS_SEQUENCE:
BYPASS_SEQUENCE |
Chrome Version |
---|---|
thisisunsafe |
65 - ? |
badidea |
62 - 64 |
danger |
? - 61 |
您不需要查找输入字段,只需键入它即可。这感觉很奇怪,但它有效。我在Mac High Sierra上试过了。
要再次检查他们是否再次更改,请转到最新的Chromium源代码。此时BYPASS_SEQUENCE如下所示:
var BYPASS_SEQUENCE = window.atob('dGhpc2lzdW5zYWZl');
现在他们把它伪装起来了,但要看到真正的BYPASS_SEQUENCE,您可以在浏览器控制台中运行以下行。
console.log(window.atob('dGhpc2lzdW5zYWZl'));
OR
除了键入短语,您还可以在控制台中粘贴代码部分
sendCommand(SecurityInterstitialCommandId.CMD_PROCEED)
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下的“安全”选项卡)中,您应该看到它列在“扩展名”下作为证书主题替代名称:
您确定站点的地址与证书相同吗?我对Chrome和自签名证书也有同样的问题,但最后我发现它对证书上域名的验证非常挑剔(应该如此)。
Chrome没有自己的证书存储,而是使用Windows自己的证书。然而,Chrome不提供将证书导入商店的方法,因此您应该通过IE添加证书。
在Google Chrome中安装证书
在Internet Explorer中安装证书
还可以看看这两种不同的创建自签名证书的方法(我假设您使用的是您没有提到的IIS)。
如何在IIS 7中创建自签名证书
在Mac上,您可以使用Keychain Access实用程序将自签名证书添加到系统密钥链,然后Chrome将接受它。我在这里找到了分步说明:
Google Chrome、Mac OS X和自签名SSL证书
基本上:
双击带有X的锁定图标并将证书图标拖放到桌面,打开此文件(以.cer扩展名结尾);这将打开允许您批准证书的密钥链应用程序。