HTTPS 常见部署问题及解决方案

在最近几年里,我写了很多有关 HTTPS 和 HTTP/2 的文章,涵盖了证书申请、Nginx 编译及配置、性能优化等方方面面。在这些文章的评论中,不少读者提出了各种各样的问题,我的邮箱也经常收到类似的邮件。本文用来罗列其中有代表性、且我知道解决方案的问题。

为了控制篇幅,本文尽量只给出结论和引用链接,不展开讨论,如有疑问或不同意见,欢迎留言讨论。本文会持续更新,欢迎大家贡献自己遇到的问题和解决方案。

实际上,遇到任何有关部署 HTTPS 或 HTTP/2 的问题,都推荐先用 Qualys SSL Labs‘s SSL Server Test 跑个测试,大部分问题都能被诊断出来。

申请 Let‘s Encrypt 证书时,一直无法验证通过

这类问题一般是因为 Let‘s Encrypt 无法访问你的服务器,推荐尝试 acme.sh 的 DNS 验证模式,一般都能解决。

网站无法访问,提示 ERR_CERTIFICATE_TRANSPARENCY_REQUIRED

使用 Chrome 53 访问使用 Symantec 证书的网站,很可能会出现这个错误提示。这个问题由 Chrome 的某个 Bug 引起,目前最好的解决方案是升级到 Chrome 最新版。相关链接:

浏览器提示证书有错误

检查证书链是否完整

首先确保网站使用的是合法 CA 签发的有效证书,其次检查 Web Server 配置中证书的完整性(一定要包含站点证书及所有中间证书)。如果缺失了中间证书,部分浏览器能够自动获取但严重影响 TLS 握手性能;部分浏览器直接报证书错误。

检查浏览器是否支持 SNI

如果只有老旧浏览器(例如 IE8 on Windows XP)提示这个错误,多半是因为你的服务器同时部署了使用不同证书的多个 HTTPS 站点,这样,不支持 SNI(Server Name Indication)的浏览器通常会获得错误的证书,从而无法访问。

要解决浏览器不支持 SNI 带来的问题,可以将使用不同证书的 HTTPS 站点部署在不同服务器上;还可以利用 SAN(Subject Alternative Name)机制将多个域名放入同一张证书;当然你也可以直接无视这些老旧浏览器。特别地,使用不支持 SNI 的浏览器访问商业 HTTPS CDN,基本都会因为证书错误而无法使用。

有关 SNI 的更多说明,请看「关于启用 HTTPS 的一些经验分享(二)」。

检查系统时间

如果用户电脑时间不对,也会导致浏览器提示证书有问题,这时浏览器一般都会有明确的提示,例如 Chrome 的 ERR_CERT_DATE_INVALID。

启用 HTTP/2 后网站无法访问,提示 ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY

这个问题一般是由于 CipherSuite 配置有误造成的。建议对照「Mozilla 的推荐配置CloudFlare 使用的配置」等权威配置修改 Nginx 的ssl_ciphers 配置项。

有关这个问题的具体原因,请看「从启用 HTTP/2 导致网站无法访问说起」。

网站无法访问,提示 ERR_SSL_VERSION_OR_CIPHER_MISMATCH

出现这种错误,通常都是配置了不安全的 SSL 版本或者 CipherSuite —— 例如服务器只支持 SSLv3,或者 CipherSuite 只配置了 RC4 系列,使用 Chrome 访问就会得到这个提示。解决方案跟上一节一样。

还有一种情况会出现这种错误 —— 使用不支持 ECC 的浏览器访问只提供 ECC 证书的网站。例如在 Windows XP 中,使用 ECC 证书的网站只有 Firefox 能访问(Firefox 的 TLS 自己实现,不依赖操作系统);Android 平台中,也需要 Android 4+ 才支持 ECC 证书。如果是这种情况,有一个比较完美的解决方案,请看「开始使用 ECC 证书」。

在 Nginx 启用 HTTP/2 后,浏览器依然使用 HTTP/1.1

Chrome 51+ 移除了对 NPN 的支持,只支持 ALPN,而浏览器和服务端都支持 NPN 或 ALPN,是用上 HTTP/2 的大前提。换句话说,如果服务端不支持 ALPN,Chrome 51+ 无法使用 HTTP/2。

OpenSSL 1.0.2 才开始支持 ALPN —— 很多主流服务器系统自带的 OpenSSL 都低于这个版本,所以推荐在编译 Web Server 时自己指定 OpenSSL 的位置。

详见「为什么我们应该尽快支持 ALPN」。

升级到 HTTPS 后,网站部分资源不加载或提示不安全

记住一个原则:HTTPS 网站的所有外链资源(CSS、JS、图片、音频、字体文件、异步接口、表单 action 地址等等)都需要升级为 HTTPS,就不会遇到这个问题了。

详见「关于启用 HTTPS 的一些经验分享(三)」。

仅 Safari、iOS 各种浏览器无法访问

如果你的 HTTPS 网站用 PC Chrome 和 Firefox 访问一切正常,但 macOS Safari 和 iOS 各种浏览器无法访问,有可能是 Certificate Transparency 配置有误。当然,如果你之前没有通过 TLS 扩展启用 Certificate Transparency,请跳过本小节。

具体症状是:通过 Wireshark 抓包分析,通常能看到名为 Illegal Parameter 的 Alert 信息;通过 curl -v 排查,一般能看到 Unknown SSL protocol error in connection 错误提示。

这时候,请进入 Nginx ssl_ct_static_scts 配置指定的目录,检查 SCT 文件大小是否正常,尤其要关注是否存在空文件。

需要注意的是,根据官方公告,从 2016 年 12 月 1 日开始,Google 的 Aviator CT log 服务将不再接受新的证书请求。用 ct-submit 等工具手动获取 SCT 文件时,不要再使用 Aviator 服务,否则就会得到空文件。

本文链接:https://imququ.com/post/troubleshooting-https.html参与评论 »

--EOF--

发表于 2016-12-12 23:50:26,并被添加「NginxHTTPSHTTP2」标签,最后修改于 2016-12-25 15:26:07。查看本文 Markdown 版本 »

本站使用「署名 4.0 国际」创作共享协议,相关说明 »

专题「Web 服务器」的其他文章 »

时间: 2024-12-16 09:47:59

HTTPS 常见部署问题及解决方案的相关文章

HTTPS部署常见的问题及解决方案详解

本文和大家分享的主要是HTTPS常见的部署问题及相应的解决方案,希望通过本文的分享能帮助大家更好的学习https相关知识,一起来看看吧. 实际上,遇到任何有关部署 HTTPS 或 HTTP/2 的问题,都推荐先用 Qualys SSL Labs's SSL Server Test 跑个测试,大部分问题都能被诊断出来. 申请 Let's Encrypt 证书时,一直无法验证通过 这类问题一般是因为 Let's Encrypt 无法访问你的服务器,推荐尝试 acme.sh 的 DNS 验证模式 ,一

“500 oops socket” Debian 9 running via Linux Deploy上成功部署vsftpd的解决方案(201901原创)【成功完美简单极致】

"500 oops socket" Debian 9 running via Linux Deploy上成功部署vsftpd的解决方案(201901原创)[成功完美简单极致] #自从手机root后安装Linux Deploy开始安装了Debian9开始准备鼓捣ftp服务器(vsftpd). apt install vsftpd #之后整整一个月百度而来的猛如虎的各种操作各种坑, #且不说修改vsftpd.conf的各种参数, #下载源码修改编译,安装gdb调试,通过网络教程禁用子进程改

SCRIPT5009: “Sys”未定义 部署.net ajax 解决方案

今天在部署asp.net ajax 的时候发现部署服务器的时候,ajax刷新不正确,开始以为是System.Web.Extensions没有引用到本地,baidu一圈发现(最近google上不了郁闷~~准备翻墙),都是改正webconfig文件若干,现记录解决方案,服务器环境windows server 2008 R2 +iis7.5 +.net4.0 1.inetmgr-〉找到对应的website,.net 映射程序,*.axd没有.net 4.0的对应项,添加之 2.重起整个应用程序连接池,

android studio 在线更新android sdk,遇到无法Fetching https://dl-ssl.google.com/...的解决方案

最近实在受不了eclipse的"迟钝",准备入手Android studio开发环境,但是貌似不太顺利,成功安装了Android studio,在线更新Android adk的时候,总是遇到如下错误: Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml Failed to fetch URL https://dl-ssl.google.com/android/repository/addons_

sharepoint 2013 部署步骤“添加解决方案”中出现错误: 已在此服务器场中安装 ID 为{guid}的功能。请使用强制属性显式地重新安装此功能。

在部署sharepoint 2013解决方案wsp包时,出现一个错误: 部署步骤"添加解决方案"中出现错误: 已在此服务器场中安装 ID 为 735efe4e-8b50-4310-b588-c6ae2ba0759f 的功能.请使用强制属性显式地重新安装此功能. 英文报错如下: Error occurred in deployment step 'Add Solution': A feature with ID {Guid} has already been installed in t

Eclipse部署Web项目时常见的错误和解决方案

Tomcat部署Web项目到tomcat 在eclipse中找到Servers项,打开服务器(F3)(建议直接删除服务器,重新建立再设置比较好)1.Servers Locations 中选择Use Tomcat installation 2.Deploy path 改成 webapps这时候在eclipse上直接运行项目,就会自动部署到tomcat上,通过浏览器或者eclipse都可以访问该项目. Tomcat控制台的用户角色配置 在Tomcat的Mapper App中,默认没有提供控制台角色.

前端常见的跨域解决方案

什么是跨域: 一个域名下的文档或者脚本试图请求另外一个域名的下的资源 广义的跨域: 资源跳转:a链接.重定向.表单提交 资源嵌入:<link> <script>  <img>等dom标签 脚本请求:js发起的ajax请求,dom和js的跨域操作 其实就是浏览器的同源策略导限制的一类请求场景 什么是同源策略: 他是浏览器最核心的安全功能,所谓的同源策略就是:协议+域名+端口,三者相同,即便两个相同的不同的域名指向相同的ip,也非同源 同源测略限制了以下几种行为: cook

分布式事务中常见的三种解决方案

目录 一.分布式事务前奏 二.柔性事务解决方案架构 (一).基于可靠消息的最终一致性方案概述 (二).TCC事务补偿型方案 (三).最大努力通知型 三.基于可靠消息的最终一致性方案详解 (一).消息发送一致性 (二).保证消息一致的变通做法 (三).常规MQ消息处理流程和特点 (四).消息重复发送问题和业务接口幂等性设计 (五).本地消息服务方案 (六).独立消息服务方案 (七).消息服务子系统的设计实现 一.分布式事务前奏 事务:事务是由一组操作构成的可靠的独立的工作单元,事务具备ACID的特

tomcat7下对HTTPS的部署配置

1.申请CA证书,可以在腾讯云或者阿里云申请到免费的CA,不过前提是,你要有太服务器和域名,并且解析过域名. 2.下载申请到的CA证书到本地,在tomcat7上进行相关配置. 3.Tomcat 证书部署 3.1 获取证书 如果申请证书时有填写私钥密码,下载可获得Tomcat文件夹,其中有密钥库 www.domain.com.jks:如果没有填写私钥密码,不提供Tomcat证书文件的下载,需要用户手动转换格式生成. 可以通过 Nginx 文件夹内证书文件和私钥文件生成jks格式证书转换工具:htt