我正在尝试使用基于Java 6(更新31)的客户端调用在JDK7/WildFly 8.2上运行的受SSL保护的Web服务。

我在客户端遇到的第一个问题是:



通过将两侧的javax.net.debug设置为all,我在服务器端得到了以下提示:



快速研究shows



所以我试图在SSLv2Hello上的WildFly上启用standalone.xml:

<https-listener name="https"
                socket-binding="https"
                security-realm="UndertowRealm"
                enabled-protocols="SSLv2, SSLv2Hello, TLSv1, TLSv1.1, TLSv1.2"
                />

服务器上的结果是:



因此,我意识到,我应该尝试在客户端上强制使用TLS,而不是在服务器上启用SSLv2Hello。我试图在我的Web服务调用之前设置System.setProperty("https.protocols", "TLSv1");,但没有任何效果。

我应该配置什么以及如何使握手正常工作?

我已经从服务器上的默认SSLSocketFactory打印了受支持的密码套件:
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_AES_128_CBC_SHA,
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,
TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
SSL_RSA_WITH_3DES_EDE_CBC_SHA,
TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,
TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,
SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,
SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
TLS_ECDHE_RSA_WITH_RC4_128_SHA,
SSL_RSA_WITH_RC4_128_SHA,
TLS_ECDH_ECDSA_WITH_RC4_128_SHA,
TLS_ECDH_RSA_WITH_RC4_128_SHA,
SSL_RSA_WITH_RC4_128_MD5,
TLS_EMPTY_RENEGOTIATION_INFO_SCSV

最佳答案

您无需在服务器上启用SSLv2。您需要在客户端禁用SSLv2Hello伪协议(protocol),方法是从已启用的TLS协议(protocol)中删除SSLv2Hello并保留其他协议(protocol):

System.setProperty("https.protocols", "TLSv1,TLSV1.1,TLSV1.2");

也许是SSLv3(如果它使它高兴的话):不会持续太久,所以请尽量不必这样做。

请注意,这是一个伪协议(protocol)。它不是SSLv2,它是一项兼容性措施,允许某些可能已损坏的服务器接受问候。但是,该 session 在SSLv3或更高版本上运行。它也已过时。

关于java - SSLv2Hello-javax.net.ssl.SSLException : Received fatal alert: unexpected_message,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30165487/

10-10 11:17