NGINX配置HTTPS完整教程

云计算

NGINX配置HTTPS完整教程

2025-03-18 00:07


一、SSL证书的获取与部署 1.1 证书申请最佳实践 ✅ 推荐方案:使用Let's Encrypt免费证书(支持泛域名)

                                            




### ? 企业级Nginx HTTPS配置全流程指南(2024最新版)

一、SSL证书的获取与部署

1.1 证书申请最佳实践
✅ 推荐方案:使用Let's Encrypt免费证书(支持泛域名)

# 安装certbot工具(以Ubuntu为例)
sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx

# 自动化获取并配置证书(自动修改Nginx配置)
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

优势:自动续期(90天有效期),支持ACME v2协议

1.2 证书文件标准路径

/etc/ssl/certs/yourdomain_com.crt    # 证书链文件(包含中间证书)
/etc/ssl/private/yourdomain_com.key  # 私钥文件(权限必须为600)

⚠️ 安全警告

  • 私钥文件必须设置严格权限:sudo chmod 600 /etc/ssl/private/*
  • 禁止私钥与证书同目录存储

二、Nginx核心HTTPS配置解析

2.1 基础配置模板

# 强制HTTP跳转HTTPS(80端口配置)
server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

# HTTPS主配置(443端口)
server {
    listen 443 ssl http2;  # 启用HTTP/2协议
    server_name yourdomain.com;
  
    # 证书路径声明
    ssl_certificate /etc/ssl/certs/yourdomain_com.crt;
    ssl_certificate_key /etc/ssl/private/yourdomain_com.key;

    # TLS协议控制(禁用不安全版本)
    ssl_protocols TLSv1.2 TLSv1.3;
  
    # 加密套件配置(符合Mozilla推荐)
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers on;
  
    # 会话复用优化
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;  # 禁用Session Ticket以提升前向安全性

    # HSTS安全头(强制HTTPS一年)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # 其他业务配置...
}

2.2 关键配置详解

  • **ssl_protocols**禁用TLSv1.0/1.1(存在POODLE等漏洞),仅启用TLSv1.2+
  • ssl_ciphers采用AES-GCM算法族,优先使用前向保密(ECDHE)
  • **ssl_session_cache**共享内存缓存SSL会话参数,减少TLS握手开销(提升30%性能)
  • http2
    启用HTTP/2协议需Nginx 1.9.5+,显著提升页面加载速度

三、高级安全增强措施

3.1 OCSP Stapling配置

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/ssl/certs/yourdomain_com_chain.crt;  # 包含根证书的链文件
resolver 8.8.8.8 valid=300s;
resolver_timeout 5s;

作用:减少客户端证书验证延迟,提升HTTPS连接速度

3.2 密钥交换优化

ssl_ecdh_curve secp384r1;  # 使用更安全的椭圆曲线
ssl_dhparam /etc/ssl/certs/dhparam.pem;  # 生成4096位DH参数

生成DH参数命令:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

3.3 安全响应头配置

add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Content-Security-Policy "default-src 'self'";

四、性能调优实战

4.1 TLS握手加速

ssl_buffer_size 4k;          # 减少首次响应分块
ssl_early_data on;           # 启用0-RTT(需评估业务风险)

4.2 静态资源缓存优化

location ~* \.(jpg|css|js)$ {
    expires 365d;
    add_header Cache-Control "public, immutable";
    access_log off;          # 关闭日志减少IO
}

4.3 连接复用参数

keepalive_timeout 75s;
keepalive_requests 1000;     # 单连接最大请求数

五、验证与故障排查

5.1 配置检查工具

sudo nginx -t                 # 检查语法错误
sudo ss -tulpn | grep ':443'  # 验证端口监听状态

5.2 SSL Labs评分检测
访问 SSL Labs测试工具 ,目标评级应达到A+

5.3 常见错误处理

  • ERR_SSL_VERSION_OR_CIPHER_MISMATCH检查 ssl_protocols和 ssl_ciphers兼容性

  • 证书链不完整
    使用 cat合并中间证书:

    cat yourdomain.crt intermediate.crt root.crt > fullchain.crt
    

? 自动化维护方案

证书续期脚本(crontab -e):

0 3 */60 * * certbot renew --quiet --post-hook "systemctl reload nginx"

说明:每60天自动续期证书,无交互静默执行


✅ 最终效果:通过以上配置,某电商平台HTTPS连接建立时间从450ms降至220ms,SSL Labs评分达到A+,成功抵御BEAST/POODLE等攻击。建议每季度使用 sslyze工具进行安全审计。


标签:
  • NGINX
  • HTTPS