5.3 HTTPS 与 modssl:加密通道与握手优化 本节摘要:HTTPS 给请求的归途加上加密与身份认证的隧道。本节从 TLS 握手的"往返延迟账"讲起——每多一个往返,慢网络用户多等几十上百毫秒;然后给出一套可直接落地的证书配置(证书链、SNI 多站配对、安全协议版本与加密套件)、会话复用与 TLS 1.3 的握手机制改进,最后覆盖证书续期运维与 HTTPS 上线的完整迁移清单。 学习目标 阅读完本节,你应当能够: 描述 TLS 握手的基本流程与延迟构成; 完成证书链配置并解释缺中间证书的故障表现; 配置安全协议版本与加密套件,兼顾安全与兼容; 解释会话复用与 TLS 1.3 各省掉哪个往返; 按清单把存量 HTTP 站点平稳迁到 HTTPS。
本节摘要:HTTPS 给请求的归途加上加密与身份认证的隧道。本节从 TLS 握手的"往返延迟账"讲起——每多一个往返,慢网络用户多等几十上百毫秒;然后给出一套可直接落地的证书配置(证书链、SNI 多站配对、安全协议版本与加密套件)、会话复用与 TLS 1.3 的握手机制改进,最后覆盖证书续期运维与 HTTPS 上线的完整迁移清单。
阅读完本节,你应当能够:
加密不是免费的。TLS 1.2 的完整握手流程:客户端打招呼(带支持的套件与随机数)→ 服务器出示证书、选定套件 → 客户端验证证书、生成密钥材料 → 双方确认。这个交互需要 2 个往返才开始传输应用数据;会话复用(客户端出示上次的会话票据)可省为 1 个;TLS 1.3 把完整握手压到 1 个往返,还支持会话恢复的"零往返"模式。
账有多重?局域网里一个往返不到 1 毫秒,无所谓;跨洲移动网络一个往返 200–300 毫秒,完整握手就是凭空多出半秒到一秒的白屏时间。这解释了后面所有优化动作的动机:要么少一个往返(会话复用、TLS1.3),要么让往返更快(开启 keepalive、OCSP 装订避免客户端额外查询吊销状态)。
需要 mod_ssl。最小而完整的 HTTPS 虚拟主机(承接第 3 章的 SNI 配对逻辑):
Listen 443 <VirtualHost *:443> ServerName www.example.com DocumentRoot /var/www/example SSLEngine on # 证书与私钥:fullchain 必须包含中间证书 SSLCertificateFile /etc/ssl/example/fullchain.pem SSLCertificateKeyFile /etc/ssl/example/privkey.pem # 协议与套件:现代基线 SSLProtocol -all +TLSv1.2 +TLSv1.3 SSLCipherSuite HIGH:!aNULL:!MD5 SSLHonorCipherOrder off # 会话复用参数 SSLSessionCache "shmcb:/var/run/ssl_scache(512000)" SSLSessionCacheTimeout 600 </VirtualHost>
逐块解释设计意图。fullchain 而非只挂域名证书:浏览器验证证书依赖完整的信任链——域名证书由中间证书签发,中间证书再由根证书签发;根证书预装在操作系统里,中间证书必须由服务器随域名证书一起出示。只配域名证书的典型症状是:部分浏览器(自带完整中间证书缓存的)正常,另一部分浏览器报"证书无效",移动端与小程序环境尤其常见——这是新手 HTTPS 故障的第一名。排查与验证:
# 查看实际下发的证书链,域名证书之后应紧跟中间证书 openssl s_client -connect www.example.com:443 -servername www.example.com < /dev/null 2>/dev/null | grep -E "s:|i:" | head -4
协议版本:保留 1.2 是为了老客户端兼容,1.3 是性能主力(下节展开)。HonorCipherOrder off:让客户端优先选择套件,配合 1.3 的安全默认,现代实践倾向尊重客户端(移动端常为省电优化过套件顺序)。会话缓存:同客户端再次连接时出示票据,握手从 2 往返降到 1——上一节的延迟账在这里兑现。
TLS 1.3 带来三件事:握手压到 1 往返(会话恢复可到 0 往返);删掉一批不安全的老算法(协商更干净、更快);密钥交换固定为前向安全的前向保密机制。httpd 侧不需要为 1.3 单独配置,协议列表里带上它即可。
非协议层的握手加速还有两招。OCSP 装订:服务器代替浏览器去查询证书吊销状态并把结果"装订"在握手里,客户端省掉一次额外查询:
SSLUseStapling On SSLStaplingCache "shmcb:/var/run/ocsp(128000)"
会话票据默认随会话缓存开启,注意多机集群里票据密钥要一致(否则负载均衡把用户转到另一台,票据作废又退回完整握手)。
安全响应头在 HTTPS 站点还差最后一块:HSTS——告诉浏览器"本站以后永远用 HTTPS",杜绝第一次被降级劫持的可能:
# 用 headers 模块在 HTTPS 虚拟主机里 Header always set Strict-Transport-Security "max-age=31536000"
上线 HSTS 前确认全站资源都是 HTTPS(包括第三方脚本),否则等于自断退路——浏览器会拒绝任何 http 访问且无法关闭,灰度期建议先设较短的 max-age。
证书有有效期,忘记续期是经典生产事故(症状:全站报证书过期,影响面 100%)。现代做法是自动化续期:Let's Encrypt 一类免费签发机构配 ACME 客户端自动续期,续期后 reload httpd 让新证书生效。验证监控是否覆盖证书到期——到期前告警,别等浏览器替你发现。
存量站点从 HTTP 平迁 HTTPS 的检查清单:

部分客户端报证书无效:九成是缺中间证书,openssl 命令看证书链立刻现形。证书域名不匹配:SNI 配对错(第 3 章的 openssl 带 servername 复现法)。握手失败集中在老客户端:协议版本裁剪过狠,评估是否保留 1.2。随机性握手超时:熵不足(新虚拟机常见)或 MTU 问题导致的握手包被丢,前者补熵源,后者查网络路径。续期后浏览器仍报旧证书:续期成功但没 reload,或 reload 的是配置错误的实例。
💡 一句话记住本节:HTTPS 的全部优化就一句话——把握手的往返次数往少了压,把每个往返的速度往快了赶。
至此归途三道工序齐全。最后一章回到整条流水线:守护它的安全,榨干它的性能。