禁用TLSv1.0/TLSv1.1并启用HSTS是Nginx HTTPS部署最基础关键的两步:需配置ssl_protocols TLSv1.2 TLSv1.3、ssl_ciphers强套件配合ssl_prefer_server_ciphers on,以及add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always,并配套隐藏版本号、限制HTTP方法及设置安全响应头。

直接禁用不安全协议、启用HSTS,是Nginx HTTPS部署中最基础也最关键的两步。做对了,能有效防中间人攻击、协议降级和会话劫持。
禁用TLSv1.0和TLSv1.1
这两个旧版协议存在已知漏洞(如POODLE、BEAST),现代浏览器已逐步弃用。必须在 server 块中明确指定仅支持高安全性协议:
- 添加配置:
ssl_protocols TLSv1.2 TLSv1.3; - 不要写成
TLSv1 TLSv1.1 TLSv1.2 TLSv1.3,哪怕只是多一个空格或漏掉分号,都可能导致Nginx启动失败 - 验证方式:用
openssl s_client -connect your-domain.com:443 -tls1_1测试,应返回连接拒绝;用-tls1_2或-tls1_3则应正常握手
配置强加密套件并优先服务端协商
光禁协议不够,还得限制可用的加密算法,避免使用弱密钥交换或过时的对称加密:
- 推荐配置:
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;,确保客户端无法绕过服务器策略选择弱套件 - 避免使用包含
RC4、MD5、SHA1、DES、3DES的套件,这些已被标记为不安全
启用HSTS强制HTTPS访问
HSTS不是可选项,而是生产环境必备项。它让浏览器记住“只走HTTPS”,从源头切断HTTP明文请求可能引发的降级风险:
- 在443端口的
server块中添加:add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; -
max-age=31536000表示一年有效期,首次访问后浏览器即缓存该策略 -
includeSubDomains覆盖所有子域名(如 api.example.com),需确保子域也已部署HTTPS -
preload是可选但强烈建议的参数,提交到浏览器预加载列表后,新用户首次访问也会强制HTTPS(需满足官方要求) -
always确保即使返回500、404等错误状态,HSTS头依然生效
配套加固建议(不可省略)
单独开HSTS或禁协议效果有限,需搭配以下基础防护形成闭环:
- 隐藏版本号:
server_tokens off;(加在http或server块) - 关闭不安全HTTP方法:
if ($request_method !~ ^(GET|HEAD|POST)$) { return 405; } - 设置安全响应头:
add_header X-Frame-Options DENY;、add_header X-Content-Type-Options nosniff;、add_header X-XSS-Protection "1; mode=block"; - 每次修改后务必执行
nginx -t检查语法,再用nginx -s reload生效


















