Pulsar 3.1.0对接仅支持TLSv1.3的Keycloak时出现protocol_version错误
问题描述
我们搭建了启用OIDC认证的Pulsar 3.1.0集群,运行正常,但对接仅支持TLSv1.3的Keycloak实例时,出现fatal alert: protocol_version错误。
调试TLS握手过程发现:
- 初始通信正常,
ClientHello.extensions.supported_versions.versions和ServerHello.extensions.supported_versions.selected_version的值均为TLSv1.3 - 问题出现在日志打印
org.apache.pulsar.functions.worker.Workerutils - Create Pulsar Admin to service ...之后,此时AsyncHttpClient启动的TLS握手失败,对应的ClientHello.extensions.supported_versions.versions为TLSv1.2
已尝试设置PULSAR_EXTRA_OPTS环境变量添加JVM参数,但未生效(已确认环境变量已配置),使用的参数为:
PULSAR_EXTRA_OPTS="-Dhttps.protocols=TLSv1.3 -Dhttps.client.protocols=TLSv1.3 -Djdk.tls.client.protocols=TLSv1.3 -Djavax.net.debug=ssl:handshake"
需求:
- 是否有其他方式强制指定TLS版本?
- 这是否是已知问题,有无可行解决办法?
解决思路与方案
1. 显式配置Pulsar客户端的TLS协议
Pulsar Worker的AsyncHttpClient可能未继承全局JVM参数,需在配置文件中直接指定TLS版本:
- 对于Worker节点,修改
conf/functions_worker.yml,添加或更新:
pulsarAdminClient: tlsProtocols: ["TLSv1.3"]
- 对于Broker节点,修改
conf/broker.conf:
pulsarClientTlsProtocols=TLSv1.3
修改后重启对应服务。
2. 确认JDK版本兼容性
TLSv1.3要求JDK 11及以上版本支持,先检查当前Pulsar运行环境的JDK版本:
java -version
如果使用JDK 8,即使设置参数也无法启用TLSv1.3,必须升级到JDK 11或更高版本。
3. 直接修改启动脚本的JVM参数
如果PULSAR_EXTRA_OPTS未生效,可能是启动脚本未正确加载该变量,直接修改Pulsar启动脚本(如bin/pulsar),在JVM参数部分添加:
-Dhttps.protocols=TLSv1.3 -Djdk.tls.client.protocols=TLSv1.3
保存后重启Pulsar服务。
4. 已知问题说明
Pulsar 3.x版本中存在AsyncHttpClient未继承全局JVM TLS参数的场景,社区反馈通过显式配置客户端TLS协议可解决此类问题。
内容的提问来源于stack exchange,提问作者Davidas
相关产品推荐
相关产品推荐

