繁体   English   中英

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

[英]Java 7: SEND TLSv1.2 ALERT: fatal, description = handshake_failure mule

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

还尝试了:

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)

我正在使用Java 7,Mule 3.7.0,我已经安装了Java密码学扩展

您可能没有安装JCE。 从1.5开始就已经包含在Java版本中(现在等于5)。 您可能是说您安装了JCE无限强度管辖权策略文件 (j8的链接,因为j7现在已存档)。 这些政策文件是包含 JCE政策文件-并且只需要对Java的甲骨文先前Sun 软件包

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

据我了解,问题在于不支持TLSv1.2,但是在安装Java密码扩展后应该存在,

JCE策略文件对TLS协议支持绝对没有影响。 它们对TLS的唯一作用是启用使用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套件,并且只要没有启用TLS 1.1,就可以在没有无限策略的情况下甚至适用于Oracle j7。 它实际上并不需要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.protocols不受Oracle J7的免费版本支持; 它似乎已添加到7u91或7u95的付费版本中,并且可能与OpenJDK相同。 https.cipherSuites也仅适用于HttpsURLConnection并且无论如何都不需要,因为默认密码套件适用于此服务器; 此外,服务器不支持任何3DES套件-也不具有任何数据密码的ECDH_RSA。 (实际上,没有人在任何地方使用ECDH_RSA;包括该服务器在内的许多服务器都使用ECDHE_RSA,是的,Ephemeral的第二个E产生了非常重要的变化。)

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

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

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

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

只需输入值TLSv1.2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM