收到致命警报:handshake_failure,调试不显示故障原因

问题描述:

我试图从使用Java HTTP客户端,像这样的HTTPS服务器下载的图像...收到致命警报:handshake_failure,调试不显示故障原因

System.setProperty("javax.net.debug", "all"); 
System.setProperty("jsse.enableSNIExtension", "false"); 

URL url = new URL("https://secureserver.com/media/hot-jlaw-image.jpg") 
HttpURLConnection urlConn = url.openConnection() 
urlConn.setRequestMethod("GET") 

File myImg = new File("/Users/joe/Downloads/myImage.jpg") 
myImg.append(urlConn.getInputStream()) 

我的客户是基于Java 8上运行随着调试打开,我看到包括以下...

*** ClientHello, TLSv1.2 
RandomCookie: GMT: 1478629170 bytes = { 23, 147, 128, 164, 76, 36, 0, 143, 175, 43, 227, 154, 16, 212, 209, 112, 224, 227, 0, 109, 196, 178, 231, 43, 112, 198, 36, 235 } 
Session ID: {} 
Cipher Suites: [TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, 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_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, 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_EMPTY_RENEGOTIATION_INFO_SCSV] 

main, WRITE: TLSv1.2 Handshake, length = 193 

Caught: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
[Raw read]: length = 5 
0000: 15 03 03 00 02          ..... 
[Raw read]: length = 2 
0000: 02 28            .(
main, READ: TLSv1.2 Alert, length = 2 
main, RECV TLSv1.2 ALERT: fatal, handshake_failure 

所以好像客户端Hello发送和握手被发送,但没有从服务器发回关于除外握手失败警报。

This answer提出了导致此错误可能发生的几个原因,例如不兼容的密码套件或不完整的信任路径,并且建议开启调试。

但在我的情况下,调试还没有透露罪魁祸首。任何建议还有什么要尝试?

+0

它是自签名证书吗? –

+0

我看到服务器的根CA是Starfield Services根证书颁发机构 - G2,难道我的Java客户端不能识别此CA? – AbuMariam

原来,问题是这条线

System.setProperty("jsse.enableSNIExtension", "false");' 

他们的服务器一定是虚拟,因为some posts表示这不会对这样的服务器上工作。