HTTPS连接KTOR服务报ERR_SSL_PROTOCOL_ERROR问题求助
问题根因
报错核心原因是HAProxy未在443端口完成SSL卸载,直接将TLS加密的原始流量透传给了仅监听HTTP明文协议的Ktor 8081端口。
Ktor收到的是二进制格式的TLS握手报文,无法解析为合法HTTP请求,因此抛出java.lang.IllegalArgumentException: invalid version format异常;浏览器侧发起HTTPS请求后未收到合法的TLS握手响应,最终返回ERR_SSL_PROTOCOL_ERROR。
你的架构思路是对的:HTTPS加解密逻辑完全可以放在反向代理层处理,Ktor本身不需要做任何HTTPS配置。
修复步骤
- 提前准备好域名的SSL证书文件,将证书(含完整中间证书链)、私钥合并为PEM格式文件,存放到HAProxy配置目录下(例如
/etc/haproxy/certs/your_domain.pem),将文件权限设置为600,属主调整为HAProxy运行用户,避免私钥泄露。 - 编辑HAProxy主配置文件(默认路径为
/etc/haproxy/haproxy.cfg),添加/修改443端口的前端监听和后端转发规则,参考配置如下:
frontend https_in # 关键:必须加ssl crt参数指定证书,才会在当前端口启用SSL终止 bind *:443 ssl crt /etc/haproxy/certs/your_domain.pem mode http # 传递必要的反向代理头,方便后端业务获取客户端真实信息 http-request set-header X-Forwarded-Proto https http-request set-header X-Forwarded-Port 443 http-request add-header X-Forwarded-For %[src] default_backend ktor_servers backend ktor_servers mode http server ktor_local 127.0.0.1:8081 check inter 5s rise 2 fall 3
- 配置修改完成后先执行语法校验:
haproxy -c -f /etc/haproxy/haproxy.cfg,终端输出Configuration file is valid后再重启HAProxy服务生效:systemctl restart haproxy。
避坑说明
- 90%以上的同类报错都是因为443端口的
bind配置遗漏了ssl crt 证书路径参数:缺省这个参数时HAProxy不会在443端口处理TLS协议,会把收到的所有流量当明文HTTP转发给后端,必然触发协议错误。 - 如果你的配置里给443前端/后端设置了
mode tcp,需要改回mode http:TCP模式下HAProxy只会做四层透传,不会做七层SSL卸载,同样会把加密流量直接转给后端Ktor。 - 配置生效后不需要调整任何Ktor侧代码,Ktor继续监听本地8081端口处理明文HTTP请求即可,所有HTTPS相关的握手、加解密逻辑全部由HAProxy完成。
内容的提问来源于stack exchange,提问作者dbuzin
相关产品推荐
相关产品推荐

