我正在尝试使用基于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/