温馨提示×

nginx ssl在centos上的最佳实践是什么

小樊
31
2025-12-11 14:16:36
栏目: 云计算

Nginx SSL 在 CentOS 的最佳实践

一 环境准备与证书获取

  • 系统与安全组
    • 更新系统并安装工具:sudo yum update -y && sudo yum install -y curl wget vim
    • 放行防火墙端口:sudo firewall-cmd --zone=public --add-port=443/tcp --permanent && sudo firewall-cmd --reload
  • 安装 Nginx
    • 启用 EPEL:sudo yum install -y epel-release
    • 安装与启动:sudo yum install -y nginx && sudo systemctl start nginx && sudo systemctl enable nginx
  • 证书获取
    • Let’s Encrypt 自动:sudo yum install -y certbot python3-certbot-nginx,然后 sudo certbot --nginx -d example.com -d www.example.com
    • 手动 CSR(商业证书):openssl req -new -newkey rsa:2048 -nodes -keyout /etc/ssl/private/example.com.key -out /etc/ssl/certs/example.com.csr
  • 续期与测试
    • 测试续期:sudo certbot renew --dry-run
    • 定时续期(每月):0 3 * * * /usr/bin/certbot renew --quiet
    • 证书有效期检查:openssl x509 -in /etc/ssl/certs/example.com.crt -noout -dates

二 推荐的 Nginx SSL 配置

  • 建议将安全与性能参数集中到 http 块,server 块按需引用,便于多站点复用。
  • 示例要点
    • 仅启用TLSv1.2/TLSv1.3,优先服务器套件,启用HTTP/2
    • 启用OCSP Stapling与会话恢复(会话票据/缓存)
    • 配置HSTS与常用安全头
    • HTTP 全站 301 跳转 HTTPS
http {
    # 会话与恢复
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets on;
    # 可选:生成密钥文件并设定权限(/etc/nginx/ssl/ticket.key,600)
    # ssl_session_ticket_key /etc/nginx/ssl/ticket.key;

    # 现代协议与性能
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
                ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:
                DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve secp384r1;
    ssl_buffer_size 1400;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    # 可选:TLS 1.3 0-RTT(有重放风险,按业务谨慎开启)
    # ssl_early_data on;

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

        ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

        # 安全头
        add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;

        # 站点根目录(示例)
        root /var/www/html;
        index index.html;
    }

    # HTTP 跳转 HTTPS
    server {
        listen 80;
        server_name example.com www.example.com;
        return 301 https://$host$request_uri;
    }
}
  • 证书路径说明
    • Let’s Encrypt 常用路径:/etc/letsencrypt/live/example.com/fullchain.pemprivkey.pem
    • 商业证书常见为:域名证书 .crt、中间证书 .ca-bundle;合并为 fullchain.pem 更便于配置:cat domain.crt chain.crt > fullchain.pem

三 部署与运维要点

  • 配置语法与热重载
    • 检查:sudo nginx -t
    • 生效:sudo systemctl reload nginx(或 restart
  • 权限与路径
    • 证书与密钥建议权限:chown root:nginx /path/to/*.pem; chmod 640 /path/to/*.pem
    • 常见错误为证书路径错误或权限不足,Nginx 启动失败或握手异常
  • 日志排查
    • 错误日志:/var/log/nginx/error.log
    • 握手与证书链问题可用:openssl s_client -connect example.com:443 -servername example.com
  • 在线评测
    • Qualys SSL Labs:https://www.ssllabs.com/ssltest/analyze.html?d=example.com(目标评分 A+)

四 场景化配置与注意事项

  • WebSocket 安全代理(WSS)
    • 关键要点:HTTP/1.1、Upgrade/Connection 头、长连接超时
    • 示例:
      location /wss/ {
          proxy_pass http://127.0.0.1:8080;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "Upgrade";
          proxy_set_header Host $host;
          proxy_read_timeout 86400s;
          proxy_send_timeout 86400s;
      }
      
  • 0-RTT 使用建议
    • ssl_early_data on; 仅在确认业务可容忍重放攻击风险时开启,并配合业务层去重/幂等等策略
  • 证书与续期
    • Let’s Encrypt 证书默认有效期90天,务必配置自动续期与定时任务,避免中断
  • 安全头与浏览器策略
    • 建议启用并长期设置 HSTS(如:max-age=63072000; includeSubDomains; preload),提交至浏览器预加载列表前确保全站稳定可达 HTTPS

0