Nginx配置https
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 协议参数。
完整配置示例
server {
# 监听443端口(HTTPS默认端口),并启用SSL
listen 443 ssl;
# 绑定域名(需与证书中的域名一致)
server_name ably.com www.ably.com;
# SSL证书配置
ssl_certificate /server/Certs/certificate.crt; # 公钥证书路径
ssl_certificate_key /WebServer/Certs/private.key; # 私钥路径
# SSL会话缓存(减少握手开销)
ssl_session_cache shared:SSL:10m; # 共享缓存,大小10M
ssl_session_timeout 1d; # 会话超时时间1天
# 安全协议与加密套件(关键!影响兼容性和安全性)
ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全的SSLv2/SSLv3/TLSv1
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on; # 优先使用服务器定义的加密套件
# 启用HSTS(强制客户端后续使用HTTPS)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# 网站根目录与默认页
root /data/www;
index index.html index.htm index.php;
# PHP处理(如需)
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
# 静态资源缓存
location ~* \.(gif|jpg|jpeg|png|css|js)$ {
expires 1d;
}
# 日志配置
access_log /var/log/nginx/ably_https.access.log;
error_log /var/log/nginx/ably_https.error.log;
}
核心参数详解
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:
server {
listen 80;
server_name ably.com www.ably.com; # 与HTTPS服务器的域名一致
# 永久重定向到HTTPS(301状态码,客户端会缓存跳转规则)
return 301 https://$host$request_uri;
}
$host:自动获取请求的域名(如www.ably.com);$request_uri:保留完整路径和参数(如/api?page=1),确保跳转后路径不变。
安全优化:提升 HTTPS 安全性
启用 HSTS(HTTP Strict Transport Security)
告知浏览器 “此后始终使用 HTTPS 访问该域名”,防止降级攻击:
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
max-age=63072000:有效期 2 年(单位秒);includeSubDomains:子域名也适用;preload:申请加入浏览器预加载列表(需在HSTS Preload List提交)。
禁用 SSL 会话 tickets
避免会话 ticket 被窃取导致的安全风险(适合高安全性场景):
ssl_session_tickets off;
配置 OCSP Stapling(证书状态验证)
减少客户端验证证书有效性的时间,提升加载速度:
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /server/Certs/ca_bundle.crt; # 证书链文件路径
防御 BEAST 和 CRIME 攻击
禁用 RC4 加密套件(已在
ssl_ciphers中排除);启用 TLS 压缩(默认关闭,无需额外配置):
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:验证证书有效性和配置完整性。