在Caddy代理前部署Traefik反向代理遇SSL问题求助
解决Traefik TCP透传Caddy时的SSL握手失败问题
核心问题诊断
从openssl输出看,TLS握手返回fatal internal_error且无证书返回,说明Traefik未正确将TLS流量透传给Caddy,或Caddy无法识别请求的SNI域名并提供对应证书。结合配置分析,主要存在TCP路由未关联入口点、HTTP/3(UDP)路由配置不完整两个关键问题。
解决方案
1. 修正Caddy的Traefik标签配置
更新docker-compose.yml中Caddy的labels,补全TCP路由的入口点关联,以及完整配置UDP路由:
services: caddy: # ... 其他配置不变 labels: traefik.docker.network: traefik traefik.enable: "true" # TCP路由配置(处理HTTPS流量) traefik.tcp.routers.api-v2-caddy.entrypoints: https traefik.tcp.routers.api-v2-caddy.rule: HostSNI(`show.api.localhost`) traefik.tcp.routers.api-v2-caddy.tls: "true" traefik.tcp.routers.api-v2-caddy.tls.passthrough: "true" traefik.tcp.services.api-v2-caddy.loadbalancer.server.port: "443" # UDP路由配置(处理HTTP/3流量) traefik.udp.routers.api-v2-caddy.entrypoints: http3 traefik.udp.routers.api-v2-caddy.rule: HostSNI(`show.api.localhost`) traefik.udp.services.api-v2-caddy.loadbalancer.server.port: "443" # ... 其他配置不变
- 给TCP路由添加
entrypoints: https,确保Traefik从443端口接收TCP流量并转发 - 补全UDP路由的
rule和service配置,让Traefik将HTTP/3的UDP流量转发到Caddy的443 UDP端口
2. 验证Caddy的TLS配置
确保Caddy的Caddyfile已正确配置show.api.localhost的证书,例如:
show.api.localhost { tls internal # 本地开发用自签名证书,或指定证书路径 reverse_proxy php:9000 mercure { # 你的Mercure配置 } }
由于Traefik做TLS透传,所有TLS握手由Caddy处理,Caddy必须能识别该SNI域名并提供有效证书。
3. 检查网络与配置生效
- 确认Traefik容器已加入
traefik网络 - 重启Traefik和Caddy容器,确保配置生效:
docker-compose down && docker-compose up -d
4. 验证HTTP/3支持
HTTP/3依赖UDP端口,确保Traefik的http3入口点配置正确,且Caddy版本为v2.6+(默认支持HTTP/3)。
验证测试
重新执行以下命令测试TLS握手:
openssl s_client -connect show.api.localhost:443 -servername show.api.localhost -msg
若握手成功,会显示Caddy返回的证书信息。
内容的提问来源于stack exchange,提问作者TobyG
相关产品推荐
相关产品推荐

