【问题标题】:SSLProtocolException (OkHttp 3 on Android) thrown during SSLv3 handshake when the app should use TLS当应用程序应使用 TLS 时,在 SSLv3 握手期间引发 SSLProtocolException(Android 上的 OkHttp 3)
【发布时间】:2021-03-27 07:11:59
【问题描述】:

我需要与用 Kotlin 编写的 Android 应用程序 (Android API 24) 中的第 3 方 API 交互。我有 Swagger 生成的源代码,但我仍然没有成功获取任何数据。每次我调用 API 类时都会遇到这样的异常

    error:10000410:SSL routines:OPENSSL_internal:SSLV3_ALERT_HANDSHAKE_FAILURE (external/boringssl/src/ssl/s3_pkt.c:610 0xa7cf3780:0x00000001)
    error:1000009a:SSL routines:OPENSSL_internal:HANDSHAKE_FAILURE_ON_CLIENT_HELLO (external/boringssl/src/ssl/s3_clnt.c:764 0xa52a6266:0x00000000)
        at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
        at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:357)
            ... 22 more
Disconnected from the target VM, address: 'localhost:37941', transport: 'socket'

这个问题显然是由 SSLv3 握手失败引起的,这是有道理的,因为这个第 3 方 API 仅支持 TLS 1.3 我对自动生成的 ApiClient.kt 类进行了一些修改,以强制它使用支持 cipers 的正确 TLS 版本。不幸的是,我仍然遇到同样的错误。好的 HTTP 似乎完全忽略了我强制的配置,并且仍然尝试使用不受支持的 SSLv3 连接到端点。

    companion object {
        protected const val ContentType = "Content-Type"
        protected const val Accept = "Accept"
        protected const val JsonMediaType = "application/json"
        protected const val FormDataMediaType = "multipart/form-data"
        protected const val XmlMediaType = "application/xml"

        @JvmStatic
        val connspec: ConnectionSpec = ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
                .tlsVersions(TlsVersion.TLS_1_2)
                .cipherSuites(
                        CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384)
                .build();

        @JvmStatic
        val client: OkHttpClient = OkHttpClient.Builder().connectionSpecs(Arrays.asList(connspec))
                .build();

        @JvmStatic
        var defaultHeaders: Map<String, String> by ApplicationDelegates.setOnce(mapOf(ContentType to JsonMediaType, Accept to JsonMediaType))

        @JvmStatic
        val jsonHeaders: Map<String, String> = mapOf(ContentType to JsonMediaType, Accept to JsonMediaType)
    }

有人可以指导我在哪里寻找错误的根本原因吗?

【问题讨论】:

  • 如果您可以使用兼容的密码规范进行连接,但在限制为 TLSv1.2 时连接失败,则可能需要升级服务器。您能否为成功的请求提供 curl 或类似的调试输出?
  • 很遗憾我无法连接。我的意思是即使我强制 OK HTTP 仅使用 TLS 1.2 我仍然得到SSLV3_ALERT_HANDSHAKE_FAILURE 假设库仍然使用过时的协议并且在服务器拒绝 SSLv3 Curl 转储后失败:pastebin.pl/view/96c47cea
  • 如果你放宽密码套件限制,只使用 ConnectionSpec.RESTRICTED_TLS 而不做修改呢?一旦你开始进一步限制,你不应该对 SSL 失败感到惊讶。如果您关心这个级别的细节,您可能需要开始调试 JVM SSL 握手。

标签: android kotlin ssl okhttp


【解决方案1】:

问题已经解决了一段时间,它与应用程序代码本身完全无关。我发现 Android 7.0 在 BoringSSL 库中有一个错误,它不支持某些椭圆曲线。当我碰到目标 API 版本时,SSL 异常消失了。问题描述在这里:Android - SSL/TLS and ECC (Elliptic curve cryptography)

【讨论】:

  • 点评来源: 嗨,虽然链接是分享知识的好方法,但如果它们在未来被破坏,它们将不会真正回答问题。将回答问题的链接的基本内容添加到您的答案中。如果内容太复杂或太大而无法在此处放置,请描述所提出解决方案的总体思路。请记住始终保留对原始解决方案网站的链接引用。见:How do I write a good answer?
猜你喜欢
  • 2016-10-19
  • 2014-12-09
  • 1970-01-01
  • 2016-06-18
  • 2021-10-13
  • 1970-01-01
  • 2020-01-21
  • 2016-04-08
  • 2017-01-12
相关资源
最近更新 更多