HTTPS 强制升级指南:TLS 1.3 配置与证书链优化
HTTPS 已经成为现代网站的标配,不仅是微信生态的强制要求,也是 Google 搜索排名的重要因素。本文将详细介绍如何配置完善的 HTTPS,包括 TLS 1.3 启用、证书链优化、HSTS、OCSP Stapling 等高级配置。
一、为什么必须启用 HTTPS
- 微信强制要求:未启用 HTTPS 的域名在微信内会被标记为不安全,甚至直接拦截
- SEO 排名提升:Google 自 2014 年起将 HTTPS 作为排名信号
- 数据安全:防止中间人攻击、数据窃听和内容篡改
- 用户信任:浏览器地址栏显示安全锁标志,提升用户信任度
二、TLS 1.3 的优势与配置
TLS 1.3 是 HTTPS 协议的最新版本,相比 TLS 1.2 有以下优势:
- 更快的握手速度:TLS 1.3 握手仅需 1-RTT,TLS 1.2 需要 2-RTT
- 更强的安全性:移除了 MD5、SHA-1、RC4、DES 等弱算法
- 前向保密:所有握手模式默认启用前向保密(PFS)
- 0-RTT 模式:支持会话恢复,已访问过的用户可实现零往返握手
Nginx 配置 TLS 1.3
server {
listen 443 ssl http2;
server_name example.com;
# SSL 证书路径
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# TLS 版本(禁用 TLS 1.0/1.1)
ssl_protocols TLSv1.2 TLSv1.3;
# 加密套件(优先使用 TLS 1.3 套件)
ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
# 会话缓存
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# HSTS(强制 HTTPS)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
}
三、证书链优化
证书链不完整是导致 SSL 检测失败的常见原因。一个完整的证书链包含:
- 服务器证书(Leaf):颁发给您的域名
- 中间证书(Intermediate):连接服务器证书和根证书的桥梁
- 根证书(Root):预装在操作系统和浏览器中的信任锚点
检查证书链完整性
# 使用 OpenSSL 检查证书链
openssl s_client -connect example.com:443 -servername example.com -showcerts
# 检查证书链是否完整(Verify return code 应为 0)
# 如果显示 "Verify return code: 21 (unable to verify the first certificate)"
# 说明证书链不完整,需要配置中间证书
Let's Encrypt 证书链配置
使用 Let's Encrypt 时,证书链文件通常位于:
/etc/letsencrypt/live/example.com/fullchain.pem— 包含服务器证书 + 中间证书/etc/letsencrypt/live/example.com/cert.pem— 仅服务器证书/etc/letsencrypt/live/example.com/chain.pem— 仅中间证书/etc/letsencrypt/live/example.com/privkey.pem— 私钥
在 Nginx 中,应使用 fullchain.pem 作为 ssl_certificate,这样会自动发送完整的证书链。
四、HSTS 配置详解
HSTS(HTTP Strict Transport Security)告诉浏览器在一段时间内强制使用 HTTPS 访问该域名,即使用户输入的是 HTTP 地址。
# HSTS 响应头
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
max-age:HSTS 有效期,单位秒。63072000 = 2 年includeSubDomains:该策略同时应用于所有子域名preload:允许浏览器厂商将该域名加入预加载列表
警告:在启用 HSTS 之前,请确保您的网站已完全支持 HTTPS,否则用户将无法通过 HTTP 访问。
五、OCSP Stapling 配置
OCSP Stapling 允许服务器在 TLS 握手时直接提供证书状态信息,避免客户端单独向 CA 查询,提升握手速度并保护隐私。
# Nginx OCSP Stapling 配置
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
验证 OCSP Stapling 是否生效:
openssl s_client -connect example.com:443 -servername example.com -status | grep "OCSP Response Status"
六、证书自动续期
Let's Encrypt 证书有效期为 90 天,建议设置自动续期:
使用 Certbot 自动续期
# 安装 Certbot
sudo apt install certbot python3-certbot-nginx
# 申请证书(Nginx 插件自动配置)
sudo certbot --nginx -d example.com -d www.example.com
# 测试自动续期
sudo certbot renew --dry-run
# 设置定时任务(每天检查)
echo "0 3 * * * root certbot renew --quiet" | sudo tee -a /etc/crontab
使用 acme.sh 自动续期
# 安装 acme.sh
curl https://get.acme.sh | sh
# 申请证书
~/.acme.sh/acme.sh --issue -d example.com --nginx
# 安装证书到指定路径
~/.acme.sh/acme.sh --install-cert -d example.com --key-file /etc/nginx/ssl/example.com.key --fullchain-file /etc/nginx/ssl/example.com.crt --reloadcmd "systemctl reload nginx"
# acme.sh 会自动创建 cron 任务,无需手动设置
七、SSL 检测与评分
配置完成后,建议使用以下工具检测 SSL 配置:
- DomainPulse SSL 监控:检测证书有效期、证书链、加密套件等
- SSL Labs:https://www.ssllabs.com/ssltest/ — 综合 SSL 评分
- Mozilla SSL Configuration Generator:生成最佳 SSL 配置
八、常见问题排查
1. 证书链不完整
症状:部分浏览器显示证书错误,SSL Labs 评分降低。
解决:确保使用 fullchain.pem 而非 cert.pem。
2. TLS 版本过低
症状:微信提示"该网页不安全",SSL Labs 评分 B 以下。
解决:禁用 TLS 1.0/1.1,仅保留 TLS 1.2/1.3。
3. 弱加密套件
症状:安全扫描报告提示使用弱算法。
解决:更新 ssl_ciphers 配置,移除 RC4、DES、3DES、MD5 等算法。
4. 证书过期
症状:所有浏览器显示"证书已过期"警告。
解决:设置自动续期(Certbot/acme.sh),或使用 DomainPulse SSL 监控设置到期提醒。
总结
完善的 HTTPS 配置不仅是微信生态的准入门槛,也是现代网站安全的基础。通过启用 TLS 1.3、优化证书链、配置 HSTS 和 OCSP Stapling,您可以获得 A+ 的 SSL 评分,确保域名在微信内安全可信。