Nginx 配置 HTTPS:从证书部署到安全优化
HTTPS 通过 SSL/TLS 协议加密客户端与服务器的通信,保护数据传输安全,已成为现代 Web 服务的标配。Nginx 可通过简单配置实现 HTTPS 部署,本文详细讲解证书准备、核心配置、安全优化及 HTTP 强制跳转 HTTPS 的完整流程。
HTTPS 配置前提:准备 SSL 证书
部署 HTTPS 需先获取 SSL 证书(包含公钥证书和私钥),常见获取方式:
- 免费证书:Let’s Encrypt(有效期 3 个月,可自动续期)、阿里云 / 腾讯云免费证书(有效期 1 年);
- 付费证书:商业 CA 机构(如 DigiCert、Symantec)颁发的 OV/EV 证书,安全性更高。
证书文件通常包含:
- 公钥证书(如
certificate.crt、domain.crt):用于客户端验证服务器身份; - 私钥文件(如
private.key):用于服务器解密客户端请求,需严格保密,权限设置为600(仅所有者可读写)。
基础 HTTPS 配置
Nginx 通过ssl模块实现 HTTPS,核心是在server块中配置监听 443 端口、证书路径及 SSL 协议参数。
完整配置示例
1 | server { |
核心参数详解
listen 443 ssl:
声明监听 443 端口并启用 SSL,不可省略ssl关键字(否则 Nginx 仅作为普通 TCP 服务)。- 证书路径:
ssl_certificate:公钥证书路径(需绝对路径,确保 Nginx 有权限读取);ssl_certificate_key:私钥路径(权限需严格限制,如chmod 600 private.key)。
- 协议与加密套件:
ssl_protocols:指定支持的 SSL/TLS 协议,禁用不安全的 SSLv2、SSLv3、TLSv1.0、TLSv1.1(已被破解),推荐TLSv1.2 TLSv1.3;ssl_ciphers:定义加密算法列表,优先选择支持前向 secrecy(如 ECDHE)的套件,避免使用 RC4、MD5 等弱算法;ssl_prefer_server_ciphers on:让服务器决定使用哪种加密套件,而非客户端。
- 会话缓存:
ssl_session_cache shared:SSL:10m:复用 SSL 会话,减少重复握手的 CPU 消耗(10M 约可存储 80000 个会话)。
HTTP 强制跳转 HTTPS
为确保所有流量通过 HTTPS 传输,需将 80 端口的 HTTP 请求自动跳转至 HTTPS:
1 | server { |
$host:自动获取请求的域名(如www.ably.com);$request_uri:保留完整路径和参数(如/api?page=1),确保跳转后路径不变。
安全优化:提升 HTTPS 安全性
启用 HSTS(HTTP Strict Transport Security)
告知浏览器 “此后始终使用 HTTPS 访问该域名”,防止降级攻击:
1 | add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; |
max-age=63072000:有效期 2 年(单位秒);includeSubDomains:子域名也适用;preload:申请加入浏览器预加载列表(需在HSTS Preload List提交)。
禁用 SSL 会话 tickets
避免会话 ticket 被窃取导致的安全风险(适合高安全性场景):
1 | ssl_session_tickets off; |
配置 OCSP Stapling(证书状态验证)
减少客户端验证证书有效性的时间,提升加载速度:
1 | ssl_stapling on; |
防御 BEAST 和 CRIME 攻击
禁用 RC4 加密套件(已在
ssl_ciphers中排除);启用 TLS 压缩(默认关闭,无需额外配置):
1
ssl_compression off; # 禁用SSL压缩,防止CRIME攻击
常见问题排查
- 证书配置错误(无法启动 Nginx):
- 检查证书路径是否正确(绝对路径);
- 确认私钥与证书匹配(可通过
openssl x509 -noout -modulus -in certificate.crt和openssl rsa -noout -modulus -in private.key验证 modulus 是否一致)。
- 浏览器提示 “证书不受信任”:
- 证书未包含当前访问的域名(如证书为
ably.com,访问www.ably.com); - 缺少中间证书(需将 CA 颁发的中间证书合并到
certificate.crt,按 “服务器证书→中间证书” 顺序拼接)。
- 证书未包含当前访问的域名(如证书为
- SSL 协议不兼容(部分浏览器无法访问):
- 若需兼容旧浏览器(如 IE8),可临时启用
TLSv1.0,但不推荐(牺牲安全性); - 现代浏览器均支持
TLSv1.2+,建议优先保证安全性。
- 若需兼容旧浏览器(如 IE8),可临时启用
- HTTPS 网站加载缓慢:
- 启用
ssl_session_cache减少握手次数; - 配置
OCSP Stapling加速证书验证; - 升级 Nginx 至最新版本(优化 SSL 性能)。
- 启用
验证 HTTPS 配置
可通过在线工具检测 HTTPS 配置的安全性:
- SSL Labs SSL Test:全面评估证书、协议、加密套件等,生成评分(A + 为最佳);
- SSL Checker:验证证书有效性和配置完整性。
v1.3.10