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

时间:2018-06-14 08:40:14

标签: java ssl mule tls1.2

我正在使用 java 7 mule 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)

据我所知,问题是不支持 TLSv1.2 ,但是在我安装 Java密码术扩展后应该有,有人可以帮忙吗? / p>

我试过了:

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")

也尝试过:

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)

2 个答案:

答案 0 :(得分:2)

  

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

您可能已经安装了JCE;自1.5以来它已被包含在Java构建中(相当于现在的5)。您可能意味着安装了JCE Unlimited Strength Jurisdiction Policy Files(j8的链接,因为j7现在已存档)。这些策略文件是包含 for JCE策略的文件 - 只有Java的Oracle-previous-Sun 软件包才需要。

您并未准确说出您正在使用的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)已禁用'advanced' i.e. pay-for-support versions reportedly did enable them at 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是否会这样做,无论是在一般情况下还是在您的系统上。免费版本的Oracle j7不支持jdk.tls.client.protocols;它似乎已被添加到7u91或可能7u95的付费版本中,并且可能与OpenJDK相同。 https.cipherSuites也仅适用于HttpsURLConnection,无论如何都不需要,因为默认密码套件适用于此服务器;此外,服务器不支持任何3DES套件 - 也不支持带有任何数据密码的ECDH_RSA。 (实际上没有人在任何地方使用ECDH_RSA;许多人包括这个服务器使用ECDHE_RSA,是的,因为Ephemeral的第二个E会产生非常重要的差异。)

  

也尝试过:
  String [] ciphers = new String [2]
  密码[0] =" TLS_RSA_WITH_AES_256_CBC_SHA256"
  密码[1] =" TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA"
  SSLSocket.setEnabledCipherSuites(密码)
  String [] protocols = new String [1]
  协议[0] =" TLSv1.2&#34 ;;
  SSLSocket.setEnabledProtocols(协议)

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

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

答案 1 :(得分:0)

在TLS选项卡中转到HTTP的连接器配置,有一个名为Enabled Protocol的选项。

只需输入值TLSv1.2