Я собираюсь загрузить изображение с Glide библиотекой, которая нуждается в https и proxy config. Я реализовал все анонимные сертификаты и настройки прокси для небезопасного клиента (в моей среде разработки), но получил ошибку рукопожатия. Это мой OkHttpClient , переданный Glide
val unsafeOkHttpClient: OkHttpClient
get() {
try {
val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
@SuppressLint("TrustAllX509TrustManager")
@Throws(CertificateException::class)
override fun checkClientTrusted(
chain: Array<java.security.cert.X509Certificate>,
authType: String
) {
}
@SuppressLint("TrustAllX509TrustManager")
@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 sslContext = SSLContext.getInstance("SSL")
sslContext.init(null, trustAllCerts, java.security.SecureRandom())
val sslSocketFactory = sslContext.socketFactory
val builder = OkHttpClient.Builder()
val proxy = Proxy(
Proxy.Type.HTTP,
InetSocketAddress.createUnresolved(PROXY_URL, PROXY_PORT)
)
builder.proxy(proxy)
builder.sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
builder.hostnameVerifier(HostnameVerifier { _, _ -> true })
val connectionSpecs = ConnectionSpec.Builder(ConnectionSpec.COMPATIBLE_TLS)
.tlsVersions(TlsVersion.TLS_1_2)
.cipherSuites(
CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
).build()
builder.connectionSpecs(listOf(connectionSpecs))
return builder.build()
} catch (e: Exception) {
throw RuntimeException(e)
}
}
. Следует отметить, что ConnectionSpe c получен из настроек моего сервера. И всегда я получаю эту ошибку: даже я использовал очень простой клиент, но результат тот же.
Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0xbe2b3c68: Failure in SSL library, usually a protocol error
error:10000410:SSL routines:OPENSSL_internal:SSLV3_ALERT_HANDSHAKE_FAILURE (external/boringssl/src/ssl/tls_record.cc:587 0xbe5d2a88:0x00000001)
error:1000009a:SSL routines:OPENSSL_internal:HANDSHAKE_FAILURE_ON_CLIENT_HELLO (external/boringssl/src/ssl/handshake.cc:580 0xd084f543:0x00000000)
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
at com.android.org.conscrypt.NativeSsl.doHandshake(NativeSsl.java:387)
at com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:226)
... 23 more
Я пробовал слишком много способов, например, исключить okHttp из glide и использовать сам OkHttp, понизить okHttp, обновить все библиотеки ( Дооснащение, Glide). Я нашел несколько постов здесь, но облако не позволяет ему работать.
https://github.com/square/okhttp/issues/3787
https://github.com/Microsoft/cpprestsdk/issues/650
ОБНОВЛЕНО
Как я уже говорил, все изображения открыты в браузере (с расширением прокси-сервера), а также я получил 200 с Curl следующим образом:
curl --insecure -x http://myProxy:9052 -i https://myimage.png
Но я узнаю, что версия TLS основного сервера и прокси-сервера не совпадают. Один использует TLS1.2 , а другой - TLS1.1 . Так что я думаю о том, может ли эта конфигурация привести к сбою рукопожатия, потому что мой запрос не будет знать рукопожатие с какой версией! Это мое предположение и уже спросил сетевой администратор: «Почему у нас есть два разных ограничения для сервера и прокси!» Я жду их ответа. Если у вас есть идеи, пожалуйста, не стесняйтесь добавлять комментарии или оставлять ответы.