Однако, в случае самоподписанного сертификата сервера, TLS соединение не будет установлено: будет ошибка "trust anchor for certification path not found"
В этом случае надо добавлять свой TrustManager и настраивать sslSocketFactory с сертом сервера.
Пример TrustManager с полным доверием всем сертам
(в этом случае sslpinning как в примере выше не сработает (ведь мы всем сертам доверяем))
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()
}
})
val client = OkHttpClient().newBuilder()
val sslContext = SSLContext.getInstance("TLS")
sslContext.init(null, trustAllCerts, null)
val sslSocketFactory = sslContext.socketFactory
client.sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
client.hostnameVerifier(HostnameVerifier {_, _ -> true})
Пример TrustManager с доверием только сертификату нашего сервера