Let’s Encrypt 的 90 天机制与到期时间查询
Let’s Encrypt 签发的免费证书统一只有 90 天有效期。这并非为了逼用户付费,而是安全上的刻意设计:更短的有效期意味着即使私钥泄露,攻击者能利用的时间窗口也更短,同时强制站点频繁轮换证书。对站长来说,真正要管理的是”到期前完成续期”这个动作,而不是证书本身是否昂贵。
到期时间可以从两个地方查询。其一,浏览器:访问站点后点击地址栏的锁形图标,展开”连接是安全的”详情,其中会显示证书的有效期起止时间。其二,命令行:用 openssl 直接向服务器发起 TLS 握手并读取证书日期,示例:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
输出中的 notAfter 就是证书过期时间,据此可推算剩余天数。把 example.com 换成你自己的域名即可。
手动续期步骤
手动续期的本质,是用原域名和原验证方式重新申请一次,拿到一张新的 90 天证书。流程与首次申请几乎一致:在工具里输入域名,选择 HTTP 或 DNS 验证并完成验证,下载或写入新证书,然后替换服务器上的证书文件。关键点在于”验证方式要与当前环境匹配”——例如服务器 80 端口可达就用 HTTP 验证,无法对外暴露则用 DNS 验证。手动续期适合偶尔救急,不适合长期依赖,因为 90 天一次的重复劳动极易遗漏。
自动续期配置
要避免过期,更稳妥的是自动续期。图形化工具的做法很直接:ToSSL 会在证书到期前 30 天自动发起续期,续期成功后自动替换证书并给出系统通知,站长几乎无需干预。脚本方案的思路则是把 ACME 客户端的续期命令交给定时任务周期执行,如 certbot 的 renew 配合 systemd timer、acme.sh 安装时自动写入的 cron。两者的共同点是:一旦配置成功,续期就是后台动作,人只在失败时被提醒。更完整的方案对比可看 SSL 证书自动续期三种方案对比。
续期后重载服务
新证书写入磁盘后,Web 服务并不会立刻生效,因为它还在内存里使用旧证书。你需要触发一次重载,让进程重新读取证书文件。Nginx 通常执行 nginx -s reload,Apache 通常执行 systemctl reload apache2,具体命令随发行版略有差异。重载是平滑的,不会中断现有连接。重载后建议再用 openssl 命令或浏览器确认返回的已是新证书。
续期失败排查
| 失败原因 | 典型表现 | 处理方向 |
|---|---|---|
| 80 端口不可达 | HTTP 验证超时 | 放行端口或改用 DNS 验证 |
| 域名解析变更 | 验证请求落到旧服务器 | 修正 A/AAAA 记录 |
| DNS API 密钥过期 | DNS 验证报鉴权失败 | 更新服务商密钥 |
| 触发速率限制 | 短时间内申请被拒 | 等待限制窗口,勿反复重试 |
| 客户端未运行 | 到期前无任何动作 | 确认进程/开机自启正常 |
DNS 验证相关的更多排查细节,可参考站内的 DNS 验证问题排查文档。
常见问答
- 续期会重新验证域名吗?会。每次续期都等于一次新的申请,仍要完成 ACME 验证,这是协议要求。
- 续期后旧证书要手动删除吗?不必。服务器只引用当前配置的证书路径,旧文件可保留,等确认新证书正常后再清理。
- 90 天能不能延长?不能,这是 Let’s Encrypt 的固定策略,只能通过持续续期来滚动维持。
- 到期前多久续期合适?图形化工具通常提前 30 天,脚本方案建议提前 15 天以上,给失败重试留出缓冲。
若想了解证书已过期后的处理,可参考 SSL 证书过期恢复指南;自动续期的具体配置可看 自动续期文档。