Java 7:发送 TLSv1.2 警报:致命,描述 = handshake_failure mule

Eth*_*han 0 java ssl mule tls1.2

我正在使用java 7mule 3.7.0,我已经安装了Java Cryptography Extension

我正在尝试向服务器发送请求,但我收到:

java.io.EOFException: SSL peer shut down incorrectly
        at sun.security.ssl.InputRecord.read(InputRecord.java:482)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:944)
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1342)


Cipher Suites: [TLS_DHE_DSS_WITH_AES_256_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA]
Compression Methods:  { 0 }
Extension elliptic_curves, curve names: {secp256r1, secp384r1, secp521r1}
Extension ec_point_formats, formats: [uncompressed]
Extension extended_master_secret
Extension server_name, server_name: [host_name: merchant.payb.lv]
***
entry.worker.04, WRITE: TLSv1 Handshake, length = 136
entry.worker.04, received EOFException: error
entry.worker.04, handling exception: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
entry.worker.04, SEND TLSv1.2 ALERT:  fatal, description = handshake_failure
entry.worker.04, WRITE: TLSv1.2 Alert, length = 2
entry.worker.04, Exception sending alert: java.net.SocketException: Broken pipe (Write failed)
entry.worker.04, called closeSocket()
entry.worker.04, called close()
entry.worker.04, called closeInternal(true)
entry.worker.04, called close()
entry.worker.04, called closeInternal(true)
entry.worker.04, called close()
entry.worker.04, called closeInternal(true)
Run Code Online (Sandbox Code Playgroud)

据我了解,问题是不支持TLSv1.2,但是在我安装Java Cryptography Extension之后应该会有,请问有人可以帮忙吗?

我试过了:

System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2")
System.setProperty("jdk.tls.client.protocols", "TLSv1,TLSv1.1,TLSv1.2")
System.setProperty("https.cipherSuites", "TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA")
Run Code Online (Sandbox Code Playgroud)

还试过:

String[] ciphers = new String[2]
ciphers[0] = "TLS_RSA_WITH_AES_256_CBC_SHA256"
ciphers[1] = "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA"
SSLSocket.setEnabledCipherSuites(ciphers)

String[] protocols = new String[1]
protocols[0] = "TLSv1.2";
SSLSocket.setEnabledProtocols(protocols)
Run Code Online (Sandbox Code Playgroud)

dav*_*085 5

我正在使用 java 7, mule 3.7.0,我已经安装了 Java Cryptography Extension

你不可能已经安装了 JCE;它从 1.5 开始就包含在 Java 构建中(现在相当于 5)。您可能是说您安装了JCE Unlimited Strength Jurisdiction Policy Files(j8 的链接,因为 j7 现在已存档)。这些政策文件是包含一个政策文件,JCE -并且只需要甲骨文以前的Sun的Java。

您没有确切说明您使用的是哪个 Java 版本,但您的跟踪表明它是 OpenJDK 的 RedHat 系列构建。如果是,则不需要无限制的策略文件且无效;OpenJDK 创建于 2007 年,从未受制于上个世纪为当时的 Sun Java 设计的“有限”加密策略。(在过去几个月中,Oracle j8、j9 和 j10 也最终消除了大部分“特性”,将其替换为默认为 的可编辑文本项unlimited。)

据我了解,问题是不支持 TLSv1.2,但在我安装 Java Cryptography Extension 后应该会有,

JCE 策略文件对 TLS 协议支持绝对没有影响。它们对 TLS 的唯一影响是使用 AES-256启用密码套件,该 AES-256 与协议不同且独立——如上所述,仅在(非最近的)Sun/Oracle 软件包中起作用。

Java 7开箱即用地实现了TLS 1.2,但所有免费(免费)Oracle 包(最多 7u80)都禁用了它,默认情况下在客户端禁用了 1.1。在免费版本的生命周期结束后,据报道“高级”即付费支持版本确实在 7u131 启用了它们,我认为 OpenJDK 构建也做了同样的事情,但无法检查。

根据https://www.ssllabs.com/ssltest/analyze.html?d=merchant.payb.lv,该服务器实际上并不需要 AES-256;它还接受甚至更喜欢AES-128 套件,并且即使在没有无限制策略的情况下也适用于 Oracle j7 ,只要至少启用了 TLS 1.1。它实际上并不需要 1.2,但由于启用 1.1 或 1.2 的努力是相同的,因此您最好选择 1.2。

我试过:
System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2")
System.setProperty("jdk.tls.client.protocols", "TLSv1,TLSv1.1,TLSv1. 2")
System.setProperty("https.cipherSuites", "TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA")

https.protocols仅适用于使用HttpsURLConnection(不直接使用JSSE)的连接,我不知道 mule 是否这样做,无论是在一般情况下还是在您的系统上。jdk.tls.client.protocolsOracle j7 的免费版本不支持;它似乎已添加到 7u91 或 7u95 的付费版本中,大概 OpenJDK 也是如此。https.cipherSuites也仅适用于HttpsURLConnection并且无论如何都不需要,因为默认密码套件适用于该服务器;此外,服务器不支持任何 3DES 套件——也不支持带有任何数据密码的ECDH_RSA 。(实际上任何地方都没有人使用 ECDH_RSA;包括这个服务器在内的许多人都使用 ECDHE_RSA,是的,Ephemeral 的第二个 E 产生了非常大和重要的区别。)

也尝试:
字符串[]密码=新的String [2]
密码[0] = “TLS_RSA_WITH_AES_256_CBC_SHA256”
密码[1] = “TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA”
SSLSocket.setEnabledCipherSuites(密码)
的String []协议=新的String [1]
的协议[0] = "TLSv1.2";
SSLSocket.setEnabledProtocols(协议)

这不可能。setEnabledCipherSuitessetEnabledProtocols是非静态方法,必须在对象(实例)上而不是在类上调用。您使用哪个对象至关重要。如上所述,密码套件根本不需要更改,您尝试设置的第二个在两个方面是错误的。

我无法重现你的踪迹。它WRITE: TLSv1 Handshake为 ClientHello记录(意味着 1.0),但是您隐藏了可以确认它是否真的是 1.0 的数据。当我使用默认为 1.0 的 7u80(具有无限策略,并且没有骡子)进行测试时,它会像您一样获得 EOF,但它随后会记录SEND TLSv1 ALERTWRITE: TLSv1 Alert-- NOT TLSv1.2。当我使用 7u80 进行测试并正确启用 1.2 时,它按预期成功连接。我与此证据一致的唯一理论是您没有正确启用 1.2篡改了日志。