当前位置: 首页 > 知识库问答 >
问题:

带有OkHttp got握手错误的Https通过代理

李安歌
2023-03-14

我要用需要https和代理配置的Glide库下载image。我为不安全的客户端(在我的开发环境中)实现了所有匿名证书和代理设置,但得到了握手错误。这是传递给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

正如我提到的,所有的图像都在浏览器中打开(带有代理扩展),我也得到了200个带有Curl的图像,如下所示:

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

但是我发现主服务器和代理服务器的TLS版本是不一样的。一个使用TLS1.2,另一个是TLS1.1。所以我在想这个配置可能会导致握手失败,导致我的请求会不知道用哪个版本握手!这是我的猜测,并问网络管理员:“为什么我们有两个不同的限制服务器和代理!”我在等待他们的回应。如果你有任何想法,请随时添加评论或张贴任何答案。

共有1个答案

芮叶秋
2023-03-14

在与客户端的许多事情进行了斗争后,支持团队设置了一个有效的证书,使我的问题得到了解决。我的意思是他们没有使用自定义证书,但他们使用了一个无效的证书!这就是为什么我会出现手抖错误,在浏览器中,我们可以通过接受危险的响应性并单击继续按钮来传递这个错误。

 类似资料:
  • 我们有一个应用程序,它将一些xml数据发布到另一个应用程序,并通过ApacheWeb服务器(版本2.2.26)反向代理传输流量。我们观察到一些零星的代理错误(http响应代码500)-删除服务器的SSL握手错误。错误消息显示在apache web服务器错误日志中。 早些时候,我们使用sunOne网络服务器,我们没有注意到这个错误。我怀疑可能是apache网络服务器上的一些缺失配置导致了这个问题。这

  • 我试图使用一个自签名证书来配置Linphone Android中的TLS,以便能够与FreeSWITCH SIP服务器通信。但是SSL握手失败,出现以下错误: 通道[0x9EC3C000]:SSL握手失败:X509-证书验证失败,例如CRL、CA或签名检查失败,无法连接到[TLS://52.3.207.224:5061] 谁能建议如何调试这个问题?或者如何在Linphone Android中配置自

  • 我正在go中运行https web服务器。我正在使用angular web应用程序(Chrome浏览器)对其进行测试,该应用程序可以对web服务器进行ajax调用。 如果我不断地点击网络服务器,一切似乎都正常。但每当我让它闲置一段时间并点击web服务器时,来自浏览器的ajax调用都不会得到响应。我几乎总是在服务器日志中看到此日志行。 我可以确认IP地址是我的IP地址。 我像这样启动我的https服

  • 笔记: 最初我试图从使用如下代码 代码1: 错误: 在谷歌搜索之后,我发现您已经使用了SSL验证,使用适配器会话可以解决这个问题。但我仍然有错误,请找到下面的代码和错误 代码2: 错误:

  • 我正在尝试使用SSL证书将java客户端与JMX服务器连接。 但是不幸的是,这个连接给出了一个SSL握手错误。当我尝试使用< code >-DJ avax . net . debug = all 标志对此进行调试时,我在java客户端上得到以下错误消息。 2016-07-15T13:29:50.02-0700[APP/0]退出RMI更新清洁-[10.200.0.27:44445,javax.rmi

  • 我最近更换了我的工作计算机,在那里我测试了在Maven上运行的Web应用程序。目前,我在将Servlet连接到MySQL数据库时遇到了问题 编辑:我确信Servlet设法找到了数据库,但随后失败了 Edit2:这是我的POM文件