gpt4 book ai didi

Java 1.8 : TLSv1. 2 ClientHello 握手失败(缺少椭圆曲线扩展?)

转载 作者:太空宇宙 更新时间:2023-11-03 13:15:02 24 4
gpt4 key购买 nike

我在 java1.8 中工作并通过 OKHTTP 连接到 APNS (api.push.apple.com)。

症状是 SSL 握手失败:javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure,根据我的研究,这表明服务器无法与客户端协商密码。

代码只是通过 SSLContext.getInstance("TLS") 创建一个 SSL 上下文。

在使用 -Djavax.net.debug=all 运行我的应用程序后,我发现我的 SSL 握手 ClientHello 看起来像这样:

*** ClientHello, TLSv1.2
RandomCookie: GMT: 1500317763 bytes = { 59, 94, 246, 29, 243, 123, 94, 45, 2, 86, 47, 12, 198, 219, 164, 71, 166, 30, 143, 25, 190, 34, 243, 50, 24, 239, 0, 131 }
Session ID: {}
Cipher Suites: [TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA]
Compression Methods: { 0 }
Extension signature_algorithms, signature_algorithms: SHA512withECDSA, SHA512withRSA, SHA384withECDSA, SHA384withRSA, SHA256withECDSA, SHA256withRSA, SHA256withDSA, SHA224withECDSA, SHA224withRSA, SHA224withDSA, SHA1withECDSA, SHA1withRSA, SHA1withDSA
Extension server_name, server_name: [type=host_name (0), value=api.push.apple.com]
Extension renegotiation_info, renegotiated_connection: <empty>
Extension application_layer_protocol_negotiation, protocols: [h2, spdy/3.1, http/1.1]
***

基本上只是跟着

OkHttp https://api.push.apple.com/3/device/token, READ: TLSv1.2 Alert, length = 2
OkHttp https://api.push.apple.com/3/device/token, RECV TLSv1.2 ALERT: fatal, handshake_failure

令人费解的是代码在同事的笔记本电脑上成功运行 - SSL ClientHello 是相同的,除了它包含以下两个条目:

Extension elliptic_curves, curve names: {secp256r1, sect163k1, sect163r2, secp192r1, secp224r1, sect233k1, sect233r1, sect283k1, sect283r1, secp384r1, sect409k1, sect409r1, secp521r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, sect163r1, secp192k1, sect193r1, sect193r2, secp224k1, sect239k1, secp256k1}
Extension ec_point_formats, formats: [uncompressed]

分析 APNS 服务器 ( https://www.ssllabs.com/ssltest/analyze.html?d=api.push.apple.com&s=17.188.154.31 ) 的 SSL 表明它只接受 TLSv1.2 和以下密码:

TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca8)   ECDH secp256r1 (eq. 3072 bits RSA)   FS  256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030) ECDH secp256r1 (eq. 3072 bits RSA) FS 256
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f) ECDH secp256r1 (eq. 3072 bits RSA) FS 128

这让我觉得 SSL 握手中缺少的 Extension 导致服务器拒绝我的握手,因为没有通用的密码可以使用。


运行它的笔记本电脑是 OS X 10.10,而它损坏的笔记本电脑是 macOS 10.12。我们都在 Java1.8 上。


如果有人对此有任何线索,我们将不胜感激。

感谢您的宝贵时间。

最佳答案

可能缺少 EC 扩展是导致问题的原因,尽管从技术上讲这是允许的 - 请参阅 RFC 4492 第 4 节:

A client that proposes ECC cipher suites may choose not to include these extensions. In this case, the server is free to choose any one of the elliptic curves or point formats listed in Section 5.

这仍然可能出错,但大概不会在您收到服务器的第一次飞行之前(ServerHello ... ServerHelloDone),所以我假设服务器不允许这种情况出现。

我认为 JDK8 不发送该扩展是非常奇怪的行为,所以我希望您的 JDK 以某种方式奇怪地配置并且最好安装和测试全新的 JDK8(未修改,除了安装“JCE”无限强度”策略文件)。

我简要地查看了 (OpenJDK) JDK8 源代码,有几种可能性可以解释为什么此扩展可能不存在:

  • “EC”的 JCE 加密提供程序以某种方式丢失或不支持 TLS 曲线。查看 security.provider 条目的 jre/lib/security/java.security 列表,以及您所做的任何程序化提供程序更改。您是否尝试使用某种硬件 token 进行客户端身份验证?
  • 也许您设置了“jdk.tls.namedGroups”系统属性(如果它是空的,您应该会看到一个异常,但也许您只列出了不受支持的曲线)。检查您可能设置的任何其他系统属性。

根据源代码,您的调试日志中可能有一行是由于找不到任何曲线而生成的:

        if (debug != null && idList.isEmpty()) {
debug.println(
"Initialized [jdk.tls.namedGroups|default] list contains " +
"no available elliptic curves. " +
(property != null ? "(" + property + ")" : "[Default]"));
}

请报告您是否看到该消息及其内容。了解您正在使用的确切 JDK8 版本以及您是否启用了 FIPS 模式也可能会有所帮助。

关于Java 1.8 : TLSv1. 2 ClientHello 握手失败(缺少椭圆曲线扩展?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45154585/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com