5月27日 22:10

Nginx 如何配置 HTTPS 和 SSL 证书?

答案

Nginx 启用 HTTPS 的核心是在 server 块中监听 443 端口并指定证书与私钥路径:

nginx
server { 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:

nginx
server { 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 申请示例:

bash
sudo certbot --nginx -d example.com -d www.example.com

追问二:如何提升 HTTPS 安全性?

四个关键措施:

  1. 仅启用 TLS 1.2+,禁用 SSLv3 和 TLS 1.0
  2. HSTS 头,防止降级攻击:add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
  3. OCSP Stapling,减少证书验证延迟:ssl_stapling on; ssl_stapling_verify on;
  4. 强密钥,至少 2048 位 RSA 或 256 位 ECC

追问三:证书链不完整怎么办?

浏览器验证证书需要完整的信任链。若缺少中间证书,需将服务器证书与中间证书合并:

bash
cat 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

标签:Nginx