HTTPS 早已不是「可选项」,而是网站的基础配置。但很多站长把证书一装就以为安全了:协议还开着 TLS 1.0、加密套件里躺着 RC4 和 3DES、证书链缺了中间证书、OCSP 每次访问都要外查……这些隐患轻则拖慢网站速度,重则让加密形同虚设,甚至被中间人攻击直接降级破解。根据常见的安全扫描结果,国内大量站点在 SSL/TLS 配置上拿不到 A 级评分,问题几乎都出在协议版本过旧、弱套件未清理和证书链不完整这三件事上。
本文从零开始,给你一套可以直接复制的 Nginx SSL/TLS 安全配置方案,覆盖协议版本、加密套件、证书链、OCSP Stapling、HSTS 等关键项。配置完用命令实测,冲击 SSL Labs A+ 评分。
一、基础配置:证书部署与 HTTPS 强制跳转
无论你用宝塔面板还是手工部署,先把证书和密钥放到正确位置。宝塔面板操作路径:网站 → 设置 → SSL → 粘贴证书与密钥(或「Let’s Encrypt」自动申请)。证书文件建议统一存放在 /www/server/panel/vhost/cert/ 下,方便管理与续期。
Nginx 站点配置(宝塔面板路径:网站 → 设置 → 配置文件,对应文件 /www/server/panel/vhost/nginx/站点名.conf):
server {
listen 443 ssl;
server_name www.example.com example.com;
ssl_certificate /www/server/panel/vhost/cert/example.com/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/example.com/privkey.pem;
}
然后强制 80 端口跳转 HTTPS,避免用户通过明文访问:
server {
listen 80;
server_name www.example.com example.com;
return 301 https://$host$request_uri;
}
改完先检查语法再重载:
nginx -t && nginx -s reload
证书选型上给一句建议:个人站和企业站用 DV 证书(免费或几十元)足够,核心是加密与防劫持;需要展示企业身份的再上 OV/EV。证书本身解决的是「身份可信 + 传输加密」,而传输加密的强度,取决于下面的协议与套件配置。
证书都有有效期(DV 免费证书通常 90 天,商业证书 1 年),忘记续期导致 HTTPS 突然失效,是站长最常犯的低级错误。宝塔面板申请 Let’s Encrypt 证书后默认带自动续期,建议再在【计划任务】里加一条 crontab 兜底:每天凌晨检测证书剩余天数,小于 30 天自动续期并写日志,双保险防止证书静默过期。
二、协议与加密套件强化:禁用旧协议与弱算法
TLS 1.0 和 TLS 1.1 已被 RFC 8996 正式废弃,PCI DSS 合规也强制要求禁用;RC4、3DES 及 CBC 系列套件存在已知弱点(BEAST、POODLE、SWEET32 等攻击),必须从配置里清出去。TLS 1.3 相比 1.2 不仅握手更快(少一个 RTT),还彻底移除了 RSA 密钥交换和 CBC 模式,从设计上消灭了一大批历史漏洞。在 server 块中加入以下安全配置:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:!aNULL:!eNULL:!MD5:!RC4:!3DES;
ssl_prefer_server_ciphers on;
ssl_ecdh_curve X25519:prime256v1;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 24h;
ssl_session_tickets off;
几点说明:
- ssl_protocols:只保留 TLSv1.2 与 TLSv1.3。注意 TLS 1.3 需要 Nginx 1.13.0+ 且 OpenSSL 1.1.1+,宝塔面板当前版本默认满足。
- ssl_ciphers:优先 AEAD 套件(AES-GCM、ChaCha20),显式排除 aNULL、eNULL、MD5、RC4、3DES 等弱算法。
- ssl_prefer_server_ciphers on:由服务器决定套件顺序,防止客户端主动降级。
- ssl_ecdh_curve:指定安全椭圆曲线,X25519 优先。
- ssl_session_tickets off:关闭会话票据,降低会话复用被利用的风险;追求极致性能的站点也可保留,但需结合密钥轮换策略。
若仍有个别老系统(如 Windows 7 + IE11)无法访问,可临时保留 TLSv1.1 过渡,但必须设过渡期并在 1-2 周内关闭,否则扫描评分永远上不去。
三、证书链、OCSP Stapling 与安全响应头
证书配置里最容易踩的坑是「证书链不完整」:很多站长只粘贴了域名证书(leaf),漏了中间证书(intermediate),导致安卓手机和部分浏览器报「证书不受信任」。请务必使用 fullchain.pem(完整链)而不是 cert.pem。
接着开启 OCSP Stapling,让 Nginx 自行缓存证书吊销状态,避免浏览器每次访问都外查 OCSP 服务器(既慢又可能泄露访问记录):
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 114.114.114.114 valid=300s;
resolver_timeout 5s;
再加 HSTS 与基础安全响应头,告诉浏览器「只准用 HTTPS 访问本站」:
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options SAMEORIGIN always;
注意 add_header 的继承陷阱:一旦某个 server 块或 location 块内出现 add_header 指令,就会覆盖外层 http 块的所有 add_header。所以安全头要么全部写在同一层,要么每个 location 都补上,否则 HSTS 会莫名失效。这也是很多人「明明配了 HSTS 却不生效」的真正原因。
另外提醒:如果网站接入了 CDN,HSTS 和安全头应在 CDN 的响应头配置里同步设置;回源协议建议设置为 HTTPS,避免 CDN 到源站这一段走明文。
同时建议给证书到期时间加一条告警:主流监控工具(UptimeRobot、云监控等)都支持 SSL 到期检测,提前 15-30 天推送提醒,从根上避免「证书过期、网站打不开」的尴尬。
四、验证与排查:如何确认配置生效
配置完成后别急着收工,用命令实测:
# 检查 TLS 1.3 是否可用
openssl s_client -connect www.example.com:443 -tls1_3 </dev/null 2>/dev/null | grep -E "Protocol|Cipher"
# 查看实际协商的协议与套件
openssl s_client -connect www.example.com:443 -servername www.example.com </dev/null 2>/dev/null | grep -E "Protocol|Cipher"
# 验证 HSTS 响应头
curl -sI https://www.example.com | grep -i strict-transport-security
# 全量扫描(推荐 testssl.sh,比 sslscan 更全面)
git clone --depth 1 https://github.com/drwetter/testssl.sh.git
./testssl.sh/testssl.sh www.example.com:443
在线验证可用 SSL Labs(ssllabs.com/ssltest),目标 A 级以上;国内节点可用 myssl.com 检测,两者结论基本一致。
常见问题排查:
- 安卓提示证书不受信任:证书链不完整,换成 fullchain.pem 并重载 Nginx。
- TLS 1.3 不生效:检查 Nginx / OpenSSL 版本,确认 ssl_protocols 中确实写了 TLSv1.3。
- HSTS 不生效:多半是 add_header 被 location 块覆盖,按上文继承规则排查。
- OCSP Stapling 未启用:执行 openssl s_client -connect 域名:443 -status 查看,若返回 no response sent,检查 resolver 是否可达。
五、日常巡检清单
配置是一次性的,安全是持续性的。建议每周花两分钟跑一遍巡检:
# 1. 协议与套件是否被回退
openssl s_client -connect www.example.com:443 -tls1_1 </dev/null 2>/dev/null | grep Protocol
# 2. HSTS 响应头是否仍在
curl -sI https://www.example.com | grep -i strict-transport-security
# 3. 证书剩余有效期(天)
echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>/dev/null | openssl x509 -noout -enddate
# 4. Nginx 错误日志里的 SSL 报错
grep -i ssl /www/wwwlogs/站点名.error.log | tail -20
把这几条封装成脚本放进 cron 每周执行,输出异常就告警,安全配置就不会悄悄退化。
总结
SSL/TLS 安全配置的核心就三件事:关掉旧协议、清掉弱套件、补全证书链并开启 OCSP Stapling。这套配置在 Nginx 与宝塔面板上均可直接落地,配完用 testssl.sh 或 SSL Labs 验证,达到 A+ 评分并不难。安全配置是「一次投入、长期受益」的事,越早加固,越少被动;配合定期的漏洞扫描与日志审计,才能形成完整的安全闭环。
如果你不想自己折腾,或者网站需要 CDN+WAF 联动防护、DDoS 清洗、源站隐藏等整体安全方案,欢迎联系速度网络,我们提供从 TLS 加固到云防护接入的一站式服务。
