HTTPS 常见问题排查
HTTPS 配置完之后,最常见的问题不是证书本身,而是混合内容、证书不匹配、HSTS 锁死这三类。
问题一:混合内容(Mixed Content)
症状:HTTPS 页面上的锁头显示警告,或部分资源加载失败。
原因:页面通过 HTTPS 加载,但页面内的某些资源(图片、脚本、CSS)还在用 HTTP 链接。
如何排查:
1. 打开 Chrome → 开发者工具(F12)→ Console 面板
2. 看是否有 Mixed Content 错误信息
3. 找到具体哪个资源用了 HTTP
修复方法:
| 场景 | 修复方式 |
|---|---|
| 自己控制的资源 | 把所有 http:// 改为 https:// 或 //(协议无关 URL) |
| WordPress 站点 | 安装 Better Search Replace,把数据库里的 http 替换成 https |
| 第三方嵌入 | 联系第三方或换用支持 HTTPS 的替代方案 |
| Cloudflare 用户 | 开启 Automatic HTTPS Rewrites(自动替换 HTTP 链接) |
问题二:证书错误(Certificate Error)
ERR_CERT_COMMON_NAME_INVALID
原因:证书上的域名和访问的域名不匹配。
常见场景:
- 访问 www.example.com,但证书只覆盖 example.com
- 访问 shop.example.com,但证书只覆盖 *.example.com(这个应该能匹配,检查通配符配置)
修复:重新申请包含所有需要域名的证书(多域名证书或通配符证书)。
ERR_CERT_DATE_INVALID
原因:证书已过期,或者客户端系统时间错误。
排查:
# 检查证书有效期
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
修复:
- 证书过期 → 重新申请(Let's Encrypt 应该已自动续期,检查 certbot 日志)
- 系统时间错误 → 检查服务器时间同步(timedatectl status)
ERR_CERT_AUTHORITY_INVALID
原因:证书不被浏览器信任(自签名证书,或 CA 不受信任)。
修复:换用受信任 CA 签发的证书(Let's Encrypt 或 Cloudflare)。
问题三:HSTS 锁死(HSTS Preload 问题)
症状:你关闭了 HTTPS,想临时用 HTTP,但浏览器拒绝访问,显示 NET::ERR_CERT_AUTHORITY_INVALID 或无法绕过。
原因:HSTS 告诉浏览器只用 HTTPS,浏览器会缓存这个指令(max-age 时间内)。
如何清除本地 HSTS 缓存(Chrome):
1. 打开 chrome://net-internals/#hsts
2. 在 "Delete domain security policies" 输入域名 → Delete
如果被加入了 HSTS Preload List: 这个更严重,所有 Chrome 用户都无法用 HTTP 访问你的域名。要从列表移除需要数月时间。
避免的建议:
- 不要在 HTTPS 没有完全稳定前开启 HSTS
- preload 参数要谨慎使用(一旦加入 Preload List 很难移除)
问题四:证书链不完整
症状:某些设备(旧 Android)显示证书错误,但桌面 Chrome 正常。
原因:中间证书(Intermediate Certificate)没有正确配置。
排查工具:SSL Labs Server Test — 免费,给出详细的证书链分析和评分。
修复(Nginx):确保使用 fullchain.pem,而不是 cert.pem:
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # ✅ 包含中间证书
# ssl_certificate /etc/letsencrypt/live/example.com/cert.pem; # ❌ 只有叶证书
快速诊断清单
| 症状 | 首先检查 |
|---|---|
| 锁头有警告但能访问 | 混合内容(Chrome Console) |
| 浏览器拒绝访问,证书错误 | 证书域名、有效期、CA 信任 |
| 旧手机/旧系统报错,新设备正常 | 证书链是否完整 |
| HTTP 改成 HTTPS 后 SEO 掉了 | 检查 301 跳转是否正确,规范链接是否更新 |
| HTTPS 变慢 | OCSP Stapling、TLS 1.3、HTTP/2 是否开启 |
本章执行清单
- [ ] 用 SSL Labs 测试你的站点,目标评分 A 或 A+
- [ ] 检查 Chrome DevTools Console 是否有混合内容警告
- [ ] 确认 HTTP → HTTPS 的 301 跳转已配置(不是 302)
- [ ] 如果用 Let's Encrypt,运行
certbot renew --dry-run确认自动续期正常
下一章:CDN 与缓存策略——在 HTTPS 的基础上,用 CDN 让全球用户都打得快。