Envoy TLS配置引发SSL WRONG_VERSION_NUMBER错误求助
问题描述
配置Envoy将本地端口11610的Trino请求转发至指定主机,添加TLS配置后调用API时,Envoy日志显示主机已解析为正确IP,但出现以下TLS握手错误:
[source/extensions/transport_sockets/tls/ssl_socket.cc:191] [C29] handshake expecting read
[2023-05-17 04:14:24.357][911][debug][connection] [source/extensions/transport_sockets/tls/ssl_socket.cc:198] [C29] handshake error: 1
[2023-05-17 04:14:24.357][911][debug][connection] [source/extensions/transport_sockets/tls/ssl_socket.cc:226] [C29] TLS error: 268435703:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER
[2023-05-17 04:14:24.357][911][debug][connection] [source/common/network/connection_impl.cc:208] [C29] closing socket: 0
但使用curl携带相同TLS证书直接调用目标端点可正常工作。Envoy版本为1.15(支持TLSv1.2和1.3),目标服务器也兼容这些版本。当前Envoy的TLS配置片段如下:
tls_context: common_tls_context: validation_context: trusted_ca: filename: /etc/cacerts.pem tls_certificates: - certificate_chain: filename: "/etc/client.pem" private_key: filename: "/etc/client-key.pem" hosts: - socket_address: address: trino-gateway.path.com port_value: 443
可能的原因及解决方法
1. TLS配置位置错误
大概率是把TLS配置加到了监听(listener)的transport_socket中,而非集群(cluster)的transport_socket。如果是转发HTTPS请求,TLS配置应该放在集群侧,让Envoy作为客户端和目标服务器建立加密连接;若监听侧配置了TLS,意味着要求Trino给Envoy发HTTPS请求,但Trino可能实际发的是HTTP请求,导致协议不匹配,触发版本错误。
调整集群配置,确保transport_socket为tls类型并包含证书配置,监听侧若接收Trino的HTTP请求则用raw_buffer类型:
clusters: - name: trino-gateway-cluster connect_timeout: 0.25s type: STRICT_DNS lb_policy: ROUND_ROBIN transport_socket: name: envoy.transport_sockets.tls typed_config: "@type": type.googleapis.com/envoy.api.v2.auth.UpstreamTlsContext tls_context: common_tls_context: validation_context: trusted_ca: filename: /etc/cacerts.pem tls_certificates: - certificate_chain: filename: "/etc/client.pem" private_key: filename: "/etc/client-key.pem" hosts: - socket_address: address: trino-gateway.path.com port_value: 443
2. 显式指定TLS版本范围
虽然Envoy 1.15支持TLSv1.2和1.3,但默认协商的版本可能和目标服务器不兼容。可以在common_tls_context中强制指定版本范围:
common_tls_context: tls_params: tls_minimum_protocol_version: TLSv1_2 tls_maximum_protocol_version: TLSv1_3 # 其余配置保持不变
3. 验证证书配置一致性
确认Envoy加载的证书和curl使用的完全一致:
- 检查
/etc/cacerts.pem是否包含目标服务器的根CA证书(虽错误日志是版本问题,但可排除验证异常的可能) - 确保
client.pem和client-key.pem的权限正确,Envoy进程拥有读取权限(可执行chmod 644调整,或把Envoy用户加入证书所在组)
4. 配置SNI匹配
部分服务器要求SNI字段与域名匹配,可在TLS配置中添加sni字段:
tls_context: sni: trino-gateway.path.com # 其余配置保持不变
内容的提问来源于stack exchange,提问作者covfefe

