必须禁用tlsv1.0/tlsv1.1,仅启用tlsv1.2+;ssl_ciphers须强制pfs、禁用rc4/sha1等弱算法;cookie需secure/httponly/samesite且用always覆盖全状态码;必须启用hsts与x-content-type-options。

要满足 PCI-DSS、等保2.0 等主流合规标准,Nginx 的 HTTPS 配置不能只“能用”,必须精准控制协议版本、加密套件、密钥交换机制和响应头行为。核心不是堆砌高参数,而是剔除所有被明确禁止的组件,并确保安全属性在所有响应中强制生效。
协议层:必须禁用 TLSv1.0 和 TLSv1.1
PCI-DSS 自 2018 年 6 月 30 日起强制禁用 TLSv1.0;等保2.0 和 Azure 同样将 TLSv1.1 列为不合规项。扫描工具(如 SSL Labs、myssl.com)只要检测到任一请求协商使用这两个版本,即直接判为“不通过”。
- 错误写法:ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; —— 其中 TLSv1 就是 TLSv1.0,必须删除
- 正确写法:ssl_protocols TLSv1.2 TLSv1.3; —— 显式声明,不留默认隐含风险
- 配置后务必执行 nginx -t 校验语法,再用 nginx -s reload 生效;仅重启服务不保证热加载成功
加密套件层:强制前向保密(PFS)且禁用弱算法
PCI-DSS 不接受“够强就行”的模糊策略,要求所有启用的套件必须基于 ECDHE 或 DHE 密钥交换(保障前向保密),同时彻底排除含 NULL、EXPORT、RC4、DES、MD5、SHA1 的套件。
- 禁用 RSA 密钥交换类套件(如 ECDHE-RSA-AES128-SHA 中若含 SHA1,即不合规)
- 推荐通过扫描验证的最小合规集:
ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384"; - 必须设置 ssl_prefer_server_ciphers on;,防止客户端发起降级协商
Cookie 与响应头:安全属性不可遗漏任何状态码
PCI-DSS 要求会话 Cookie 必须同时具备 Secure、HttpOnly、SameSite=Lax(或 Strict)属性。但后端应用常忽略反向代理场景下的协议感知问题——比如 HTTP→HTTPS 跳转时丢失 Secure 标志。
- 应在 Nginx 层统一注入并强制覆盖:
add_header Set-Cookie "JSESSIONID=$sessionid; Path=/; HttpOnly; Secure; SameSite=Lax" always; - always 参数关键:否则 Nginx 默认仅对 2xx 响应添加 Header,302 跳转、4xx 错误等均会漏掉安全属性
- 若需前端 JS 读取部分 Cookie(如刷新令牌),应拆分命名:敏感会话 ID 设 HttpOnly,控制类 Cookie 单独定义并豁免
HSTS 与内容安全头:高频扣分项必须显式启用
HSTS(HTTP Strict Transport Security)和 X-Content-Type-Options 是 PCI-DSS 扫描中最常因缺失而扣分的两项。它们不参与加密协商,但直接影响浏览器对连接的信任等级和 MIME 类型处理逻辑。
- 启用 HSTS(建议 max-age ≥ 31536000,含子域且预加载):
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; - 阻止 MIME 类型嗅探:
add_header X-Content-Type-Options "nosniff" always; - 这两项也必须加 always,覆盖全部响应状态码











