欢迎光临南京雪聪网
详情描述
Nginx更新SSL证书的实现步骤

Nginx更新SSL证书的详细步骤如下:

一、准备工作

1. 获取新证书

# 从证书颁发机构获取以下文件:
# 1. 域名证书(通常为 .crt 或 .pem)
# 2. 私钥文件(通常为 .key)
# 3. 中间证书链(通常为 ca-bundle 或 chain.pem)

# 或使用 Let's Encrypt 自动续签
certbot renew --dry-run  # 测试续签

2. 备份旧证书

# 备份原有证书文件
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

二、更新证书文件

方式1:手动替换证书

# 将新证书文件上传到服务器
# 通常放在 /etc/nginx/ssl/ 目录下

# 设置正确的权限
sudo chmod 600 /etc/nginx/ssl/example.com.key
sudo chown root:root /etc/nginx/ssl/example.com.key

方式2:使用组合证书(推荐)

# 创建组合证书文件(证书+中间证书链)
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

三、修改Nginx配置

1. 编辑SSL配置

# /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;

    # ... 其他配置
}

2. 检查配置文件语法

# 测试Nginx配置是否正确
sudo nginx -t

# 预期输出:
# nginx: configuration file /etc/nginx/nginx.conf test is successful

四、重新加载Nginx

1. 平滑重载(推荐)

# 不中断服务重新加载配置
sudo nginx -s reload

# 或使用systemd
sudo systemctl reload nginx

2. 验证证书更新

# 检查新证书信息
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

五、自动化方案

1. Let's Encrypt自动续签脚本

#!/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

2. 使用cron定时任务

# 编辑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

七、最佳实践

证书管理

  • 使用证书链文件(chained.crt)
  • 定期备份旧证书
  • 监控证书到期时间

安全建议

  • 使用强密钥(至少2048位RSA或ECC)
  • 启用HTTP/2和TLS 1.3
  • 配置HSTS头部

监控告警

  • 设置证书到期前30天提醒
  • 监控SSL连接状态
  • 定期检查SSL配置评分

八、一键更新脚本示例

#!/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证书的更新工作。