Как настроить сертификат для модификации для разрешения ошибки SSL рукопожатие прервано: ssl = 0xb8feeda8: Сбой в библиотеке SSL - PullRequest
0 голосов
/ 15 января 2020

У меня проблема с подключением к серверу в android 4 и 7. Я обнаружил, что должен установить сертификат вручную в конфигурации дооснащения. Я сделал это, но моя проблема не решилась. Я поместил свой файл сертификата в папку ресурсов. Я сохраняю его как с расширением .crt, так и без него, но пока не работаю. Даже когда я определяю свой сертификат как строку, я получаю ту же ошибку рукопожатия.

@Singleton
@Provides
fun createCertificate():SSLContext?{

    val str="-----BEGIN CERTIFICATE-----\n" +
            "MIIErTCCA5WgAwIBAgISA36EjZSMJL1bSyzz1Jq59PdQMA0GCSqGSIb3DQEBCwUA\n" +
            "MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD\n" +
            "OstcZk3t5KrES2oxJme4BT5mUyWRGxfkgBM8TjxWY+NCgvQbl5dhTEx0+Ykld5pJ\n" +
            "zQ==\n" +
            "-----END CERTIFICATE-----"
    val caInput  = ByteArrayInputStream(str.toByteArray())
    val cf: CertificateFactory = CertificateFactory.getInstance("X.509")
 //   val caInput: InputStream =app.getResources().openRawResource(R.raw.cert)
    val ca: X509Certificate = caInput.use {
        cf.generateCertificate(it) as X509Certificate
    }

    val keyStoreType = KeyStore.getDefaultType()
    val keyStore = KeyStore.getInstance(keyStoreType).apply {
        load(null, null)
        setCertificateEntry("ca", ca)
    }

    val tmfAlgorithm: String = TrustManagerFactory.getDefaultAlgorithm()
    val tmf: TrustManagerFactory = TrustManagerFactory.getInstance(tmfAlgorithm).apply {
        init(keyStore)
    }

    val sslContext: SSLContext = SSLContext.getInstance("TLS").apply {
        init(null, tmf.trustManagers, null)
    }

    return sslContext

}

@Singleton
@Provides
fun provideOkHttpClient(sslContext: SSLContext?):OkHttpClient.Builder{

    val httpClientBuilder=OkHttpClient.Builder()
        .readTimeout(60, TimeUnit.SECONDS)

    if(sslContext!=null){
        httpClientBuilder.sslSocketFactory(sslContext.socketFactory,JavaUtil.systemDefaultTrustManager())
    }
    return httpClientBuilder
}

@Singleton
@Provides
fun provideRetrofitBuilder(httpClientBuilder:OkHttpClient.Builder): Retrofit{
    return Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addCallAdapterFactory(LiveDataCallAdapterFactory())
        .addConverterFactory(GsonConverterFactory.create())
        .client(httpClientBuilder.build())
        .build()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...