Ошибка при доверении HTTPS сертификата при использовании okhttp в Kotlin - PullRequest
0 голосов
/ 04 марта 2019

Я нашел много связанных с этим вопросов и перепробовал много вариантов.Но я не могу решить это.Я хочу отключить проверку сертификации при выполнении вызова API с помощью okhttp.

Ниже приведен код, который я пробовал

import okhttp3.OkHttpClient
import java.security.cert.CertificateException
import javax.net.ssl.SSLContext
import javax.net.ssl.TrustManager
import javax.net.ssl.X509TrustManager

    class UnsafeOkHttpClient {
    companion object {
        fun getUnsafeOkHttpClient(): OkHttpClient.Builder {
            try {
                // Create a trust manager that does not validate certificate chains
                val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
                    @Throws(CertificateException::class)
                    override fun checkClientTrusted(chain: Array<java.security.cert.X509Certificate>, authType: String) {
                    }

                    @Throws(CertificateException::class)
                    override fun checkServerTrusted(chain: Array<java.security.cert.X509Certificate>, authType: String) {
                    }

                    override fun getAcceptedIssuers(): Array<java.security.cert.X509Certificate> {
                        return arrayOf()
                    }
                })

                // Install the all-trusting trust manager
                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

                val builder = OkHttpClient.Builder()
                builder.sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
                builder.hostnameVerifier { _, _ -> true }

                return builder
            } catch (e: Exception) {
                throw RuntimeException(e)
            }
        }
    }
}

По запросу :

 fun getAppList(requestbody: AppListRequestBody, baseUrl: String): AppListResponse {

        val gson = GsonBuilder().create()
        val appListRequestInfo: String = gson.toJson(requestbody)
        val JSON = MediaType.parse("application/json")
        val appListBody: RequestBody = RequestBody.create(JSON, appListRequestInfo)
        val client =getUnsafeOkHttpClient().build

        var appListRequest: Request = Request.Builder()
                .url("$baseUrl/apps/mobile")
                .post(appListBody)
                .addHeader("Content-Type", "application/json")
                .build()
        val appResponse: Response = client.newCall(appListRequest).execute() //Getting syntax error
        if (!appResponse.isSuccessful) {
            Log.e("Exception =",appResponse.message())
            throw Exception(appResponse.code().toString())
        }
        Log.d("App list res",appResponse.body().toString())
        return Gson().fromJson(appResponse.body()!!.string(), AppListResponse::class.java)
    }

Я получаю исключение:

Response{protocol=http/1.1, code=404, message=Not Found}

Пожалуйста, помогите мне с этим. Кроме того, почему он показывает протокол как http, когда URL-адрес https?Есть ли способы установить это.Пожалуйста, помогите мне решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

В основном проблема была в теле запроса.Сопоставление класса данных с телом запроса имело некоторые проблемы. Именно поэтому он отображал ошибку 404.В любом случае получил решение

0 голосов
/ 04 марта 2019

Ваш getUnsafeOkHttpClient() возвращает OkHttpClient.Builder.

Заменить

    val client = getUnsafeOkHttpClient()

на

    val client = getUnsafeOkHttpClient().build()
...