关于okhttp的SSLPeerUnverifiedException("peer not authenticated")
发布时间:2023-01-16 08:40:01
报错的原因在Kotlin中使用OkHttp发送HTTPS请求时出现的原因可能是证书验证失败。这可能是由于使用的证书不受信任或过期,或者是服务器的证书配置问题。可以检查使用的证书是否有效,或者尝试更新证书或配置服务器证书以解决问题。使用例子是的,下面是一个在 Kotlin 中使用 OkHttp 发送 HTTPS 请求的示例代码,它使用了上面提到的自定义 TrustManager 的方法这个代码片段会忽略证书验证,请注意在生产环境中使用更严格的证书验证方式。
报错的原因
在Kotlin中使用OkHttp发送HTTPS请求时出现SSLPeerUnverifiedException("peer not authenticated")的原因可能是证书验证失败。这可能是由于使用的证书不受信任或过期,或者是服务器的证书配置问题。可以检查使用的证书是否有效,或者尝试更新证书或配置服务器证书以解决问题。
如何解决
解决这个问题的一种方法是在请求中使用自定义的X509TrustManager来替换默认的TrustManager。
1.首先需要创建一个类来实现 X509TrustManager
2.然后在okhttp的配置中配置我们自己的X509TrustManager
3.最后用这个配置来创建 okhttpClient
附上代码:
val trustAllCerts = arrayOf(object : X509TrustManager {
override fun checkClientTrusted(chain: Array?, authType: String?) {
}
override fun checkServerTrusted(chain: Array?, authType: String?) {
}
override fun getAcceptedIssuers(): Array {
return arrayOf()
}
})
val sslContext = SSLContext.getInstance("SSL")
sslContext.init(null, trustAllCerts, java.security.SecureRandom())
val sslSocketFactory = sslContext.socketFactory
val builder = OkHttpClient.Builder()
builder.sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
builder.hostnameVerifier { _, _ -> true }
val okHttpClient = builder.build()
需要注意的是,这种方法会忽略所有的证书验证,因此可能会存在安全隐患。在生产环境中建议使用更严格的证书验证方式。
使用例子
是的,下面是一个在 Kotlin 中使用 OkHttp 发送 HTTPS 请求的示例代码,它使用了上面提到的自定义 TrustManager 的方法:
val client = OkHttpClient.Builder().apply {
val trustAllCerts = arrayOf(object : X509TrustManager {
override fun checkClientTrusted(chain: Array?, authType: String?) {
}
override fun checkServerTrusted(chain: Array?, authType: String?) {
}
override fun getAcceptedIssuers(): Array {
return arrayOf()
}
})
val sslContext = SSLContext.getInstance("SSL")
sslContext.init(null, trustAllCerts, java.security.SecureRandom())
val sslSocketFactory = sslContext.socketFactory
sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
hostnameVerifier { _, _ -> true }
}.build()
val request = Request.Builder()
.url("https://your.server.com")
.build()
val response = client.newCall(request).execute()
println(response.body()?.string())
这个代码片段会忽略证书验证,请注意在生产环境中使用更严格的证书验证方式。