Падает
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
При этом запрашиваемый домен домен имеет верифицированный сертификат.
Если бы речь шла о self-signed сертификате, то причина была бы ясна.
Объясните, что нужно делать чтобы можно было послать запрос на "нормальный" (верифицированный) домен?
UPDATE:
Так создается инстанс ретрофита:
init {
App.getComponent().inject(this)
val builder = OkHttpClient().newBuilder().socketFactory(getSSLConfig(App.getContext()).socketFactory)
builder.addInterceptor(httpInterceptor)
val client = builder.build()
retrofit = Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(Net.BASE_URL.value)
.client(client)
.build()
}
@Throws(CertificateException::class, IOException::class, KeyStoreException::class, NoSuchAlgorithmException::class, KeyManagementException::class)
private fun getSSLConfig(context: Context): SSLContext {
// Loading CAs from an InputStream
var cf: CertificateFactory? = null
cf = CertificateFactory.getInstance("X.509")
var ca: Certificate? = null
// I'm using Java7. If you used Java6 close it manually with finally.
context.resources.openRawResource(R.raw.certificate_ca).use({ cert -> ca = cf.generateCertificate(cert) })
// Creating a KeyStore containing our trusted CAs
val keyStoreType = KeyStore.getDefaultType()
val keyStore = KeyStore.getInstance(keyStoreType)
keyStore.load(null, null)
keyStore.setCertificateEntry("ca", ca)
// Creating a TrustManager that trusts the CAs in our KeyStore.
val tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm()
val tmf = TrustManagerFactory.getInstance(tmfAlgorithm)
tmf.init(keyStore)
// Creating an SSLSocketFactory that uses our TrustManager
val sslContext = SSLContext.getInstance("TLS")
sslContext.init(null, tmf.trustManagers, null)
return sslContext
}
При обращении к серверу получаю
Handshake failed. Что я делаю не верно?
Stacktrace:01-19 12:50:46.578 7161-7161/ru.rst.console W/System.err: javax.net.ssl.SSLHandshakeException: Handshake failed
01-19 12:50:46.579 7161-7161/ru.rst.console W/System.err: at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:423)
at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:281)
at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.java:251)
at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:151)
at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:195)
at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:121)
at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:100)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
01-19 12:50:46.580 7161-7161/ru.rst.console W/System.err: at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:120)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at ru.rst.console.base.http.HttpInterceptor.handleResponse(HttpInterceptor.kt:29)
at ru.rst.console.base.http.HttpInterceptor.intercept(HttpInterceptor.kt:25)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:185)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:135)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
01-19 12:50:46.582 7161-7161/ru.rst.console W/System.err: at java.lang.Thread.run(Thread.java:764)
Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0xa5522bc0: Failure in SSL library, usually a protocol error
error:10000066:SSL routines:OPENSSL_internal:BAD_ALERT (external/boringssl/src/ssl/tls_record.c:465 0xa3078e9f:0x00000000)
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
01-19 12:50:46.583 7161-7161/ru.rst.console W/System.err: at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:351)
... 27 more