拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Caddy HTTPS 证书链报错?3 条命令定位并强制续期修复

Caddy HTTPS 证书链报错?3 条命令定位并强制续期修复

Caddy HTTPS 证书链报错?3 条命令定位并强制续期修复

【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy

今天凌晨,生产环境的 Caddy HTTPS 服务直接不可用:浏览器报ERR_CERT_UNKNOWN_ISSUER,curl 也立刻断开。这台机器跑的是 Caddy 自动 HTTPS,证书明明显示还有 20 天才到期,整站却打不开了。这是一次典型的证书链故障,下面是我完整走一遍的排查与修复过程,照着做即可。

git clone caddy 仓库

先搞清根因:CA 换了"印章",你的链还是旧的

一句话根因:Let's Encrypt 这类 CA 会定期轮换中间证书(Intermediate CA),旧中间证书会停止受信任。Caddy 缓存里若还挂着旧链,即使叶子证书(浏览器实际校验的那张)没到期,信任链也在中间断掉,握手直接失败。

打个比方:根证书是总部公章,中间证书是分部章。总部换了分部章,分部还在盖旧章——单据本身没过期,但谁都不认了。

三步定位:一张表照着查

现象检查命令判断锚点
浏览器报ERR_CERT_UNKNOWN_ISSUER,证书详情里中间那张标红curl -vI https://你的域名 2>&1 \| grep error报错指向 issuer 而非有效期 → 链的问题,不是叶子过期
openssl 输出只有 1 张证书openssl s_client -connect 你的域名:443 -servername 你的域名 -showcerts </dev/null只看到 server 链、没有中间证书 → Caddy 下发的链不完整
日志里有failed to renew certificatejournalctl -u caddy -p info \&#124; grep -i renew有续期失败记录 → 先修续期失败,链才会自动刷新

看到"中间证书标红"或"链里缺一张",就可以直接跳到修复方案。

修复:强制续期,把新链拉回来

主推方案是一条命令让 Caddy 立即向 Let's Encrypt 换证,新链自然带上新中间证书,无需手改 Caddyfile:

caddy renew --force

备选方案:把签发源换成 Caddy 内置 CA(modules/caddytls/internalissuer.go)。链完全由本地掌控、不再受外部轮换影响,但外部浏览器不信任内部签发,只适合内网或隔离测试环境。

验证修复生效:一条命令看链是否完整

openssl s_client -connect 你的域名:443 -servername 你的域名 -showcerts </dev/null 2>&1 \&#124; grep -E "s:|i:|Verify return code"

预期输出长这样:

s:CN=你的域名 i:CN=E5,O=Let's Encrypt i:C=US,O=Internet Security Research Group,CN=ISRG Root X1 Verify return code: 0 (ok)

出现i:CN=E5(或当前对应的 Let's Encrypt 中间 CA)且Verify return code: 0 (ok),说明链已完整,问题修复。

长期避坑:三条配置层面的预防

  • 🔒 续期窗口别拉满。在 Caddyfile 里用renewal_window_ratio(可选值 0~1,越小越早换证)让 Caddy 提前换证书,从源头避开"叶子快过期才触发换链"的窗口期。该选项在 caddyconfig/httpcaddyfile/options.go 中解析,全局和单站点块都支持。
  • 👀 日志保持 info 级别并盯住 renew 关键词。续期失败、ACME 报错都会打出来,链断裂前通常有 1~2 条failed to renew日志,比浏览器报错早得多。
  • 📦 定期备份证书存储目录。Caddy 默认用storage file_system(见 modules/filestorage/filestorage.go)把证书链缓存在本地磁盘。目录丢了,缓存的链也就没了,换机器、重装前务必备份。

收尾

现在你可以:①caddy renew --force② 用 openssl 验证Verify return code: 0 (ok)③ 加一条grep -i renew的日志巡检。链断了不慌,让 Caddy 自己换回新链就好。

【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表