5月27日 22:10
Nginx 如何配置 HTTPS 和 SSL 证书?
答案
Nginx 启用 HTTPS 的核心是在 server 块中监听 443 端口并指定证书与私钥路径:
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_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; }
同时配置 HTTP 自动跳转 HTTPS:
nginxserver { listen 80; server_name example.com; return 301 https://$host$request_uri; }
追问一:SSL 证书有哪些类型?怎么选?
- 自签名证书:测试用,浏览器不信任
- Let's Encrypt:免费 DV 证书,90 天有效期,Certbot 自动申请与续期
- 商业证书(OV/EV):CA 机构签发,验证组织身份,适合生产环境
Let's Encrypt 申请示例:
bashsudo certbot --nginx -d example.com -d www.example.com
追问二:如何提升 HTTPS 安全性?
四个关键措施:
- 仅启用 TLS 1.2+,禁用 SSLv3 和 TLS 1.0
- HSTS 头,防止降级攻击:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; - OCSP Stapling,减少证书验证延迟:
ssl_stapling on; ssl_stapling_verify on; - 强密钥,至少 2048 位 RSA 或 256 位 ECC
追问三:证书链不完整怎么办?
浏览器验证证书需要完整的信任链。若缺少中间证书,需将服务器证书与中间证书合并:
bashcat example.com.crt intermediate.crt > bundle.crt
Nginx 中指向合并后的文件:ssl_certificate /etc/nginx/ssl/bundle.crt;
追问四:多域名如何共用证书?
- 通配符证书(
*.example.com)覆盖子域 - SAN 证书支持多个域名,Certbot 申请时加多个
-d参数 - SNI(Server Name Indication)让同一 IP 托管多张证书,Nginx 原生支持
配置验证用 nginx -t,无停机重载用 nginx -s reload。