Nginx更新SSL证书的详细步骤如下:
# 从证书颁发机构获取以下文件:
# 1. 域名证书(通常为 .crt 或 .pem)
# 2. 私钥文件(通常为 .key)
# 3. 中间证书链(通常为 ca-bundle 或 chain.pem)
# 或使用 Let's Encrypt 自动续签
certbot renew --dry-run # 测试续签
# 备份原有证书文件
sudo cp /etc/nginx/ssl/example.com.crt /etc/nginx/ssl/example.com.crt.bak
sudo cp /etc/nginx/ssl/example.com.key /etc/nginx/ssl/example.com.key.bak
sudo cp /etc/nginx/ssl/example.com.chain.pem /etc/nginx/ssl/example.com.chain.pem.bak
# 将新证书文件上传到服务器
# 通常放在 /etc/nginx/ssl/ 目录下
# 设置正确的权限
sudo chmod 600 /etc/nginx/ssl/example.com.key
sudo chown root:root /etc/nginx/ssl/example.com.key
# 创建组合证书文件(证书+中间证书链)
sudo cat example.com.crt example.com.chain.pem > example.com.chained.crt
# 或者使用 Let's Encrypt 的完整链
sudo cat /etc/letsencrypt/live/example.com/fullchain.pem \
/etc/letsencrypt/live/example.com/privkey.pem \
> /etc/nginx/ssl/example.com.combined.pem
# /etc/nginx/sites-available/example.com
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# 证书路径配置
ssl_certificate /etc/nginx/ssl/example.com.chained.crt; # 或 fullchain.pem
ssl_certificate_key /etc/nginx/ssl/example.com.key; # 或 privkey.pem
# 其他SSL配置保持不变
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# ... 其他配置
}
# 测试Nginx配置是否正确
sudo nginx -t
# 预期输出:
# nginx: configuration file /etc/nginx/nginx.conf test is successful
# 不中断服务重新加载配置
sudo nginx -s reload
# 或使用systemd
sudo systemctl reload nginx
# 检查新证书信息
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
| openssl x509 -noout -dates -subject -issuer
# 使用在线工具验证
# SSL Labs: https://www.ssllabs.com/ssltest/
# 或使用命令行工具
curl -I https://example.com
#!/bin/bash
# /usr/local/bin/renew-ssl.sh
DOMAINS=("example.com" "www.example.com")
WEBROOT="/var/www/html"
for domain in "${DOMAINS[@]}"; do
certbot certonly \
--webroot -w $WEBROOT \
-d $domain \
--non-interactive \
--agree-tos \
--email admin@example.com \
--force-renewal
done
# 重新加载Nginx
nginx -s reload
# 编辑cron任务
sudo crontab -e
# 添加每月自动续签
0 0 1 * * /usr/bin/certbot renew --quiet && /usr/sbin/nginx -s reload
证书权限问题
# 确保私钥文件权限安全
sudo chmod 600 /etc/ssl/private/your-domain.key
sudo chown root:root /etc/ssl/private/your-domain.key
证书链不完整
# 验证证书链
openssl verify -CAfile /path/to/chain.pem /path/to/certificate.crt
Nginx配置测试失败
# 查看详细错误信息
sudo nginx -t -c /etc/nginx/nginx.conf
强制浏览器更新缓存
# 重启Nginx服务
sudo systemctl restart nginx
证书管理
安全建议
监控告警
#!/bin/bash
# update-ssl.sh
set -e
DOMAIN="example.com"
SSL_DIR="/etc/nginx/ssl"
BACKUP_DIR="/backup/ssl/$(date +%Y%m%d)"
# 备份旧证书
mkdir -p $BACKUP_DIR
cp $SSL_DIR/$DOMAIN.* $BACKUP_DIR/ 2>/dev/null || true
# 假设新证书已上传到临时目录
cp /tmp/new-certs/* $SSL_DIR/
# 组合证书链
cat $SSL_DIR/$DOMAIN.crt $SSL_DIR/$DOMAIN.chain.pem > $SSL_DIR/$DOMAIN.chained.crt
# 设置权限
chmod 600 $SSL_DIR/$DOMAIN.key
chown root:root $SSL_DIR/$DOMAIN.key
# 测试并重载
nginx -t
nginx -s reload
echo "SSL证书更新完成"
通过以上步骤,可以安全、高效地完成Nginx SSL证书的更新工作。