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

Kotlin中使用OkHttp连接无安全认证WebSocket的方法

解决OkHttp连接明文WebSocket(ws://)失败的问题

首先明确:ws:// 是明文WebSocket协议,本身不需要SSL加密,因此不存在“关闭SSL验证”的说法。你遇到的连接失败问题,大概率是OkHttp的配置限制了明文网络连接,或是运行环境(比如Android)默认禁止明文请求。

针对明文WebSocket(ws://)的解决方案

1. Android环境允许明文连接

如果是在Android平台,系统默认会阻止明文HTTP/WS请求,需在AndroidManifest.xml的application标签中添加配置:

<application
    ...
    android:usesCleartextTraffic="true">
    ...
</application>

2. 自定义OkHttp客户端(通用JVM/Android)

确保OkHttp客户端未被配置拦截明文请求,直接构建基础客户端即可:

val client = OkHttpClient.Builder()
    .build()

val request = Request.Builder()
    .url(socketUrl) // 传入ws://1.2.3.4
    .build()

webSocket = client.newWebSocket(request, webSocketListener)
client.dispatcher.executorService.shutdown()

若需忽略WSS的SSL验证(针对wss://地址)

如果是连接wss://地址时需要跳过证书验证,可通过自定义SSL配置实现:

// 信任所有证书的TrustManager
val trustAllCerts = arrayOf<X509TrustManager>(object : X509TrustManager {
    override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) {}
    override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {}
    override fun getAcceptedIssuers(): Array<X509Certificate> = emptyArray()
})

// 初始化SSLContext
val sslContext = SSLContext.getInstance("TLS")
sslContext.init(null, trustAllCerts, SecureRandom())

// 构建忽略SSL验证的OkHttp客户端
val client = OkHttpClient.Builder()
    .sslSocketFactory(sslContext.socketFactory, trustAllCerts[0])
    .hostnameVerifier { _, _ -> true } // 跳过主机名匹配验证
    .build()

// 发起WebSocket连接
val request = Request.Builder().url(socketUrl).build()
webSocket = client.newWebSocket(request, webSocketListener)
client.dispatcher.executorService.shutdown()

额外排查点

  • 确认Oracle Cloud安全组/防火墙已开放WebSocket服务器对应的端口(默认ws用80端口,自定义端口需手动放行)。
  • 再次用wscat -c ws://1.2.3.4验证服务器是否正常可连接,排除服务器端故障。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 01:22:11