温馨提示×

Nginx SSL配置文件详解

小樊
35
2025-12-06 20:43:59
栏目: 云计算

Nginx SSL 配置文件详解

一 前置准备与目录结构

  • 证书与私钥准备:从 CA 获取或使用 Let’s Encrypt 自动签发,常见文件为服务器证书(如 fullchain.pemserver.crt)、私钥(如 privkey.pemserver.key),以及(可选)中间证书(如 intermediate.crt)。将证书与私钥放入安全目录,例如 /etc/nginx/ssl/
  • 模块与编译检查:确保 Nginx 编译时包含 –with-http_ssl_module(现代发行版通常默认包含)。
  • 配置文件路径:常见路径为 /etc/nginx/nginx.conf/etc/nginx/conf.d/*.conf/etc/nginx/sites-available/(配合软链到 sites-enabled)。
  • 防火墙放行:如使用 firewalld,放行 443/tcp(以及 80/tcp 用于跳转):
    sudo firewall-cmd --permanent --add-service=https
    sudo firewall-cmd --reload

二 最小可用 HTTPS 配置

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    # 证书与私钥(Let's Encrypt 常用 fullchain.pem + privkey.pem)
    ssl_certificate     /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    # 仅启用安全的 TLS 协议
    ssl_protocols TLSv1.2 TLSv1.3;

    # 优先使用服务器套件,选择支持前向保密的 GCM 套件
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:
                 ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384';

    # 会话复用,提升握手性能
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;

    root /usr/share/nginx/html;
    index index.html;
}
  • 要点说明:
    • 使用 listen 443 ssl http2; 开启 TLSHTTP/2
    • 证书链完整性:若你的 CA 提供中间证书,某些场景下需合并为 fullchain 或配置 ssl_trusted_certificate 供验证使用。
    • 现代浏览器与安全性要求建议仅启用 TLSv1.2/1.3ECDHE 前向保密套件。

三 进阶安全与性能优化

  • HTTP 到 HTTPS 强制跳转(301 永久重定向):
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}
  • HSTS(HTTP Strict Transport Security):
    add_header Strict-Transport-Security “max-age=31536000; includeSubDomains; preload”;
  • OCSP Stapling(减少客户端证书状态查询延迟):
    ssl_stapling on;
    ssl_stapling_verify on;
  • 会话缓存与超时(提升性能与体验):
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
  • 说明:启用 HSTS 前务必确保全站可达且证书无误;OCSP Stapling 需上游 CA 支持并正确配置解析。

四 完整示例含 HTTP 跳转与验证

# HTTP -> HTTPS 跳转
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

# HTTPS 服务
server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate     /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    # 安全协议与套件
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:
                 ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384';

    # 会话复用
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # HSTS(谨慎启用,确保全站 HTTPS)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";

    root /usr/share/nginx/html;
    index index.html;
}
  • 配置检查与生效:
    sudo nginx -t
    sudo systemctl reload nginx
  • 验证方式:
    • 浏览器访问 https://example.com 检查锁标识与证书链。
    • 命令行查看证书信息:
      openssl x509 -in /etc/nginx/ssl/fullchain.pem -text -noout
    • 使用 SSL Labs 在线评测服务器配置强度。

五 常见问题与排查要点

  • 证书链不完整导致浏览器告警:使用 fullchain.pem 或将中间证书合并到服务器证书;必要时配置 ssl_trusted_certificate 供 OCSP/验证使用。
  • 协议与套件过旧:仅保留 TLSv1.2/1.3ECDHE 前向保密套件,禁用 SSLv3/TLSv1/TLSv1.1 与不安全套件。
  • 权限与路径错误:证书与私钥权限建议 600,属主 root,路径使用绝对路径
  • 配置生效与平滑升级:修改后先 nginx -t 校验,再 reload 避免中断。
  • 防火墙/云安全组:放行 443/tcp(及 80/tcp 用于跳转)。
  • 使用 CDN/反向代理:确认链路各环节均启用 HTTPS,证书在源站与边缘正确部署。

0