Nginx SSL 证书配置
目录
SSL 证书简介
SSL(Secure Sockets Layer)证书是一种数字证书,用于在客户端和服务器之间建立加密连接。使用 SSL 证书可以:
1. 数据安全保护
- 加密传输数据,防止数据被窃听
- 确保数据完整性,防止数据被篡改
- 保护敏感信息(如密码、信用卡号等)
2. 身份认证
- 验证网站的真实身份
- 防止钓鱼网站和中间人攻击
- 建立用户对网站的信任
3. 合规性要求
- 符合 PCI DSS 支付卡行业数据安全标准
- 满足 GDPR 等数据保护法规要求
- 符合现代浏览器的安全标准
4. 技术优势
- 支持 HTTP/2 协议
- 提升网站 SEO 排名(搜索引擎优先收录 HTTPS 网站)
- 支持现代浏览器的高级功能
5. 用户体验
- 浏览器地址栏显示安全锁标识
- 提升用户对网站的信任度
- 避免浏览器显示不安全警告
6. 业务价值
- 保护品牌声誉
- 提高用户转化率
- 降低数据泄露风险
- 增强竞争优势
Let's Encrypt 配置案例
1. 安装 Certbot
# Ubuntu/Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx
# CentOS/RHEL
sudo yum install epel-release
sudo yum install certbot python3-certbot-nginx
2. 配置 Nginx 虚拟主机
# /etc/nginx/conf.d/example.com.conf
server {
listen 80;
server_name example.com www.example.com;
location / {
root /var/www/example.com;
index index.html;
}
}
3. 获取 SSL 证书
# 自动配置 Nginx
sudo certbot --nginx -d example.com -d www.example.com
# 仅获取证书(手动配置)
sudo certbot certonly --nginx -d example.com -d www.example.com
4. 自动续期配置
# 测试自动续期
sudo certbot renew --dry-run
# 添加定时任务
sudo crontab -e
# 添加以下内容(每天凌晨 2:30 检查续期)
30 2 * * * /usr/bin/certbot renew --quiet
5. 完整的 Nginx SSL 配置示例
# /etc/nginx/conf.d/example.com.conf
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# SSL 配置
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 优化 SSL 配置
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# 现代配置
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:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS 配置
add_header Strict-Transport-Security "max-age=63072000" always;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# 网站根目录
root /var/www/example.com;
index index.html;
# 日志配置
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
# 安全相关头部
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
}
6. 验证配置
# 检查 Nginx 配置
sudo nginx -t
# 重新加载 Nginx
sudo systemctl reload nginx
# 测试 SSL 配置
curl -vI https://example.com
7. 故障排除
证书获取失败
- 确保域名已正确解析到服务器
- 检查 80 端口是否开放
- 查看 Certbot 日志:
sudo certbot --logs
自动续期失败
- 检查 Certbot 定时任务:
sudo crontab -l - 查看续期日志:
sudo certbot renew --logs
- 检查 Certbot 定时任务:
Nginx 配置错误
- 检查证书路径是否正确
- 确认文件权限:
sudo ls -l /etc/letsencrypt/live/ - 查看 Nginx 错误日志
8. 安全建议
- 定期更新 Certbot 和 Nginx
- 监控证书过期时间
- 配置防火墙规则
- 定期备份证书和配置
- 使用强密码保护私钥
