《HTTPS 免费证书实战:Certbot 十分钟搞定,续期全自动》解决了“有没有证书”的问题,这篇解决“证书配置得好不好”。衡量标准就是 SSL Labs 的在线评级(ssllabs.com/ssltest),A 是合格线,A+ 是这个项目的满分。冲 A+ 不需要密码学功底,因为业界早有一份权威作业可抄——Mozilla 的 SSL Configuration Generator(ssl-config.mozilla.org),选服务器和版本,直接生成完整配置。本文的配置就来自它当前维护的 Guideline v5.7(2026-09-04 核实)。
先把评级逻辑弄明白,不然抄了作业也不知道为什么扣分。SSL Labs 扣分的常见项:证书链不完整(《SSL 证书过期与证书链不完整:openssl s_client 验证与续期监控》讲过,缺中间证书,直接掉级);支持 SSLv3/TLS1.0/1.1 这类过时协议;使用 CBC 模式等弱加密套件;没有 HSTS;密钥交换用静态 RSA。A+ 相对 A 的分水岭主要是两项:HSTS 头存在且参数到位,以及(新规下)OCSP 装订等加分项。这么看,从 A 到 A+ 的路其实很短。
Mozilla 生成器提供三档:Modern 只留 TLS 1.3,最安全最快但会踢掉 2018 年前的老客户端;Old 为了兼容 XP 时代的古董保留 TLS 1.0,除非合规要求否则别碰;**Intermediate(TLS 1.2 + 1.3)是官方对公共站点的推荐档**,兼容近五年发布的几乎所有客户端。照抄 Intermediate 的 Nginx 配置:
# 来自 ssl-config.mozilla.org(nginx / intermediate, Guideline v5.7)
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 协议:只留TLS 1.2和1.3,老的SSLv3/TLS1.0/1.1全砍
ssl_protocols TLSv1.2 TLSv1.3;
# TLS1.2加密套件:全部AEAD+前向保密,无CBC
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# 会话复用
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
# OCSP装订:服务器主动附带证书状态,客户端少查一次
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 1.1.1.1 8.8.8.8 valid=300s;
# HSTS:两年,含子域。A+的关键
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
}
# 80端口整站301到HTTPS
server {
listen 80;
return 301 https://$host$request_uri;
}
HSTS 单独展开讲,它是 A+ 的核心也是最容易翻车的一项。这个头的意思是:告诉浏览器在两年内只用 HTTPS 访问这个域名,即使用户手输 http:// 也在本地强制升级。翻车点在于 includeSubDomains——它把强制范围扩大到所有子域名,如果你某个子域(比如只在内网用的测试站)没有配 HTTPS,浏览器会直接拒绝访问。所以上线 HSTS 的纪律是:先发 max-age=300 的短头观察几天(五分钟过期,出了问题自己恢复),确认所有子域都 HTTPS 了再上 63072000 的长期头。这个头一旦以长期发出,缓存在用户浏览器里两年才过期,收不回来。
改完 nginx -t && nginx -s reload,跑一遍 SSL Labs 测试。预期结果:Protocol Support 满分(TLS 1.3 + 1.2,无旧协议),Key Exchange、Cipher Strength 满分,总体 A。从 A 到 A+ 还差的那口气通常就是 HSTS:确认头已生效(curl -sI 看响应头),重测即 A+。注意 SSL Labs 测试前要先把 DNS 切到直连源站的场景——如果已按 《Cloudflare免费CDN接入全流程:橙云一开,源站IP从此隐身》接了 Cloudflare,SSL Labs 测到的是 CDN 边缘的配置,评级反映的是 Cloudflare 的证书设置而非你的源站,这时候去 Cloudflare 面板检查 SSL 模式是否 Full (strict)、最低 TLS 版本是否设为 1.2。
最后两个提醒。一是别碰“套娃加密”的伪优化:网上有教程教你 TLS1.3 上再叠一层密码套件调优,TLS 1.3 的套件是固定的,调了也白调,还可能写错配置导致握手失败——Intermediate 档的每一行都是 Mozilla 安全团队维护的,别自由发挥。二是和《SSL 证书过期与证书链不完整:openssl s_client 验证与续期监控》呼应:证书链完整是评级的地基,换证书、续期之后重新跑一次 openssl s_client 或 SSL Labs 确认链完整,这个习惯能防掉最常见的意外掉级。
相关阅读:证书配好只是及格,冲 A+ 才算过关。《性能与安全加固总清单:按这张表打勾,新站48小时达到生产水准》把本篇排在安全组收尾,传输层这一勾打上,安全项齐活。
申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!
