OKhttp Kotlin Android 中的自签名证书

问题描述 投票:0回答:2

我正在为一个具有自签名 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())
android kotlin ssl okhttp self-signed-certificate
2个回答
3
投票

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

//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()

0
投票

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

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()
© www.soinside.com 2019 - 2024. All rights reserved.