У меня проблема с подключением к серверу в 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()
}