文章目录
提醒:本文最后更新于1732天前,文中所描述的信息可能已发生改变,请谨慎使用。
在最近几年里Chrome访问网站失败:ERR_CONNECTION_CLOSED 错误,我写了很多有关 HTTPS 和 HTTP/2 的文章,涵盖了证书申请、Nginx 编译及配置、性能优化等方方面面。在这些文章的评论中,不少读者提出了各种各样的问题,我的邮箱也经常收到类似的邮件。本文用来罗列其中有代表性、且我知道解决方案的问题。
为了控制篇幅,本文尽量只给出结论和引用链接,不展开讨论,如有疑问或不同意见,欢迎留言讨论。本文会持续更新,欢迎大家贡献自己遇到的问题和解决方案。
实际上,遇到任何有关部署 HTTPS 或 HTTP/2 的问题,都推荐先用 SSL Labs's SSL Test 跑个测试,大部分问题都能被诊断出来。
申请 Let's 证书时,一直无法验证通过
这类问题一般是因为 Let's 无法访问你的服务器,推荐尝试 acme.sh 的 ,一般都能解决。
网站无法访问,提示
使用 53 访问使用 证书的网站,很可能会出现这个错误提示。这个问题由 的某个 Bug 引起,目前最好的解决方案是升级到 最新版。相关链接:
浏览器提示证书有错误检查证书链是否完整
首先确保网站使用的是合法 CA 签发的有效证书,其次检查 Web 配置中证书的完整性(一定要包含站点证书及所有中间证书)。如果缺失了中间证书,部分浏览器能够自动获取但严重影响 TLS 握手性能;部分浏览器直接报证书错误。
What's My Chain Cert? 这个网站可以用来检查证书链是否完整,它还可以用来生成正确的证书链。
检查浏览器是否支持 SNI
如果只有老旧浏览器(例如 IE8 on XP)提示这个错误,多半是因为你的服务器同时部署了使用不同证书的多个 HTTPS 站点,这样,不支持 SNI( Name )的浏览器通常会获得错误的证书,从而无法访问。
要解决浏览器不支持 SNI 带来的问题Chrome访问网站失败:ERR_CONNECTION_CLOSED 错误,可以将使用不同证书的 HTTPS 站点部署在不同服务器上;还可以利用 SAN( Name)机制将多个域名放入同一张证书;当然你也可以直接无视这些老旧浏览器。特别地,使用不支持 SNI 的浏览器访问商业 HTTPS CDN,基本都会因为证书错误而无法使用。
有关 SNI 的更多说明,请看「」。
检查系统时间
如果用户电脑时间不对,也会导致浏览器提示证书有问题,这时浏览器一般都会有明确的提示,例如 的 D。
启用 HTTP/2 后网站无法访问,提示
这个问题一般是由于 配置有误造成的。建议对照「、 使用的配置」等权威配置修改 Nginx 的 配置项。
有关这个问题的具体原因,请看「从启用 HTTP/2 导致网站无法访问说起」。
网站无法访问,提示
出现这种错误,通常都是配置了不安全的 SSL 版本或者 —— 例如服务器只支持 SSLv3,或者 只配置了 RC4 系列,使用 访问就会得到这个提示。解决方案跟上一节一样。
还有一种情况会出现这种错误 —— 使用不支持 ECC 的浏览器访问只提供 ECC 证书的网站。例如在 XP 中,使用 ECC 证书的网站只有 能访问( 的 TLS 自己实现,不依赖操作系统); 平台中,也需要 4+ 才支持 ECC 证书。
针对不支持 ECC 证书的浏览器,有一个完美的解决方案,请看「开始使用 ECC 证书」。
在 Nginx 启用 HTTP/2 后,浏览器依然使用 HTTP/1.1
51+ 移除了对 NPN 的支持,只支持 ALPN,而浏览器和服务端都支持 NPN 或 ALPN,是用上 HTTP/2 的大前提。换句话说,如果服务端不支持 ALPN, 51+ 无法使用 HTTP/2。
1.0.2 才开始支持 ALPN —— 很多主流服务器系统自带的 都低于这个版本,所以推荐在编译 Web 时自己指定 的位置。
详见「为什么我们应该尽快支持 ALPN」。
评论留言