Nginx更新SSL证书的实现步骤

以下是Nginx更新SSL证书的详细实现步骤,涵盖证书获取、配置替换、验证及回滚等关键环节,适用于Let’s Encrypt自动续期商业证书手动更新场景:

图片[1]_Nginx更新SSL证书的实现步骤_知途无界

一、准备工作

1. 确认当前SSL证书信息

首先查看Nginx当前使用的证书路径及相关配置,避免更新时遗漏:

# 查找Nginx配置文件中的SSL证书路径(以默认配置为例)
grep -r "ssl_certificate" /etc/nginx/

# 示例输出(记录证书路径):
# /etc/nginx/sites-enabled/default:    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
# /etc/nginx/sites-enabled/default:    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

2. 备份当前证书及配置

为防止更新失败,需备份现有证书和Nginx配置:

# 备份证书(假设当前证书路径为/etc/letsencrypt/live/example.com/)
cp -r /etc/letsencrypt/live/example.com/ /etc/letsencrypt/live/example.com_backup_$(date +%F)

# 备份Nginx配置(假设主配置文件为/etc/nginx/nginx.conf)
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_backup_$(date +%F)
cp -r /etc/nginx/sites-enabled/ /etc/nginx/sites-enabled_backup_$(date +%F)

二、获取新SSL证书

根据证书类型(Let’s Encrypt免费证书或商业证书),选择以下方式获取新证书:

场景1:Let’s Encrypt证书(推荐自动续期)​

Let’s Encrypt证书有效期为90天,通常通过certbot工具自动续期。若需手动更新(如域名变更或首次部署),步骤如下:

1. 安装Certbot(若未安装)
# Ubuntu/Debian
sudo apt update && sudo apt install certbot python3-certbot-nginx -y

# CentOS/RHEL
sudo yum install certbot python3-certbot-nginx -y
2. 申请/续期证书

使用Certbot自动识别Nginx配置并生成证书(支持单域名或多域名):

# 自动续期(若证书未过期,Certbot会提示;若已过期需强制续期)
sudo certbot renew --dry-run  # 模拟续期,检查是否有错误(可选)

# 实际续期(针对特定域名)
sudo certbot renew --cert-name example.com  # 仅续期example.com的证书

# 若为首次申请(如新增域名)
sudo certbot --nginx -d example.com -d www.example.com  # 自动配置Nginx并生成证书

说明​:Certbot会自动将新证书保存至/etc/letsencrypt/live/example.com/,并更新Nginx配置中的证书路径(若使用--nginx参数)。

场景2:商业SSL证书(手动上传)​

若使用商业CA(如DigiCert、GlobalSign)签发的证书,需手动下载并上传至服务器:

1. 下载证书文件

通常商业CA会提供以下文件(格式可能为.crt.pem.cer):

  • 证书文件​(如example.com.crt):包含服务器公钥及CA链(可能需合并中间证书);
  • 私钥文件​(如example.com.key):需确保与证书匹配且权限为600(仅属主可读);
  • 中间证书​(如intermediate.crt):部分CA需单独提供,需与主证书合并。
2. 合并证书(若需要)

若主证书不包含中间证书,需将主证书与中间证书合并为fullchain.pem(顺序:主证书在前,中间证书在后):

cat example.com.crt intermediate.crt > fullchain.pem
3. 上传证书至服务器

将合并后的fullchain.pem和私钥example.com.key上传至服务器(建议路径:/etc/ssl/certs//etc/nginx/ssl/):

scp fullchain.pem user@server_ip:/etc/nginx/ssl/
scp example.com.key user@server_ip:/etc/nginx/ssl/
chmod 600 /etc/nginx/ssl/example.com.key  # 限制私钥权限
chmod 644 /etc/nginx/ssl/fullchain.pem    # 证书文件权限可放宽

三、更新Nginx配置

无论证书来源如何,需确保Nginx配置中指向新证书的路径正确。

1. 编辑Nginx配置文件

打开之前记录的配置文件(如/etc/nginx/sites-enabled/default),修改ssl_certificatessl_certificate_key指令:

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    # 新证书路径(Let's Encrypt自动续期无需修改,商业证书需替换为新路径)
    ssl_certificate /etc/nginx/ssl/fullchain.pem;       # 或 /etc/letsencrypt/live/example.com/fullchain.pem
    ssl_certificate_key /etc/nginx/ssl/example.com.key; # 或 /etc/letsencrypt/live/example.com/privkey.pem

    # 其他SSL配置(如协议、加密套件等)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    # ...
}

2. 测试Nginx配置语法

修改配置后,必须验证语法是否正确,避免重启Nginx时失败:

sudo nginx -t

若输出nginx: configuration file /etc/nginx/nginx.conf test is successful,则配置无误。

四、重载Nginx使新证书生效

配置验证通过后,重载Nginx以应用新证书(无需中断服务):

sudo systemctl reload nginx   # 或 sudo service nginx reload

注意​:若使用restart命令(systemctl restart nginx),会导致短暂的服务中断,生产环境优先使用reload

五、验证新证书是否生效

通过以下方式确认新证书已正确加载:

1. 浏览器验证

访问https://example.com,点击地址栏锁图标,查看证书详情(签发日期应为新证书的起始日期)。

2. 命令行验证(OpenSSL)

使用openssl工具直接查询证书信息:

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates

输出示例(关注notBefore字段):

notBefore=Dec  1 00:00:00 2024 GMT  # 新证书签发时间
notAfter=Mar  1 23:59:59 2025 GMT  # 新证书过期时间

3. 在线工具验证

使用SSL Labs输入域名,检查证书状态及评分(确保无“证书过期”警告)。

六、回滚方案(若更新失败)​

若新证书导致问题(如配置错误、证书不匹配),需快速回滚:

  1. 恢复Nginx配置​: cp /etc/nginx/nginx.conf_backup_2024-XX-XX /etc/nginx/nginx.conf cp -r /etc/nginx/sites-enabled_backup_2024-XX-XX/* /etc/nginx/sites-enabled/
  2. 恢复旧证书​(若手动替换过): rm -rf /etc/letsencrypt/live/example.com/ mv /etc/letsencrypt/live/example.com_backup_2024-XX-XX /etc/letsencrypt/live/example.com
  3. 重载Nginx​: sudo systemctl reload nginx

七、后续维护(针对Let’s Encrypt)​

为避免证书过期导致服务中断,需确保自动续期任务正常运行:

  1. 检查Certbot定时任务(通常由certbot自动添加至crontab): crontab -l | grep certbot 示例输出(每天凌晨检查续期): 0 0 * * * /usr/bin/certbot renew --quiet && systemctl reload nginx
  2. 手动触发续期测试(可选): sudo certbot renew --force-renewal # 强制续期(仅测试用,避免浪费配额)

总结

Nginx更新SSL证书的核心流程为:​备份→获取新证书→更新配置→验证→重载。关键注意事项包括:

  • 严格备份证书和配置,防止数据丢失;
  • 商业证书需确保私钥权限为600,避免安全风险;
  • Let’s Encrypt优先使用自动续期,减少人工操作;
  • 生产环境通过reload而非restart避免服务中断。

通过以上步骤,可安全、高效地完成SSL证书更新,保障HTTPS服务的连续性。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞10 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容