服务器迁移后 HTTPS 证书失效如何重新部署 Let's Encrypt?

文章导读
服务器迁移后 HTTPS 证书失效,通常是因为新服务器缺少证书私钥文件或域名 HTTP 验证请求无法到达新 IP,而不是证书本身被吊销。最推荐的处理方向是在新服务器上配置好 DNS 解析后,使用 ACME 客户端重新申请证书,避免直接复制旧证书文件导致的权限不一致或路径错误风险。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

服务器迁移后 HTTPS 证书失效,通常是因为新服务器缺少证书私钥文件或域名 HTTP 验证请求无法到达新 IP,而不是证书本身被吊销。最推荐的处理方向是在新服务器上配置好 DNS 解析后,使用 ACME 客户端重新申请证书,避免直接复制旧证书文件导致的权限不一致或路径错误风险。

先说结论:迁移服务器不需要吊销旧证书,但为了环境一致性和自动化续期配置,建议在新服务器重新签发。

  • 适合:新服务器 IP 变更、Web 环境重装、旧证书私钥丢失场景
  • 先准备:确认域名 DNS 解析已指向新 IP、服务器 80/443 端口对公网开放
  • 验收:HTTPS 握手成功、浏览器锁标志正常、自动续期命令测试通过

命令速用版

如果新服务器已安装 Certbot,且域名解析已生效,可使用以下命令快速重新签发证书。此方法适用于 Nginx 或 Apache 环境,操作前请确保 80 端口未被防火墙拦截。

# 停止 Web 服务以释放 80 端口( standalone 模式需要)
sudo systemctl stop nginx

# 申请证书(替换 example.com 为你的域名)
sudo certbot certonly `--standalone` -d example.com -d www.example.com

# 启动 Web 服务
sudo systemctl start nginx

# 如果是 Webroot 模式,无需停止服务,指定网站根目录即可
# sudo certbot certonly `--webroot` -w /var/www/html -d example.com

为什么会这样

Let's Encrypt 证书绑定的是域名而非服务器 IP 地址,迁移本身不会导致证书吊销,但新环境缺少验证文件会导致签发失败。

证书失效的核心原因通常有两点:一是新服务器上没有部署旧的证书文件和私钥,导致 HTTPS 服务无法启动;二是重新申请时,ACME 协议要求的域名验证请求(HTTP-01 或 DNS-01)无法到达新服务器。直接复制旧证书文件虽然可行,但容易遗漏私钥权限设置或续期脚本配置,导致下次续期失败。

分步处理

按照以下步骤在新服务器重新部署证书,每一步完成后请执行对应的检查点,确保无误后再进行下一步。

步骤 1:确认 DNS 解析生效
在新服务器上使用 ping 或 dig 命令,确认域名已解析到新服务器 IP。如果 DNS 未生效,HTTP 验证请求会发送到旧服务器,导致申请失败。

ping example.com
# 确认返回的 IP 地址是新服务器公网 IP

步骤 2:安装 ACME 客户端
推荐使用 Certbot 或 acme.sh。Certbot 适合大多数 Linux 发行版,acme.sh 适合轻量级环境。不要手动下载证书文件,使用客户端管理便于后续自动续期。

# Ubuntu/Debian 安装 Certbot
sudo apt update
sudo apt install certbot

# CentOS/RHEL 安装 Certbot
sudo yum install certbot

步骤 3:申请证书
根据 Web 服务器运行状态选择 standalone 或 webroot 模式。如果 Nginx/Apache 正在运行且占用 80 端口,请使用 webroot 模式或临时停止服务。

# Webroot 模式示例(需确保 /var/www/html 可被公网访问)
sudo certbot certonly `--webroot` -w /var/www/html -d example.com

步骤 4:配置 Web 服务器
证书生成后,文件通常位于 /etc/letsencrypt/live/example.com/。修改 Nginx 或 Apache 配置文件,指向新的 fullchain.pemprivkey.pem 路径。

服务器迁移后 HTTPS 证书失效如何重新部署 Let's Encrypt?
# Nginx 配置片段示例
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

步骤 5:重载服务
配置修改完成后,重载 Web 服务使配置生效。不要直接重启服务,重载可以避免连接中断。

sudo nginx -t
sudo systemctl reload nginx

怎么验证是否生效

通过命令行工具和浏览器双重验证,确保证书链完整且协议握手正常。

命令行验证:使用 curl 或 openssl 检查 HTTPS 响应头和证书信息。

# 检查 HTTP 状态码是否为 301 或 200
curl -I https://example.com

# 查看证书有效期和颁发者
openssl s_client -connect example.com:443 | openssl x509 -noout -dates

浏览器验证:访问 https://域名,查看地址栏锁标志,点击锁图标确认证书由 Let's Encrypt 颁发且有效期正确。

自动续期验证:执行 dry-run 命令测试自动续期脚本是否配置正确,确保迁移后不会再次失效。

sudo certbot renew `--dry-run`

常见坑

在迁移和重新部署过程中,以下场景容易导致操作失败或后续隐患,请谨慎处理。

  • 防火墙拦截 80 端口:云服务器安全组或系统防火墙(ufw/firewalld)未放行 80 端口,导致 HTTP-01 验证失败。操作前请先确认端口开放。
  • 频率限制触发:Let's Encrypt 对同一域名每周有证书签发次数限制(通常为 5 次)。如果迁移过程中多次尝试失败,可能触发限制,需等待下周或使用 staging 环境测试。
  • 私钥权限错误:证书文件权限过于开放会导致 Web 服务拒绝启动。私钥文件权限应设置为 600,属主应为 root 或 Web 服务运行用户。
  • DNS 传播延迟:刚修改 DNS 解析后立即申请证书,可能因全球 DNS 缓存未更新导致验证请求仍指向旧 IP。建议修改 DNS 后等待几分钟再操作。

常见问题

可以直接复制旧服务器的证书文件到新服务器吗?

可以,但不推荐长期使用。直接复制 /etc/letsencrypt 目录能快速恢复服务,但容易遗漏续期脚本配置或导致权限不一致,建议恢复服务后尽快在新服务器重新签发。

重新申请证书会影响旧服务器上的 HTTPS 服务吗?

不会影响。Let's Encrypt 证书签发是基于域名验证的,新服务器申请新证书不会吊销旧服务器上的旧证书,旧证书在有效期内仍可正常使用。

提示频率限制错误怎么办?

如果提示 Rate Limited,说明本周对该域名签发次数已达上限。此时应检查配置无误后等待下周自动解除,或使用 Certbot 的 `--staging` 参数进行测试而不消耗正式配额。

参考来源