Nginx强制HTTPS需协同配置:443端口启用TLSv1.2+及强密码套件,80端口用return 301跳转至HTTPS,并添加HSTS头防降级,杜绝混合内容。

直接在 Nginx 中启用强加密套件和强制 HTTPS 重定向,核心是两件事:用现代 TLS 协议限定加密算法,并把所有 HTTP 请求无条件跳转到 HTTPS。操作不难,但细节决定安全性是否真正落地。
明确启用强加密套件
强加密套件不是“越多越好”,而是要剔除已知脆弱的算法,只保留前向保密(PFS)强、密钥交换安全、认证可靠的一组组合。Nginx 默认配置往往偏宽松,需手动收紧。
- 使用 ssl_protocols TLSv1.2 TLSv1.3 —— 明确禁用 TLS 1.0 和 1.1(已被主流浏览器弃用,存在严重漏洞)
- 设置 ssl_ciphers 时优先选 ECDHE 开头的套件,确保前向保密;避免含
NULL、MD5、RC4、DES、3DES的套件 - 推荐一行简洁写法:ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
- 加上 ssl_prefer_server_ciphers on;,让服务器主导协商结果,避免客户端老旧配置拖后腿
配置 HTTPS 强制重定向
仅开启 443 端口的 HTTPS 不够,用户仍可能手动输入 http:// 访问,或从旧书签、搜索引擎缓存进入 HTTP 页面。必须主动拦截并跳转。
- 在同一个配置文件中,新增一个独立的
server块,监听 listen 80 - server_name 必须与 HTTPS 块保持一致(如 example.com 或带 www 的多个域名)
- 用 return 301 https://$host$request_uri; 实现永久重定向,保留原始路径和参数,对 SEO 友好
- 不要用 rewrite —— return 更高效、更安全,且避免正则误匹配风险
验证与权限检查
配置写完不能直接 reload,几个关键点常被忽略:
- 运行 sudo nginx -t 检查语法,确认无 “test is successful” 提示
- 证书和私钥文件权限必须设为 600(
sudo chmod 600 /etc/nginx/ssl/*.key),防止非 root 用户读取私钥 - 确保证书链完整:若用 Let’s Encrypt,
fullchain.pem已含中间证书;若用商业证书,需确认ssl_certificate指向的是包含根+中间证书的合并文件,或额外配置ssl_trusted_certificate - 重载生效:sudo systemctl reload nginx(非 restart,减少连接中断)
后续建议:自动续期与监控
Let’s Encrypt 证书 90 天过期,靠手动更新不可靠。建议:
- 用 certbot 设置定时任务:
sudo certbot renew --quiet --no-self-upgrade,配合 cron 每天凌晨执行 - 在 renew-hook 中加入
systemctl reload nginx,确保新证书热加载 - 用在线工具(如 SSL Labs 的 SSL Test)扫描域名,确认协议、套件、证书链评级达 A 或 A+


















