首页 > 解决方案 > 如何使用 Kotlin 和 Retrofit 在 Android 中绕过 HTTPS SSL 证书验证

问题描述

我正在尝试从 Android 客户端向节点服务器发送 POST 请求。我在创建 okhttpClient 时遇到 java.lang.ExceptionInInitializerError 错误,假设绕过 Android 的 SSL 证书验证过程

这是我的代码:

object RetrofitServiceBuilder {

    private val interceptor = run {
        val httpLoggingInterceptor = HttpLoggingInterceptor()
        httpLoggingInterceptor.apply {
            httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
        }
    }

    private val trustAllCerts : Array<X509TrustManager> = arrayOf(object : X509TrustManager {
        @Throws(CertificateException::class)
        override fun getAcceptedIssuers(): Array<X509Certificate>? = null
        override fun checkClientTrusted(certs: Array<X509Certificate>, authType: String) {}
        override fun checkServerTrusted(certs: Array<X509Certificate>, authType: String) {}
    })

    private val sslContext = SSLContext.getInstance("TLS").apply {
        init(null, trustAllCerts,  SecureRandom())
    }

    private val hostNameVerifier : HostnameVerifier =
        HostnameVerifier { hostname, session -> true; }

    private val client = OkHttpClient.Builder()
        .addInterceptor(interceptor)
            //This is the part where i get the error
        .sslSocketFactory(sslContext.socketFactory, trustAllCerts[0])
        .hostnameVerifier(hostNameVerifier)
        .build()

    private val retrofit = Retrofit.Builder()
        .baseUrl("https://xx.xxx.xxx.x:xxxx/")
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build()

    fun<T> buildService(service: Class<T>): T {
        return retrofit.create(service)
    }
}

任何人都知道如何正确编写此证书验证绕过代码?

标签: javaandroidkotlinsslhttps

解决方案


推荐阅读