ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Caddy 中间证书过期导致 HTTPS 报错:完整排查与根治指南

Caddy 中间证书过期导致 HTTPS 报错:完整排查与根治指南 Caddy 中间证书过期导致 HTTPS 报错完整排查与根治指南【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy生产环境的 Caddy 在一次例行升级后突然挂了浏览器打开站点直接提示NET::ERR_CERT_DATE_INVALID而caddy validate正常、日志里也看不到启动报错抓证书一看叶子证书的有效期居然还有大半年。影响范围是所有走 HTTPS 的域名监控面板上的成功率在十分钟内跌到零。快速止血先恢复服务再谈原因第一步确认 Caddy 实际吐给客户端的是哪条链openssl s_client -connect 你的域名:443 -servername 你的域名 -showcerts 2/dev/null | \ openssl x509 -noout -issuer -subject -dates目的定位到底哪一张证书过期叶子还是中间避免修错文件。第二步如果你配过storage或者想让 Caddy 接管签发先删掉手动tls静态证书块让自动 HTTPS 生效然后热重载caddy reload --config /etc/caddy/Caddyfile # 不断连重载reload 会失败时才需 restart目的Caddy 的 ACME 流程会自动拉取 CA 当前有效的完整链这是最快的恢复路径。第三步reload 不生效或有客户端长连接卡住时重启进程兜底systemctl restart caddy systemctl status caddy根因拆解Caddy 只认文件里写的链因果链是这样的CA 定期轮换中间证书R3 换 R10Lets Encrypt 大约每 4-5 年一次→ 你当年用cat leaf.crt intermediate.crt fullchain.pem拼好的链文件里中间那张已经过了有效期 → Caddy 加载静态证书时按文件原样加载不做链校验、不会自动补中间 → 浏览器用系统信任库验链时发现中间已过期 → 即使叶子证书还有效整条链也判定失败报CERT_DATE_INVALID。这里最关键的一点tls 证书文件 密钥文件这条指令走的是 PEM 文件加载器见 modules/caddytls/pemloader.go。它只做一件事——把文件内容读进来配对密钥链对不对、有没有过期一概不管。大白话讲你喂给 Caddy 一条半新鲜的链它就原封不动端给每个访客Caddy 不会替你悄悄换掉那张过期的中间。真正在握手侧选择证书的逻辑在 modules/caddytls/connpolicy.go它只是按 SNI 选已加载的证书不负责刷新内容。精准诊断一条命令确认是不是这个问题症状疑似原因验证命令叶子notAfter未过期但浏览器报日期错误链文件里的中间证书已过期openssl s_client -connect 域名:443 -showcerts逐张看Not Afters_client输出末尾有verify error:num10:certificate has expired同上的确认信号且客户端信任库也找不到有效签发者openssl verify -CAfile 域名.fullchain.pem 域名.leaf.pem只有部分客户端报错部分正常客户端信任库缓存了旧中间移动端/浏览器更明显本质还是链不对换一台设备 手机直连复现日志出现 ACME 签发失败但站点照常访问Caddy 回落到旧静态证书继续服务grep -i acme /var/log/caddy/caddy.log第三行是最迷惑人的现象iOS 和部分浏览器会缓存已见过的中间证书CA 轮换初期只有新客户端先挂容易造成时好时坏的错觉其实链文件从中间过期那一刻起就是坏的。根治方案两种改法选你证书的来源改法一继续用自签/自管证书——重建链文件。从 CA 官网下载当前有效的中间证书Lets Encrypt 在官网 certificates 页可下重建 fullchain# 顺序必须是 叶子在前、中间在后 cat example.com.crt intermediate-isrg-root-x1.crt example.com.fullchain.pem # 校验链完整性应输出 OK openssl verify -CAfile example.com.fullchain.pem (head -1 /dev/null; cat example.com.crt)改什么Caddyfile 中tls /path/fullchain.pem /path/key.pem的 fullchain 路径。为什么静态加载路径只认文件内容文件不换、故障永在。改后看到什么openssl s_client输出里每张证书都有效verify return code: 0 (ok)。改法二推荐把域名交给 Caddy 自动 HTTPS。删掉手动tls指令Caddy 通过 ACME 直接向 CA 申请CA 返回的链永远是当前有效的中间链文件这个中间产物直接消失。签发参数renewal window 等由 modules/caddytls/automation.go 中的RenewalWindowRatio控制默认取证书寿命的一定比例不需要手工干预。改后看到什么caddy list-modules正常且证书目录 modules/filestorage/filestorage.go 对应的存储路径下出现自动管理的证书与 key。改法三调宽自动续期窗口。自动 HTTPS 的域如果续期失败Caddy 会沿用旧证书直到过期静默风险不小。可以在tls指令块里显式设置renewal_window_ratio 0.2含义剩余寿命低于总寿命 20% 时提前重签把触发点从默认值拉宽给排障留时间。改后看到什么caddy log --level DEBUG里能看到obtaining certificate日志提前出现而不是临近过期才出现。长期预防监控与告警自动化层面只要域名走 ACME续期、链获取都由 modules/caddytls/acmeissuer.go 背后的流程闭环处理你要做的是保证 80 端口可达、邮箱告警能收到——续期前 Caddy 会向注册邮箱发通知收到即代表流程在跑。监控层面给站点加一条每天一次的链探测任务即可# crontab 每日探测链上任何一张过期就退出码非 0接邮件/短信告警 echo 0 8 * * * openssl s_client -connect 你的域名:443 -verify_return_error /dev/null 21 || curl -sSf https://你的域名 -o /dev/null /etc/crontab/caddy-cert-check核心指标只有一个s_client的verify return code是否为 0。它同时覆盖了叶子过期、中间过期、链缺失三种情况比单独看叶子notAfter可靠得多。把要点收拢成一句Caddy 对静态tls证书是文件即真相链文件里的中间证书过期它既不校验也不会换恢复靠换文件或回退自动 HTTPS根治靠让 ACME 闭环管证书外加每日一次verify return code: 0探测。相关入口modules/caddytls/tls.goTLS App 与应用配置、modules/caddytls/certmanagers.go各证书管理器实现、modules/caddytls/automation.go自动化策略。【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表