调用HTTPS API却收到"Client sent an HTTP request to an HTTPS server"错误求助
从你提供的curl verbose日志来看,客户端已完成TLSv1.3握手,且通过HTTP/2发送了合规的HTTPS请求,因此问题大概率出在服务器或中间网络层的配置上,以下是具体排查方向:
检查服务器端口监听配置
确认服务器443端口是否被错误配置为监听HTTP(非加密)请求而非HTTPS。例如Nginx/Apache的server块是否写成listen 443;(默认HTTP)而非listen 443 ssl;(HTTPS);或是后端服务的443端口实际只处理HTTP流量,却收到了经过TLS加密的请求。排查中间代理/负载均衡的配置异常
若请求经过CDN、负载均衡(如F5、Nginx反向代理),检查这些节点是否错误地将HTTPS请求转换为HTTP请求后转发至后端,而后端443端口仅支持HTTPS,导致后端判定收到了HTTP请求到HTTPS端口。验证HTTP/2协议兼容性
部分服务器框架对HTTP/2的处理存在问题,尝试强制curl使用HTTP/1.1发送请求,观察是否能正常响应:curl -vv --http1.1 --location 'https://test.wenzhi.com:443/operation/v1/test?Count=1&Az=xxx' \ --header 'Authorization: Basic xxxxxx='若HTTP/1.1请求正常,说明服务器的HTTP/2配置存在缺陷,比如未正确识别HTTP/2的
:scheme头。确认DNS解析与目标服务匹配
验证test.wenzhi.com解析的10.23.24.73确实是目标HTTPS服务的IP,而非仅提供HTTP服务的节点。可直接用IP加Host头测试,排除DNS问题:curl -vv --location 'https://10.23.24.73:443/operation/v1/test?Count=1&Az=xxx' \ --header 'Host: test.wenzhi.com' \ --header 'Authorization: Basic xxxxxx='检查SSL/TLS终止链路配置
若使用负载均衡层终止TLS,确认后端服务器是否被配置为接收HTTP流量,但负载均衡却将终止后的HTTP流量发送到了后端的HTTPS端口,导致后端误判请求类型。
内容的提问来源于stack exchange,提问作者张问之

