本地正常、Dev环境调用Slack Webhook报SSLException问题求助
解决Java 7调用Slack Webhook时的
javax.net.ssl.SSLException: Unsupported record version Unknown-0.0异常 问题场景
开发批处理应用通过Slack Webhook API发送消息,本地Java 7u80环境调用正常,但Dev环境(Jenkins构建的Linux批处理)抛出以下异常:
javax.net.ssl.SSLException: Unsupported record version Unknown-0.0 at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:524) at sun.security.ssl.InputRecord.read(InputRecord.java:506) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:934) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1092) 2022-11-21 18:51:08 [ERROR] javax.net.ssl.SSLException: Unsupported record version Unknown-0.0
本地与Dev环境均使用java.version 1.7.0_80、java.class.version 51.0,已尝试设置https.protocols、禁用SNIExtension、指定TLSv1.2 SSLContext、使用JDK8构建等方案,均未解决。
可行解决思路
1. 排查Dev环境的SSL网络拦截
该异常常因网络层的SSL拦截(如企业防火墙的SSL Inspection)导致,拦截设备返回不符合TLS规范的响应:
- 在Dev服务器上执行
openssl s_client -connect hooks.slack.com:443,对比本地执行结果,检查证书链、握手协议是否正常。 - 如果存在SSL拦截,需将拦截设备的根证书导入到Dev环境Java的信任库(
$JAVA_HOME/jre/lib/security/cacerts),命令示例:keytool -import -alias proxy-cert -file /path/to/proxy-root.crt -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
2. 确保JVM参数正确传递并生效
代码中设置系统属性可能在URLConnection初始化后才生效,需在Java启动命令中直接指定参数:
- 修改Jenkins构建脚本中的启动命令,明确添加TLS 1.2参数:
java -Dhttps.protocols=TLSv1.2 -Djsse.enableSNIExtension=false -jar your-batch-app.jar - 验证参数是否生效:在代码中添加
System.out.println(System.getProperty("https.protocols")),确认输出为TLSv1.2。
3. 升级Java 7至最新补丁版本
Java 7u80存在较多已知SSL握手bug,升级到Java 7的最新补丁版本(如7u301)可修复部分兼容性问题,同时保留Java 7的运行环境。
4. 手动强制指定TLS 1.2的SSLSocketFactory
在创建HttpsURLConnection前,手动初始化SSLContext并设置为默认工厂:
SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); sslContext.init(null, null, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); // 禁用SNI扩展 System.setProperty("jsse.enableSNIExtension", "false");
5. 检查Jenkins环境变量
确认Jenkins构建环境是否存在影响SSL的环境变量(如JAVA_TOOL_OPTIONS),避免覆盖自定义JVM参数:
- 在构建脚本中添加
echo $JAVA_TOOL_OPTIONS查看当前设置,如有冲突需调整。
内容的提问来源于stack exchange,提问作者김시용
相关产品推荐
相关产品推荐

