Caddy中间证书过期导致HTTPS报错?30秒定位加完整修复清单
【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy
浏览器标红、提示"您的连接不是私密连接",你打开证书详情一看,到期日还有一年多——这就是典型的 Caddy 中间证书过期引发的 Caddy HTTPS 报错。服务器证书明明在有效期内,信任链上却断了一环,Caddy 证书过期排查的关键就在于那枚"担保人"。本文按"定位、修复、防再发"三步走,配齐命令、Caddyfile 片段和监控规则,照着执行即可。
没过期的Caddy证书,为什么会触发浏览器安全警告
先看一张信任链示意。浏览器验证 HTTPS 的顺序是:叶子证书(你站点的证书)→ 中间证书 → 根证书。根证书预装在系统里,中间证书负责把前两者连起来。
问题出在:叶子证书的有效期由你控制,中间证书的寿命却由签发它的 CA 决定。Let's Encrypt 这类公共 CA 会定期轮换中间证书,旧的一旦到期,所有拿它签发的叶子证书就都"断供"了。Caddy 发证书时会把 CA 返回的完整链一起存下,但存储不会自动翻新,断供也就发生了。
30秒排查清单:怎么判断是不是中间证书的问题
按顺序过一遍,命中任意一条基本就能锁定原因。
第 1 步:命令行拉完整链。在服务器上执行:
openssl s_client -connect 你的域名:443 -showcerts < /dev/null输出里会按顺序列出服务器发出的每张证书。如果末尾出现unable to get local issuer certificate,且肉眼可见某张证书的 Not After 早于今天,说明它发的中间证书已经失效。
第 2 步:看浏览器的"证书路径"标签。Chrome 点地址栏的锁图标 → 证书 → 证书路径。中间那层显示"已过期"或路径断裂,而首层叶子证书日期正常,就是 Caddy 中间证书问题的标准画像。
第 3 步:查 Caddy 实际加载的证书。访问管理接口(默认http://127.0.0.1:2019),看config里tls段的connection_policies,确认生效的是哪份证书文件、指向哪个路径。如果文件本身链不完整,问题就出在存储的链文件上。
临时救急:手动换中间证书,10分钟恢复服务
适用场景:证书是第三方或自建 CA 签发的文件证书,Caddy 管不了它的更新。
1. 从 CA 官网下载最新中间证书(PEM 格式),例如 Let's Encrypt 在 letsencrypt.org/certificates 页面提供当前有效的 R 系列证书。
2. 拼完整链。把新的中间证书追加到你现有链文件末尾,形成"叶子 + 中间"的顺序——服务器必须把这个顺序原样发给客户端。
3. 指向新文件并重启。你的站点块里tls指向的正是这个链文件(语法见 TLS指令解析):
your.domain { tls /etc/certs/fullchain.new.pem /etc/certs/privkey.pem root * /var/www/html file_server }caddy reload --config Caddyfile改完不用重启进程,reload 即可。再用第 1 步的 openssl 命令复测:中间证书的到期日变成新值、Verify return code为 0(ok),就算修好了。
一劳永逸:确认Caddy自动续签在正常工作
适用场景:你用 ACME(Let's Encrypt 等)或内置tls internal签发,让 Caddy 自己拿证,就不用手动碰链文件。
Caddy 的自动 HTTPS 默认开启(autohttps.go 负责按站点注入策略),证书自动更新逻辑 会在到期前主动续签,新证书从 CA 拿回来时自带当时的完整链,天然免疫"旧中间证书"问题。
要确认这条路是通的:观察日志里是否出现过 "obtained certificate" 或 "renewed" 记录;再跑一次 openssl 诊断,确认链里是新一代中间证书。如果你希望它更早动手续签,全局renewal_window_ratio 0.2可以把更新窗口压到有效期的 20%,相当于留出 56 天的提前量。
长效保障:做完这3件事,Caddy证书就不用再管
1. 调紧更新窗口。在tls块加renewal_window_ratio 0.2,让续签提前发生,避免卡在到期边缘才发现链已轮换。
2. 固定存储路径并定期备份。证书落在默认的文件系统存储里(实现见 filestorage.go),全局配置指定路径:
{ storage file_system /var/lib/caddy/certs }定期执行caddy storage export --config Caddyfile --output certs-backup.tar,把证书存成 tar 归档到异地。换机器时用caddy storage import还原,链文件一个不少。
3. 开指标 + 接告警。全局加一行metrics,Prometheus 就能抓到证书到期时间戳。配一条 Alertmanager 规则(指标实现见 metrics.go):
groups: - name: caddy-certs rules: - alert: CaddyCertExpiringSoon expr: caddy_tls_certificate_expiry_timestamp_seconds - time() < 30 * 86400 for: 5m labels: severity: warning规则触发的含义:某张证书 30 天内到期却还没被自动续签,值得人工看一眼续签链路是否卡住。
写在最后
排查思路就一条线:链文件 → 加载策略 → 更新机制,先确认哪一环断了。关键动作是换链文件或确认自动续签正常;维护上盯住到期时间戳的告警,比等浏览器标红强。保持 Caddy 版本新,能少踩很多这类坑。
【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考