在 CentOS 上更新 Nginx 的 SSL 证书
一、准备与检查
- 备份现有证书与私钥(可选但强烈建议):
- sudo cp /etc/pki/tls/certs/your_domain.crt /etc/pki/tls/certs/your_domain.crt.bak
- sudo cp /etc/pki/tls/private/your_domain.key /etc/pki/tls/private/your_domain.key.bak
- 确认 Nginx 配置中证书路径,常见为:
- ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
- ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
- 测试配置与证书链:
- 配置语法:sudo nginx -t
- 证书链与到期:echo | openssl s_client -connect your_domain:443 -servername your_domain 2>/dev/null | openssl x509 -noout -issuer -enddate
二、使用 Let’s Encrypt 的更新方式
- 安装或更新 Certbot(CentOS 7/8 常见做法):
- sudo yum install epel-release -y
- 建议优先:sudo yum install python3-certbot-nginx -y
- 如未提供 python3 包,可:sudo yum install certbot python2-certbot-nginx -y
- 自动识别并更新证书(会修改 Nginx 配置以启用 HTTPS 与自动重定向):
- sudo certbot --nginx -d your_domain
- 仅获取/续期证书但不改动 Nginx 配置:
- sudo certbot certonly --nginx -d your_domain
- 无 Nginx 插件或二进制不在 PATH 时的替代验证方式:
- Webroot:先确保 Nginx 对 /.well-known/acme-challenge/ 可访问,然后
- sudo certbot certonly --webroot -w /var/www/html -d your_domain
- 手动 DNS 或文件挑战:sudo certbot certonly --manual -d your_domain(适合无 Web 服务或复杂验证场景)
三、手动替换证书的步骤
- 将新证书与私钥复制到目标路径(路径以你的 Nginx 配置为准):
- sudo cp new_certificate.crt /etc/pki/tls/certs/your_domain.crt
- sudo cp new_private_key.key /etc/pki/tls/private/your_domain.key
- 设置私钥权限(仅 root 可读):
- sudo chmod 600 /etc/pki/tls/private/your_domain.key
- 测试并重载 Nginx:
- sudo nginx -t && sudo systemctl reload nginx
- 验证是否已生效(查看新证书的颁发者与到期时间):
- echo | openssl s_client -connect your_domain:443 -servername your_domain 2>/dev/null | openssl x509 -noout -issuer -enddate
四、设置自动续期与常见问题
- 测试自动续期(不真正写盘,验证能否成功):
- sudo certbot renew --dry-run
- 加入定时任务(证书有效期为90 天,建议每周或每月尝试续期):
- 示例(每周日凌晨 2 点续期,3 点重载 Nginx):
- 0 2 * * 0 /usr/bin/certbot renew >> /var/log/letsencrypt/renew.log 2>&1
- 0 3 * * 0 /usr/bin/systemctl reload nginx >> /var/log/letsencrypt/nginx-reload.log 2>&1
- 常见问题与排查
- Nginx 插件不可用或找不到 Nginx 二进制:安装对应插件(如 python3-certbot-nginx),或改用 --webroot/–manual 方式;确保 PATH 包含 nginx。
- 续期成功但浏览器仍显示旧证书:清理浏览器缓存/CDN 缓存;如使用 CDN/反向代理/负载均衡,需在各节点或控制台同步更新证书并刷新缓存。
- 端口与防火墙:确保 443/tcp 已放行(如 firewalld:firewall-cmd --zone=public --add-port=443/tcp --permanent && firewall-cmd --reload)。
- 权限错误:私钥必须为 600,证书文件建议 644。