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
相关产品推荐
相关产品推荐

