Https через прокси с OkHttp получил ошибку рукопожатия - PullRequest
0 голосов
/ 28 февраля 2020

Я собираюсь загрузить изображение с 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 . Так что я думаю о том, может ли эта конфигурация привести к сбою рукопожатия, потому что мой запрос не будет знать рукопожатие с какой версией! Это мое предположение и уже спросил сетевой администратор: «Почему у нас есть два разных ограничения для сервера и прокси!» Я жду их ответа. Если у вас есть идеи, пожалуйста, не стесняйтесь добавлять комментарии или оставлять ответы.

1 Ответ

0 голосов
/ 28 марта 2020

После многих проблем со стороны клиента команда поддержки установила действительный сертификат , который решил мою проблему. Я имею в виду, что они не использовали self-sigend сертификат, но они использовали недействительный сертификат ! Вот почему я получил ошибку дрожания рук, и в браузере мы можем передать эту ошибку, приняв ответственность за опасность и нажав кнопку продолжить.

Так что, если вы видите ту же проблему: ошибка рукопожатия, но вы можете продолжить ее в браузере с помощью моя ситуация позволяет сначала проверить SSL-сертификат, чтобы сэкономить время!

...