【发布时间】: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 握手。