调试Caddy中curl出现SSL错误14094438的问题
核对Caddy站点配置
确认你的Caddyfile中,service.internal.example.com的站点配置是否覆盖了localhost的监听场景。如果Caddy仅针对该域名配置了HTTPS站点,但未将localhost作为别名加入,当你用localhost加Host头请求时,Caddy可能匹配到默认的localhost站点(或未匹配到对应站点),返回的证书与请求的Host不匹配,触发SSL错误。可以尝试在站点配置中添加localhost作为额外域名:service.internal.example.com, localhost { # 原有配置 }强制指定SNI验证
部分情况下,仅设置Host头可能不会让curl正确发送SNI信息。尝试在curl命令中显式指定SNI,看是否能正常请求:curl https://localhost/ -H "Host: service.internal.example.com" -v --servername service.internal.example.com如果请求成功,说明之前的问题是SNI未正确发送导致Caddy返回了错误的证书。
检查Caddy证书关联与加载状态
进入Caddy容器,查看证书存储目录(默认路径为/data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/service.internal.example.com),确认证书文件(service.internal.example.com.crt和service.internal.example.com.key)存在且有效。
同时执行caddy list-config命令,查看当前加载的站点配置,确认service.internal.example.com的证书已正确绑定到443端口,且该端口监听的是0.0.0.0(确保localhost请求能被接收)。追踪Caddy实时请求日志
在发起curl请求的同时,查看Caddy的实时日志(可通过docker logs -f <caddy-container-name>查看),观察请求是否被正确路由到service.internal.example.com的站点。如果日志显示请求匹配到了其他站点(比如默认的:443站点),说明Host头的识别存在问题,需要调整Caddy的站点匹配优先级。验证容器内localhost的监听对象
在容器内执行ss -tulpn | grep 443,确认443端口是被Caddy进程监听,而非其他服务。如果存在其他服务占用443端口,localhost的HTTPS请求会被该服务处理,自然会出现证书不匹配的错误。
内容的提问来源于stack exchange,提问作者knite

