Kotlin 中的 OKhttp 自签名证书 Android

OKhttp Self sign certificate in Kotlin Android

我正在为一个使用自签名 SSL 证书的 Android Kotlin 项目工作。

我使用 Okhttp 连接服务器,但是当我尝试访问服务器 IP 时我的应用程序崩溃了,错误提示我需要自签名证书才能访问。

我已经通过搜索互联网资源做了很多测试,但没有一个适用于我的代码。检查我的以下代码并建议我进行更好的修复。

请注意 URL 我放在这里只是为了示例。

val client = OkHttpClient()
var url = "https://00.00.00.000"

            val requestBody = FormBody.Builder()
                    .add("phone", "+9500000000")
                    .add("token", "03AGdBq26rMv")
                    .build()

            val request = Request.Builder().url(url)
                    .header("User-Agent", "OkHttp Headers.java")
                    .addHeader("Content-Type", "application/json")
                    .addHeader("Accept", "application/json")
                    .post(requestBody)
                    .build()
            val response = client.newCall(request).execute()
            return response.body?.string().toString()
            println("Response" + response.body?.string().toString())

此示例让您使用自签名证书连接到已知的开发服务器。

https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/kt/DevServer.kt

  val clientCertificates = HandshakeCertificates.Builder()
      .addPlatformTrustedCertificates()
      .addInsecureHost(server.hostName)
      .build()

  val client = OkHttpClient.Builder()
      .sslSocketFactory(clientCertificates.sslSocketFactory(), clientCertificates.trustManager)
      .build()

当我在建立客户端连接之前放置这几行代码时,以下代码对我有用。

//set self sign certificate
                val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
                    override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) {
                    }

                    override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {
                    }

                    override fun getAcceptedIssuers() = arrayOf<X509Certificate>()
                })
                val sslContext = SSLContext.getInstance("SSL")
                sslContext.init(null, trustAllCerts, java.security.SecureRandom())
                
// Create an ssl socket factory with our all-trusting manager
   val sslSocketFactory = sslContext.socketFactory

// connect to server
val client = OkHttpClient.Builder().sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager).hostnameVerifier{ _, _ -> true }.build()