Ubuntu 上 Nginx SSL/TLS 安全加固与部署指南
一 准备与证书部署
- 安装与启动 Nginx
- 更新索引并安装:sudo apt update && sudo apt install nginx
- 启动并设为开机自启:sudo systemctl start nginx && sudo systemctl enable nginx
- 获取证书(推荐 Let’s Encrypt)
- 安装 Certbot:sudo apt install certbot python3-certbot-nginx
- 获取并自动配置证书:sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
- 证书续期测试:sudo certbot renew --dry-run(Let’s Encrypt 证书有效期为90 天,建议启用自动续期)
- 手动部署证书(CA 签发或自签名,仅测试可用)
- 将证书与私钥上传至安全目录(如:/etc/ssl/cert/),证书路径在 Nginx 中通过 ssl_certificate 指定,私钥通过 ssl_certificate_key 指定
- 自签名示例(测试环境):
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048
-keyout /etc/ssl/private/nginx-selfsigned.key
-out /etc/ssl/certs/nginx-selfsigned.crt
- 注意:自签名证书不会被浏览器信任,生产环境请使用受信任 CA 签发证书。
二 基础与强化的 SSL/TLS 配置
-
推荐的 server 443 配置片段(按需调整域名与证书路径)
- 启用 TLSv1.2/1.3 与强套件,优先 ECDHE 实现前向保密(FS)
- 启用 HTTP/2 提升性能
- 开启 HSTS 强制浏览器使用 HTTPS
- 关闭版本号暴露,添加常用安全头
- 配置会话缓存与超时,提升握手性能
- 可选:开启 OCSP Stapling 加速证书状态校验(需有效 OCSP 响应)
-
示例
- 将证书路径替换为你的实际路径(如:/etc/letsencrypt/live/yourdomain.com/fullchain.pem 与 privkey.pem)
- 将 yourdomain.com 替换为你的域名
- 保存后执行 sudo nginx -t 校验,再 sudo systemctl reload nginx 生效
-
说明
- 套件字符串示例仅保留现代、AEAD 套件;如环境需兼容旧客户端,可在确保禁用不安全协议/套件前提下适度扩展
- 若使用自签名证书,OCSP Stapling 可能不可用(缺少受信任签发链),可先关闭相关指令以避免告警
-
参考配置
server {
listen 443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# 协议与套件
ssl_protocols TLSv1.2 TLSv1.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;
ssl_prefer_server_ciphers on;
# 会话复用
ssl_session_cache shared:MozSSL:10m;
ssl_session_timeout 1d;
# 安全头
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
server_tokens off;
# OCSP Stapling(可选)
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 5s;
# 站点根目录与反向代理示例
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
# 反向代理示例:proxy_pass http://127.0.0.1:3000;
}
}
HTTP → HTTPS 强制跳转
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}
三 防火墙与端口
- 放行 HTTPS(UFW 示例)
- 允许 Nginx Full(包含 443/80):sudo ufw allow ‘Nginx Full’
- 如已单独放行 80,可移除:sudo ufw delete allow ‘Nginx HTTP’
- 查看状态:sudo ufw status
- 云厂商安全组
四 验证与运维
- 配置语法检查:sudo nginx -t
- 重新加载:sudo systemctl reload nginx
- 在线评测:使用 SSL Labs SSL Server Test 检测评级与漏洞(A+ 为目标)
- 证书续期
- 自动续期已默认配置,定期测试:sudo certbot renew --dry-run
- 续期后重载 Nginx 生效:sudo systemctl reload nginx
- 常见问题排查
- 证书链不完整导致浏览器告警:确保 fullchain.pem 包含中间证书
- 端口未放行:检查 UFW/安全组 与云厂商防火墙
- 自签名证书不被信任:仅用于测试,生产请更换为受信任 CA 证书。
五 进阶加固与合规建议
- 协议与套件
- 禁用 SSLv2/3、TLS1.0/1.1 与不安全套件(如 RC4、DES、MD5、匿名套件)
- 仅启用 TLS1.2/1.3 与 ECDHE 前向保密套件
- 安全响应头
- 启用 HSTS(建议包含 preload 后再提交浏览器预加载列表)
- 配置 X-Frame-Options、X-Content-Type-Options、X-XSS-Protection、Referrer-Policy、Content-Security-Policy(CSP 按站点策略细化)
- 访问与抗攻击
- 限制请求方法(仅允许 GET/POST/HEAD 等必要方法)
- 限制单 IP 连接数与速率(如 limit_conn_zone/limit_req_zone)
- 管理后台使用 IP 白名单 与 Fail2Ban 联动
- 运维与变更
- 变更前备份配置,变更后执行 nginx -t 与灰度发布
- 定期关注 CVE 与 OpenSSL/Nginx 安全公告,及时修补与升级。