簡體   English   中英

通過 OkHttp 代理的 Https 出現握手錯誤

[英]Https through proxy with OkHttp got handshake error

我將使用需要https代理配置的Glide庫下載圖像。 我為不安全的客戶端(在我的開發環境中)實現了所有匿名證書和代理設置,但出現握手錯誤。 這是我傳遞給 Glide 的OkHttpClient

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)
        }

    }

我應該提到ConnectionSpec是從我的服務器配置中獲取的。 我總是收到這個錯誤:即使我使用了非常簡單的客戶端,但結果是一樣的。

 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

我嘗試了太多方法,例如從 glide 中排除 okHttp 並使用 OkHttp 本身、降級 okHttp、升級所有庫(改造、Glide)。我在這里找到了一些帖子,但雲無法使其工作。

https://github.com/square/okhttp/issues/3787

https://github.com/Microsoft/cpprestsdk/issues/650

更新

正如我提到的,所有圖像都在瀏覽器中打開(帶有代理擴展),而且我用 Curl 得到了 200,如下所示:

curl --insecure -x http://myProxy:9052 -i  https://myimage.png

但是我發現主服務器和代理服務器的 TLS 版本不一樣。 一個使用TLS1.2和其他的TLS1.1。 所以我在想可能這個配置會導致握手失敗導致我的請求不知道與哪個版本握手! 這是我的猜測,並且已經問過網絡管理員:“為什么我們對服務器和代理有兩個不同的限制!” 我在等待他們的回應。 如果您有任何想法,請隨時添加評論或發布任何答案。

在與客戶端的許多事情斗爭之后,支持的團隊設置了一個有效的證書,使我的問題得到解決。 我的意思是他們沒有使用自sigend證書,但他們使用了無效的證書 這就是為什么我收到握手錯誤的原因,在瀏覽器中我們可以通過接受危險的責任並單擊繼續按鈕來傳遞此錯誤。

因此,如果您看到相同的問題:握手錯誤,但您可以在瀏覽器中處理我的情況,請先檢查 SSL 證書以節省時間!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM