You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地正常、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,提问作者김시용

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:05:22