核心是“换文件+改配置+重载服务”,必须依次执行:先查证书有效期和Nginx引用路径,再备份旧证书、上传新证书并确认权限,接着测试配置语法(nginx -t),最后重载服务(nginx -s reload)验证生效。

直接更新和替换 Nginx 中即将过期的 SSL 证书,核心是“换文件 + 改配置 + 重载服务”,不能跳过任一环节。证书本身是静态文件,Nginx 不会自动感知变化,必须显式触发加载新内容。
确认当前证书状态和路径
先别急着替换,快速定位问题源头:
- 查证书有效期:
openssl x509 -in /etc/nginx/ssl/example.com.crt -noout -dates,看 notAfter 时间是否临近(如剩余 15 天内) - 找 Nginx 引用位置:
grep -r "ssl_certificate" /etc/nginx/sites-enabled/,确认实际使用的证书和私钥路径 - 检查文件权限:
ls -l /etc/nginx/ssl/,确保 .crt 和 .key 文件属主为 root,权限为 644(证书)和 600(私钥)
安全替换证书文件
操作前务必备份,避免误操作导致 HTTPS 中断:
- 备份旧证书:
sudo cp /etc/nginx/ssl/example.com.crt /etc/nginx/ssl/example.com.crt.baksudo cp /etc/nginx/ssl/example.com.key /etc/nginx/ssl/example.com.key.bak - 上传新证书:把客户或 CA 提供的 新 .crt(含完整链)和 .key 文件 传到服务器相同目录,例如
/etc/nginx/ssl/ - 覆盖或重命名:若新文件名不同,可直接
sudo mv new_cert.pem /etc/nginx/ssl/example.com.crt,保持路径与配置中一致;不建议仅改名后保留旧文件,易混淆
验证并重载 Nginx 配置
即使路径没变,只要证书内容更新,就必须让 Nginx 重新读取:
- 测试语法正确性:
sudo nginx -t,输出 “syntax is ok” 和 “test is successful” 才能继续 - 重载服务(非重启):
sudo nginx -s reload—— 这会平滑切换连接,不中断现有用户访问 - 验证生效:
curl -I https://example.com 2>/dev/null | grep "HTTP/"确认返回 200;再用openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates查新证书有效期
推荐长期方案:自动续期代替手动操作
频繁手动更新容易遗漏,尤其多域名场景。Let’s Encrypt + Certbot 是成熟选择:
- 首次部署:
sudo certbot --nginx -d example.com,Certbot 自动修改配置、申请证书并重载 - 设置定时任务:
0 12 * * 1 /usr/bin/certbot renew --quiet --post-hook "/usr/sbin/nginx -s reload",每周一中午自动检测并续期 - 手动触发测试:
sudo certbot renew --dry-run,验证流程是否通畅


















