Caddy 2配置客户域名HTTPS出现ERR_SSL_PROTOCOL_ERROR求助
Caddy按需TLS SSL协议错误排查指南
核心问题分析
你遇到的ERR_SSL_PROTOCOL_ERROR间歇性出现,本质是Caddy为新域名生成证书的流程中出现中断或超时,导致客户端发起HTTPS请求时,Caddy尚未完成证书获取,无法正常建立SSL连接。
具体排查与修复步骤
1. 验证On-Demand TLS的Ask端点有效性
你的ask地址app.example.com/tls-check必须满足以下要求:
- 对Caddy的请求返回200 OK(允许生成证书)或403 Forbidden(拒绝生成)
- 响应速度必须快(建议<1秒),如果端点超时,Caddy会直接终止证书申请流程,引发SSL握手失败
- 确保Caddy服务器能正常访问该端点,无防火墙、安全组或内部路由限制
测试方法:在Caddy服务器上执行:
curl -I app.example.com/tls-check?domain=test.example.com
确认返回状态码为200或403,且响应耗时极短。
2. 修正443端口的TLS配置
当前443块的写法存在问题:使用on_demand TLS时,不能直接监听:443,Caddy需要通过动态域名匹配来触发证书生成逻辑。正确配置应改为:
*:443 { tls email@example.com { on_demand } reverse_proxy * app.example.com { header_up Host {host} header_up X-Fwd-For {remote_host} header_up X-Fwd-Proto {scheme} header_up X-Caddy-Hash mysecret health_timeout 5s } }
3. 检查Redis证书存储的可用性
你使用Redis作为证书存储,如果Redis连接不稳定、权限不足或数据损坏,会导致Caddy无法读取/保存证书,引发间歇性失败。
测试Redis连接与读写权限:
redis-cli -n 0 GET caddy_ssl_certificates:test.example.com
如果返回错误,检查Redis的密码、端口、数据库编号配置,确保Caddy拥有读写权限。
4. 启用Caddy调试日志定位问题
间歇性问题必须通过日志排查,修改全局配置添加调试日志:
{ on_demand_tls { ask app.example.com/tls-check } storage redis caddy_ssl_certificates log { level debug output file /var/log/caddy/debug.log } }
然后实时查看日志:
tail -f /var/log/caddy/debug.log
重点关注包含on_demand、tls、certificate的日志条目,排查是否存在证书申请超时、Ask端点响应异常、Redis操作失败等信息。
5. 确认域名解析完全生效
客户的CNAME/A记录可能存在DNS缓存,导致部分地区/客户端解析未生效,引发间歇性访问失败。测试解析:
dig test.example.com +short
确认返回IP为你的Caddy服务器IP,也可通过多地区DNS检测工具验证解析一致性。
6. 调整按需TLS的超时配置
全局on_demand_tls可添加超时设置,避免因证书申请超时导致SSL握手失败:
{ on_demand_tls { ask app.example.com/tls-check timeout 10s # 延长超时时间,默认值可能偏短 } # 其他配置不变 }
额外测试建议
- 暂时关闭Redis存储,改用默认文件存储测试,若问题消失,说明Redis配置存在问题
- 修改配置后执行
caddy reload确保生效 - 检查服务器防火墙/安全组,确保80(ACME挑战端口)和443端口完全开放,无流量限流规则
内容的提问来源于stack exchange,提问作者TheNish
相关产品推荐
相关产品推荐

