CentOS 上 Nginx SSL 证书更新流程
一 准备与检查
- 确认系统与服务:建议使用 CentOS 7/8,并确保 Nginx 已安装且运行正常。
- 备份现有证书与密钥(可选但强烈推荐):
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 配置语法:
sudo nginx -t
- 查看错误日志定位问题:
tail -f /var/log/nginx/error.log
以上步骤有助于在替换证书前确保环境与配置可用,降低更新风险。
二 使用 Certbot 自动更新(Let’s Encrypt)
- 安装 Certbot 与 Nginx 插件(按系统选择其一):
- CentOS 7:sudo yum install epel-release && sudo yum install certbot python2-certbot-nginx
- CentOS 8/Stream:sudo yum install epel-release && sudo yum install certbot python3-certbot-nginx
- 方式 A(推荐)— Nginx 插件自动修改配置并热更新:
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
该方式会自动把证书写入 Nginx 配置并重启/热加载服务。
- 方式 B — 仅获取/续期证书(手动管理 Nginx 配置):
sudo certbot certonly --nginx -d your_domain.com
常见证书路径为:/etc/letsencrypt/live/your_domain.com/fullchain.pem(证书链)与 /etc/letsencrypt/live/your_domain.com/privkey.pem(私钥),请在 Nginx 的 server 443 段正确配置 ssl_certificate 与 ssl_certificate_key。
- 验证与生效:
sudo nginx -t && sudo systemctl reload nginx
以上流程覆盖一键自动化与手动部署两种常见场景,适合大多数站点。
三 手动更新证书(自购或企业 CA)
- 上传新证书与私钥到服务器(建议统一到 /etc/pki/tls/ 或 /etc/nginx/ssl/):
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 配置中确认证书路径(示例):
ssl_certificate /etc/pki/tls/certs/your_domain.crt;
ssl_certificate_key /etc/pki/tls/private/your_domain.key;
- 语法检查与热重载:
sudo nginx -t && sudo systemctl reload nginx
- 验证:
openssl s_client -connect your_domain:443 -servername your_domain
以上步骤适用于非 Let’s Encrypt 证书或需要自定义证书存放路径的场景。
四 自动续期与验证
- 测试续期流程(不写盘,安全验证):
sudo certbot renew --dry-run
- 设置定时任务(证书有效期 90 天,建议每周或每月尝试续期):
sudo crontab -e
示例(每周日凌晨 2:00 续期,3:00 重载 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/nginx/reload.log 2>&1
- 强制续期(仅在必要时使用):
sudo certbot renew --force-renewal
- 强制续期后务必重载 Nginx 并再次验证站点证书是否已更新。
以上做法可确保证书临近到期时自动更新,避免过期导致的中断。
五 常见问题与排查
- Nginx 插件不可用:执行 sudo yum install python-certbot-nginx(或 python3-certbot-nginx)后重试。
- 权限错误:私钥应为 600,证书 644,属主 root。
- 配置路径不一致:确认 ssl_certificate/ssl_certificate_key 指向实际证书文件(Let’s Encrypt 默认在 /etc/letsencrypt/live/your_domain/)。
- 使用了 CDN/反向代理/负载均衡:需在各厂商控制台同步更新证书并刷新缓存,否则浏览器可能仍显示旧证书。
- 验证命令:
- 查看站点证书链与有效期:openssl s_client -connect your_domain:443 -servername your_domain
- 查看 Nginx 是否加载新证书:在浏览器查看证书详情或再次执行上面的 OpenSSL 命令。
以上排查要点可快速定位更新失败或“已更新但浏览器仍显示旧证书”的常见原因。