Nginx 如何配置 HTTPS 和 SSL 证书?
Nginx 配置 HTTPS 需要使用 SSL 模块,通过配置 SSL 证书来启用加密通信。HTTPS 可以保护数据传输的安全性,防止数据被窃听或篡改。
基本配置示例:
nginxserver { listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; location / { root /var/www/html; index index.html; } }
SSL 证书配置参数:
nginxserver { listen 443 ssl http2; server_name example.com; # 证书文件路径 ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; # SSL 协议版本 ssl_protocols TLSv1.2 TLSv1.3; # 加密套件 ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # SSL 会话缓存 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # OCSP Stapling ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/nginx/ssl/chain.crt; # HSTS add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; }
HTTP 自动跳转 HTTPS:
nginxserver { listen 80; server_name example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; location / { root /var/www/html; } }
SSL 证书类型:
- 自签名证书:用于测试环境,不被浏览器信任
- 免费证书:如 Let's Encrypt,有效期 90 天,可自动续期
- 商业证书:由 CA 机构颁发,有效期通常为 1 年
Let's Encrypt 证书申请:
使用 Certbot 工具申请免费证书:
bash# 安装 Certbot sudo apt-get install certbot python3-certbot-nginx # 申请证书并自动配置 Nginx sudo certbot --nginx -d example.com -d www.example.com # 只申请证书,不自动配置 sudo certbot certonly --nginx -d example.com
证书续期:
bash# 手动续期 sudo certbot renew # 自动续期(添加到 crontab) 0 0,12 * * * certbot renew --quiet
安全配置建议:
- 使用 TLS 1.2 或更高版本
- 禁用弱加密套件
- 启用 HSTS 防止降级攻击
- 配置 OCSP Stapling 提高性能
- 定期更新证书
- 使用强密钥(至少 2048 位)
- 启用 HTTP/2 提升性能
性能优化:
nginx# SSL 会话缓存 ssl_session_cache shared:SSL:50m; ssl_session_timeout 1d; # 启用 HTTP/2 listen 443 ssl http2; # SSL 缓冲区大小 ssl_buffer_size 4k;
多域名证书配置:
nginxserver { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/nginx/ssl/wildcard.crt; ssl_certificate_key /etc/nginx/ssl/wildcard.key; location / { root /var/www/html; } }
证书链配置:
如果证书需要中间证书,需要将证书和中间证书合并:
bashcat example.com.crt intermediate.crt > bundle.crt
然后在 Nginx 配置中使用 bundle.crt:
nginxssl_certificate /etc/nginx/ssl/bundle.crt;