0%

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.crtdomain.crt):用于客户端验证服务器身份;
  • 私钥文件(如private.key):用于服务器解密客户端请求,需严格保密,权限设置为600(仅所有者可读写)。

基础 HTTPS 配置

Nginx 通过ssl模块实现 HTTPS,核心是在server块中配置监听 443 端口、证书路径及 SSL 协议参数。

完整配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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:

1
2
3
4
5
6
7
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 访问该域名”,防止降级攻击:

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
2
3
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /server/Certs/ca_bundle.crt; # 证书链文件路径

防御 BEAST 和 CRIME 攻击

  • 禁用 RC4 加密套件(已在ssl_ciphers中排除);

  • 启用 TLS 压缩(默认关闭,无需额外配置):

    1
    ssl_compression off;  # 禁用SSL压缩,防止CRIME攻击

常见问题排查

  1. 证书配置错误(无法启动 Nginx)
    • 检查证书路径是否正确(绝对路径);
    • 确认私钥与证书匹配(可通过openssl x509 -noout -modulus -in certificate.crtopenssl rsa -noout -modulus -in private.key验证 modulus 是否一致)。
  2. 浏览器提示 “证书不受信任”
    • 证书未包含当前访问的域名(如证书为ably.com,访问www.ably.com);
    • 缺少中间证书(需将 CA 颁发的中间证书合并到certificate.crt,按 “服务器证书→中间证书” 顺序拼接)。
  3. SSL 协议不兼容(部分浏览器无法访问)
    • 若需兼容旧浏览器(如 IE8),可临时启用TLSv1.0,但不推荐(牺牲安全性);
    • 现代浏览器均支持TLSv1.2+,建议优先保证安全性。
  4. HTTPS 网站加载缓慢
    • 启用ssl_session_cache减少握手次数;
    • 配置OCSP Stapling加速证书验证;
    • 升级 Nginx 至最新版本(优化 SSL 性能)。

验证 HTTPS 配置

可通过在线工具检测 HTTPS 配置的安全性:

  • SSL Labs SSL Test:全面评估证书、协议、加密套件等,生成评分(A + 为最佳);
  • SSL Checker:验证证书有效性和配置完整性。

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10