网站已经下线,Certbot却还在尝试给它续期。第一反应可能是删掉live里的目录,让日志安静下来。这里先踩一脚刹车:同一份证书可能还被另一个站点、邮件服务或边缘入口使用。删文件很快,下一次服务重启才暴露问题,就不太好笑了。
本文讨论Certbot证书退役:确认停用、解除引用及删除谱系。实验仅为离线清单判断,不访问生产配置、不删真实证书,也不冒称线上验收通过。
一、先分清四件事:下线、停续期、删除与吊销
下线是业务入口不再提供服务;停续期是客户端不再为目标更新证书;删除是本地管理材料的变化;吊销则是向CA请求改变一张已签发证书的状态。它们不是同一个按钮。
| 动作 | 不能自动证明什么 |
|---|---|
| 删除DNS记录 | 旧地址、其他域名或现有连接不再访问入口 |
| 停掉全局续期任务 | 仅目标证书停止续期,其他证书不受影响 |
| Certbot delete | CA已吊销,所有副本和备份已销毁 |
| Certbot revoke | 本地谱系已删除,后续不会继续尝试续期 |
Certbot文档明确:delete不会自动先吊销证书;吊销后如果没有删除,后续renew仍会尝试续期。因此不能用“已吊销”代替退役收尾,也不该为了一个停用站点关闭整台机器的续期定时器。
二、按Certificate Name找谱系,不按网站名称猜目录
先在正确运行环境中列出Certbot管理对象。下面是只读查询模板;需要与实际安装方式、执行身份及自定义config-dir一致。本次没有运行真实Certbot,只验证了模板语法和参数。
certbot certificates
记录Certificate Name、Domains和证书路径。谱系是Certbot管理的证书版本及关联配置,其名称不必等于域名。多域名证书中某个域名下线,不代表整条谱系可删;仍使用的入口要先安排合适证书。
清单还要记录CDN、负载均衡、容器和邮件服务中的副本与责任人。一台主机查不到引用,不代表全局无人使用。
三、先解除服务引用,再让配置真正生效
官方删除说明要求先移除已安装服务配置对证书的引用,举例包括Apache、Nginx和Postfix。检查范围不只当前启用的站点文件,还包括待启用配置、生成模板、软链接和部署脚本,否则一次发布可能把旧引用带回来。
彻底下线的入口应关闭对应监听;继续服务的入口应换成名称、信任链合适的新证书,自签名不是公网信任的等价替代。配置检查、加载及入口验收通过后,再评审删除。

图示仅表示处理顺序。“引用已解除”必须由实际配置和入口测试支撑;本地删除不等于CA吊销,离线清单也不是生产安全证明。
四、用离线清单拦住共享依赖和未知状态
我在隔离实验中用了一个小判断函数:清单不完整或目标不唯一就返回UNKNOWN;仍有引用或未批准退役就KEEP;只有满足清单条件才给REVIEW_DELETE。最后一个状态只是“可人工评审”,刻意不叫SAFE,也不执行删除。
def retirement_gate(inventory, name):
if inventory.get("complete") is not True:
return "UNKNOWN"
rows = inventory.get("lineages")
if not isinstance(rows, list):
return "UNKNOWN"
found = [r for r in rows if isinstance(r, dict)
and r.get("name") == name]
if len(found) != 1:
return "UNKNOWN"
row = found[0]
refs = row.get("references")
if not isinstance(refs, list):
return "UNKNOWN"
if refs:
return "KEEP"
if row.get("retired") is not True:
return "KEEP"
return "REVIEW_DELETE"
sample = {"complete": True, "lineages": [{
"name": "site-a", "retired": True,
"references": ["edge-b"]
}]}
print(retirement_gate(sample, "site-a"))
sample["lineages"][0]["references"] = []
print(retirement_gate(sample, "site-a"))
运行结果依次是KEEP、REVIEW_DELETE。edge-b引用存在时,retired为真也不放行。测试还覆盖清单不完整、目标缺失或重复、引用缺值及未批准退役等负例,名字均为占位标签。
这个函数只检查台账门槛,不自动扫描服务,也不判断清单是否撒了谎。complete必须来自实际盘点,不能为了让脚本变绿随手填true。清单里的空列表与“根本没有采集”要分开,未知状态应阻止清理。
五、确认退役后用delete,不手工拆live和archive
Certbot官方明确不应手工删除其管理目录内的证书文件,应使用delete子命令。live、archive和续期配置之间有管理关联,只删某个文件容易留下悬空引用或不完整状态。执行前保留符合内部保留期限与访问控制要求的恢复材料;删除是不可逆操作,不能把没有验证过的备份当作兜底。
# 操作模板,不是可直接批量执行的清理脚本
# 替换为 certificates 输出中经人工核验的 Certificate Name
certbot delete --cert-name 'REPLACE_WITH_VERIFIED_CERT_NAME'
本次仅用参数捕获替身核验,没有执行真实删除。占位名不能照抄;查询与删除须指向同一管理目录。按交互提示核实目标,不自动批量确认或遍历全部谱系。
删除后重新查询目标是否消失,同时确认其他证书仍在正常续期范围。目标相关的自定义部署任务、分发副本和临时文件应单独复核;全局续期任务通常还服务其他证书,不要顺手停掉。
六、是否吊销另作判断,不拿删除当密钥泄露处置
单纯停用且私钥未泄露,不等于一定要按密钥泄露理由吊销。若私钥已经公开或被复制,应按泄露事件处理:替换受影响材料,并依据CA要求申请吊销。Let’s Encrypt说明吊销需证明授权,可通过签发账户、其他获授权账户或证书私钥等方式。
吊销的是具体证书,不是删除一个文件夹;同钥的其他证书也要评估。不要宣称所有客户端立即同步拒绝旧证书。本文没有调用ACME吊销接口,没有测试浏览器吊销行为,也没有验证远端副本销毁。
七、收尾验收要留对象、时间和证据
- 精确谱系名和关联域名已核对,共享入口已有处理结论。
- 配置引用和部署来源已排查,仍在线入口通过实际TLS与业务检查。
- 删除结果由Certbot清单独立读回,不以命令无输出代替验收。
- 其他谱系的续期任务保留;下一周期无目标残留失败且正常对象未受影响。
- 是否吊销、备份保留及副本处置分别记录,不混成一个“完成”。
先确认谁还依赖它,再动本地材料。保留UNKNOWN,比把未知依赖删成故障更有用。
八、参考资料与实验边界
以下官方资料在写作时实时读取。本文实测范围仅为Python离线状态判断和Shell模板语法、参数,不代表Certbot、CA或生产服务已经完成操作。
本文系统阐述网站下线后SSL证书的合规退役流程,聚焦Certbot管理下的证书停续期、引用解除、谱系删除与吊销决策。强调按Certificate Name追溯完整谱系,禁止手工删live/archive目录,须先验证全局引用再执行delete命令;明确下线、停续期、删除、吊销四者边界;提出离线清单驱动的REVIEW_DELETE状态机,保障共享依赖不被误删。内容严格限定于证书生命周期运维,不含开发或前端技术。
462

被折叠的 条评论
为什么被折叠?



