Indy 10.6.2代理服务器触发浏览器ERR_HTTP2_PROTOCOL_ERROR问题咨询
核心原因:Indy TIdHTTPProxyServer 原生不支持HTTP/2协议
Indy 组件库的官方稳定版目前仅支持HTTP/1.x协议解析,当前主流网站默认开启HTTP/2,浏览器会优先发起HTTP/2请求到代理,代理无法识别HTTP/2的二进制帧结构,只会按HTTP/1.x的文本报文格式解析,直接出现协议解析错误,浏览器收到异常响应就会抛出ERR_HTTP2_PROTOCOL_ERROR。
代码配置额外叠加问题
- 缺少ALPN协议协商配置:HTTP/2需要在TLS握手阶段通过ALPN扩展协商
h2协议标识,你当前使用的TIdSSLIOHandlerSocketOpenSSL没有添加ALPN相关配置,无法和上游服务端完成HTTP/2协议协商,握手后服务端返回的HTTP/2帧会被代理直接判定为非法报文。 - TLS版本支持不足:你配置的SSL版本仅覆盖到TLS 1.2,当前大量HTTP/2站点强制要求TLS 1.3及以上版本,你使用的OpenSSL 1.0.2.18本身不支持TLS 1.3,无法满足站点的TLS版本要求,握手失败后也会触发协议错误。
- PassThrough配置逻辑冲突:你设置了
tempIO.PassThrough := True透传TLS报文,但Indy代理的前置逻辑依然会尝试解析请求头为HTTP/1.x格式,二进制的HTTP/2帧会被判定为非法请求直接中断连接。
临时规避方案
可以通过强制浏览器禁用HTTP/2验证问题,比如Chrome浏览器启动时添加启动参数--disable-http2,此时所有请求都走HTTP/1.1协议,代理可正常处理。如果要正式支持HTTP/2,需要替换Indy的代理组件,或者二次开发Indy的HTTP解析逻辑添加HTTP/2帧处理能力。
内容的提问来源于stack exchange,提问作者Realbitt
相关产品推荐
相关产品推荐

