您的位置:

关于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())

这个代码片段会忽略证书验证,请注意在生产环境中使用更严格的证书验证方式。