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

测试环境下Java-WebSocket客户端关闭SSL证书验证的实现问题

核心解决方案

你之前的配置不生效是因为java-websocket库的WebSocketClient不会默认使用HttpsURLConnection的全局SSL配置,需要手动将自定义的SSLContext绑定到客户端实例上,具体操作如下:

  1. 你已经实现的UnsafeX509ExtendedTrustManager类是可用的,同时适用于客户端场景,无需修改。
  2. 在实例化ApiWebSocketClient之后、调用connect()方法之前,添加SSL配置绑定逻辑:
// 你已有的实例化代码
this.apiWebSocketClient = new ApiWebSocketClient(urlWebSocket,headers);
logger.info("Has SSL support: " + this.apiWebSocketClient.hasSSLSupport());

// 新增SSL跳过校验配置
try {
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, new TrustManager[]{UnsafeX509ExtendedTrustManager.INSTANCE}, new SecureRandom());
    // 给WebSocket客户端设置自定义SSLSocketFactory
    apiWebSocketClient.setSocketFactory(sslContext.getSocketFactory());
    // 跳过主机名校验,避免域名/IP不匹配报错
    apiWebSocketClient.setHostnameVerifier((hostname, session) -> true);
} catch (NoSuchAlgorithmException | KeyManagementException e) {
    throw new RuntimeException("SSL配置初始化失败", e);
}

// 原有连接逻辑
this.apiWebSocketClient.connect();

常见问题补充

  • 如果使用的是较低版本的java-websocket库找不到setHostnameVerifier方法,可以在初始化SSLContext之后,加上你之前写的全局主机名校验跳过代码即可生效:
HostnameVerifier allHostsValid = (hostname, session) -> true;
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
  • 该配置仅可用于测试环境,生产环境请导入合法证书做校验,避免安全风险。

WebSocket自动化测试建议

  • WebSocket连接是异步过程,JUnit测试默认是同步执行,建议使用CountDownLatch做同步等待:在ApiWebSocketClient中添加CountDownLatch属性,onOpen触发时计数减1,测试代码中调用connect()之后执行latch.await(3, TimeUnit.SECONDS)等待连接完成再执行后续发消息逻辑,避免连接未建立就发送消息导致失败。
  • 消息接收校验也可以通过CountDownLatch实现:收到预期消息后计数减1,测试代码等待超时后判断是否收到对应消息。
  • 测试结束后主动调用close()方法关闭连接,避免端口占用。

内容的提问来源于stack exchange,提问作者Lea2501

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:36:07