Ubuntu 上 Nginx SSL 最佳实践
一 准备与证书获取
sudo apt update && sudo apt install nginx certbot python3-certbot-nginxsudo systemctl start nginx && sudo systemctl enable nginxsudo certbot --nginx -d yourdomain.comsudo certbot --nginx -d yourdomain.com -d www.yourdomain.comsudo certbot renew --dry-runsudo ufw allow 'Nginx Full'sudo firewall-cmd --permanent --add-service=https && sudo firewall-cmd --reload二 推荐的 Nginx SSL 配置
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
include snippets/ssl-yourdomain.conf;
include snippets/ssl-params.conf;
# 可选:OCSP 装订信任链(Let’s Encrypt 中间证书)
# ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem;
root /var/www/yourdomain.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
sudo nginx -tsudo systemctl reload nginx三 关键参数说明与推荐值
ssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers on;ssl_ciphersuites TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256;(TLS 1.3)ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;(TLS 1.2)ssl_ecdh_curve secp384r1;sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096,并在 server 块加入 ssl_dhparam /etc/ssl/certs/dhparam.pem;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;ssl_session_tickets off;(多数场景更利于安全与一致性)ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s;add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;(确认全站可 HTTPS 后再启用 preload)add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; add_header X-XSS-Protection "1; mode=block";ssl_ciphersuites 指令。四 验证与运维
sudo nginx -tsudo systemctl reload nginxsudo certbot renew --dry-runsudo crontab -e 加入 0 12 * * * /usr/bin/certbot renew --quiet