Nginx反向代理Mercure Hub(Caddy)出现TLS握手无对应证书错误如何解决
问题根本原因是TLS握手阶段的SNI不匹配导致的。你配置的Caddy证书仅对mercure-hub-domain.com生效,当Nginx发起代理请求时,默认会把proxy_pass中填写的地址(127.0.0.1或者你的域名解析后的IP)作为SNI发送给Caddy,Caddy找不到对应IP的证书就抛出报错。你在Nginx中设置的Host头是HTTP层面的参数,不会影响TLS握手阶段的SNI传递,所以之前的配置不生效。
以下是两种可行解决方案,优先推荐第一种:
方案1(推荐):本地回环流量走HTTP,避免TLS校验
本机内部的代理流量不需要加密,直接走Caddy的HTTP端口即可,完全规避证书匹配问题:
- 修改Nginx配置的
location /块,把proxy_pass https://127.0.0.1:3000;替换为proxy_pass http://127.0.0.1:3001;,其余配置保持不变 - 重载Nginx配置:
nginx -s reload
修改完成后即可正常访问。
方案2:保留HTTPS代理,手动指定SNI
如果你必须走HTTPS代理,需要在Nginx配置中显式指定TLS握手的SNI参数:
在Nginx的location /块中添加以下两行配置:
proxy_ssl_server_name on; proxy_ssl_name $host;
修改后完整的location块配置如下:
location / { proxy_pass https://127.0.0.1:3000; proxy_read_timeout 24h; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_connect_timeout 300s; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Proto $scheme; # 新增以下两行 proxy_ssl_server_name on; proxy_ssl_name $host; }
修改完成后重载Nginx配置即可。
内容的提问来源于stack exchange,提问作者Rubix
相关产品推荐
相关产品推荐

