IBM JDK 1.8搭配Apache Geode 1.15.1连接Gemfire定位器遇SSL协议版本错误
解决方案:IBM JDK 8u341搭配Apache Geode 1.15.1的SSL握手协议版本问题
问题背景
将Gemfire客户端从Apache Geode 1.12.1升级至1.15.1后,使用Linux系统上的IBM JDK 1.8.0_341连接定位器时出现javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version错误。调试发现Geode 1.15.1的ClientHello仅发送TLSv1.3协议版本,而1.12.1版本发送的是TLSv1.2;尝试设置https.protocols、jdk.tls.client.protocols等JVM系统属性无法解决问题,但Oracle JDK 8u321/11搭配1.15.1可正常连接,且必须使用IBM JDK。
根因分析
- Apache Geode 1.15.1默认启用了TLSv1.3支持,但IBM JDK 8的TLSv1.3实现与Oracle JDK存在差异,且服务器端可能未开启TLSv1.3支持。
- Geode的
SocketCreator组件有独立的SSL配置逻辑,会覆盖部分JVM默认的SSL协议设置,导致常规JVM系统属性不生效。
可行解决方案
1. 强制Geode客户端使用TLSv1.2协议
直接在Geode客户端配置中指定SSL协议,覆盖其默认设置:
- 通过配置文件:在
gemfire.properties中添加:ssl-protocols=TLSv1.2 - 通过代码配置:初始化客户端时设置
SocketCreator的SSL协议参数:import org.apache.geode.internal.net.SocketCreator; // 获取默认SocketCreator实例并强制指定TLSv1.2 SocketCreator socketCreator = SocketCreator.getDefaultInstance(); socketCreator.setSslProtocols("TLSv1.2");
2. 禁用IBM JDK的TLSv1.3支持
使用IBM JDK特有的系统属性禁用TLSv1.3,强制客户端仅使用TLSv1.2及以下协议:
在JVM启动参数中添加:
-Dcom.ibm.jsse2.disableTLSv13=true
3. 确认服务器端SSL协议配置
检查Gemfire定位器/服务器的ssl-protocols配置,确保包含TLSv1.2(通常旧版本服务器默认支持),例如服务器端gemfire.properties中应有:
ssl-protocols=TLSv1.2
验证方法
添加JVM启动参数开启SSL调试,确认ClientHello的supported_versions包含TLSv1.2:
-Djavax.net.debug=ssl:handshake
内容的提问来源于stack exchange,提问作者Sagar
相关产品推荐
相关产品推荐

