公共https网站上的jsse handshake_failure

我已经阅读了一个相关的问题 ,但它似乎没有在我看到失败的同一个地方失败。

我正在尝试一个非常简单的操作:

public static void main(String [] argv) { try { URL u = new URL("https://membership.usairways.com/Login.aspx"); Object o = u.getContent(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 

但是在我的Mac和Windows机器上使用Java 6运行时遇到handshake_failure。

其他人一直没有找到证书的问题,但调试日志( -Djavax.net.debug=ssl:handshake )显示找到的证书很好:

 keyStore是: 
 keyStore类型是:jks
 keyStore提供者是: 
 init keystore
 sunX509类型的init keymanager
 trustStore是:C:\ Program Files(x86)\ Java \ jre6 \ lib \ security \ cacerts
 trustStore类型是:jks
 trustStore提供者是: 
 init truststore
添加为可信证书:
  主题:CN = SwissSign Platinum CA-G2,O = SwissSign AG,C = CH
  发行人:CN = SwissSign Platinum CA  -  G2,O = SwissSign AG,C = CH
  算法:RSA; 序列号:0x4eb200670c035d4f
  有效期为2006年12月25日星期三04:36:00至美国东部时间2036年10月25日星期六04:36:00

  (重复上面的大量证书,特别是下一个证书)

添加为可信证书:
  主题:EMAILADDRESS=premium-server@thawte.com,CN = Thawte Premium Server CA,OU =认证服务部门,O = Thawte Consulting cc,L =开普敦,ST =西开普省,C = ZA
  发行人:EMAILADDRESS=premium-server@thawte.com,CN = Thawte Premium Server CA,OU =认证服务部门,O = Thawte Consulting cc,L =开普敦,ST =西开普省,C = ZA
  算法:RSA; 序列号:0x1
  有效期为1996年7月31日星期三20:00:00至美国东部时间2020年12月31日18:59:59



触发SecureRandom的播种
播种SecureRandom
 %%没有缓存的客户端会话
 *** ClientHello,TLSv1
 RandomCookie:GMT:1264732935 bytes = {200,133,119,81,212,158,149,118,153,199,116,71,201,115,67,238,141,69,2,4,158, 99,39,55,242,1,155,226}
会话ID:{}
密码套件:[SSL_RSA_WITH_RC4_128_MD5,SSL_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA,SSL_RSA_WITH_DES_CBC_SHA,SSL_DHE_RSA_WITH_DES_CBC_SHA,SSL_DHE_DSS_WITH_DES_CBC_SHA,SSL_RSA_EXPORT_WITH_RC4_40_MD5,SSL_RSA_EXPORT_WITH_DES40_CBC_SHA,SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA]
压缩方法:{0}
 ***
 main,WRITE:TLSv1握手,长度= 73
 main,WRITE:SSLv2客户端问候消息,长度= 98
 main,READ:SSLv3握手,长度= 74
 *** ServerHello,SSLv3
 RandomCookie:GMT:-1723164650 bytes = {122,187,153,122,194,216,4,86,68,106,92,83,166,22,156,103,30,93,5,89,138 ,108,191,101,41,38,201,7}
会议ID:{64,200,23,188,201,247,125,29,43,132,204,32,58,18,4,215,3,228,127,3,0,13,41, 240,200,79,208,166,79,178,249,123}
密码套件:SSL_RSA_WITH_RC4_128_MD5
压缩方法:0
 ***
 %%已创建:[会话-1,SSL_RSA_WITH_RC4_128_MD5]
 ** SSL_RSA_WITH_RC4_128_MD5
 main,READ:SSLv3握手,长度= 1712
 ***证书链
链[0] = [
 [
  版本:V3
  主题:CN = *。usairways.com,OU = csmusairwayweb,O = US Airways,L = Phoenix,ST = Arizona,C = US
  签名算法:SHA1withRSA,OID = 1.2.840.113549.1.1.5

  密钥:Sun RSA公钥,1024位
  模量:117128872477092149134303805811049298494872749082923376652184544938174228731267664522970480129390452967053230586478159419504897327346652351403474804997804422528612377227107853983665176692187458180185822497353170111743696439530149540148901069359332724759471171438095948620900093160986648342991891132153788789693
  公共指数:65537
  有效期:[来自:2008年4月30日星期三08:12:47,美国东部时间2008年,
               致:周五4月30日08:12:47 EDT 2010]
  发行人:EMAILADDRESS=premium-server@thawte.com,CN = Thawte Premium Server CA,OU =认证服务部门,O = Thawte Consulting cc,L =开普敦,ST =西开普省,C = ZA
  序列号:[645f032d 08d4bd17 40df6c90 666e6bf3]

证书扩展:4
 [1]:ObjectId:2.5.29.31 Criticality = false
 CRLDistributionPoints [
   [DistributionPoint:
      [URIName:http://crl.thawte.com/ThawtePremiumServerCA.crl]
 ]]

 [2]:ObjectId:2.5.29.37 Criticality = false
 ExtendedKeyUsages [
   serverAuth
   clientAuth
 ]

 [3]:ObjectId:2.5.29.19 Criticality = true
 BasicConstraints:
   CA:假
   PathLen:未定义
 ]

 [4]:ObjectId:1.3.6.1.5.5.7.1.1 Criticality = false
 AuthorityInfoAccess [
   [accessMethod:1.3.6.1.5.5.7.48.1
    accessLocation:URIName:http://ocsp.thawte.com]
 ]

 ]
  算法:[SHA1withRSA]
  签名:
 0000:4A 2B 42 50 88 64 26 7E CA 06 8C B3 CA 88 B4 8D J + BP.d&.........
 0010:20 5A 11 F6 1F 9E 00 16 22 46 6F D9 18 8E CE 08 Z ......“Fo .....
 0020:37 33 95 F9 08 2F 80 2D 26 73 C0 2A 54 2B 41 74 73 ... / .-&s。* T + At
 0030:2F 7F BC 17 9C 85 E3 71 E0 D7 1D CE 76 86 DD 53 /......q......
 0040:2A 99 4E E7 92 27 F5 B5 2A A3 3C 9C D3 97 87 B9 * .N ..'.. *。%..... 2q ..
 0070:86 5E ED 50 27 A6 0D A6 23 F9 BB CB A6 07 14 42。^。P'......#...... B

 ]
 ***
找到可信证书:
 [
 [
  版本:V3
  主题:EMAILADDRESS=premium-server@thawte.com,CN = Thawte Premium Server CA,OU =认证服务部门,O = Thawte Consulting cc,L =开普敦,ST =西开普省,C = ZA
  签名算法:MD5withRSA,OID = 1.2.840.113549.1.1.4

  密钥:Sun RSA公钥,1024位
  模量:147615723393259181416635428961329342020669051439139433844527551020558419419302186744111967954084722208863267607710475139716371688682959340524636682374402009636778742019638875797953488482650734868036331360260559337468576998663423718393870107693392913633351064416793992445974512528326405756434384337574662315063
  公共指数:65537
  有效期:[来自:美国东部时间7月31日星期三20:00:00,
               致:12月31日星期四18:59:59 2020]
  发行人:EMAILADDRESS=premium-server@thawte.com,CN = Thawte Premium Server CA,OU =认证服务部门,O = Thawte Consulting cc,L =开普敦,ST =西开普省,C = ZA
   SerialNumber:[01]

证书扩展:1
 [1]:ObjectId:2.5.29.19 Criticality = true
 BasicConstraints:
   CA:真
   pathLen不能:2147483647
 ]

 ]
  算法:[MD5withRSA]
  签名:
 0000:26 48 2C 16 C2 58 FA E8 16 74 0C AA AA 5F 54 3F&H,... X ... t ... _ T?
 0010:F2 D7 C9 78 60 5E 5E 6E 37 63 22 77 36 7E B2 17 ... x` ^^ n7c“w6 ...
 0020:C4 34 B9 F5 08 85 FC C9 01 38 FF 4D BE F2 16 42 .4 ....... 8.M ... B
 0030:43 E7 BB 5A 46 FB C1 C6 11 1F F1 4A B0 28 46 C9 C..ZF ...... J.(F.
 0040:C3 C4 42 7D BC FA AB 59 6E D5 B7 51 88 11 E3 A4 ..B .... Yn..Q ....
 0050:85 19 6B 82 4C A4 0C 12 AD E9 A4 AE 3F F1 C3 49 ..kL ......?.. I
 0060:65 9A 8C C5 C8 3E 25 B7 94 99 BB 92 32 71 07 F0 e ....>%..... 2q ..
 0070:86 5E ED 50 27 A6 0D A6 23 F9 BB CB A6 07 14 42。^。P'......#...... B

 ]
 main,READ:SSLv3握手,长度= 4
 *** ServerHelloDone
 *** ClientKeyExchange,RSA PreMasterSecret,SSLv3
 main,WRITE:SSLv3握手,长度= 132
会话KEYGEN:
 PreMaster秘密:
 0000:03 00 90 43 CA FE 69 A1 9B C1 D2 2A B2 52 B5 F7 ... C..i .... *。R ..
 0010:8F D7 6E 89 CB 9D B1 8F C0 C1 EE 54 D8 70 4A F2 ..n ........ T.pJ。
 0020:B6 FB D2 F2 1C BC FD 7A 2C AD 75 60 C0 5F 3B 15 ....... z,.u`._;。
连接钥匙:
客户现时:
 0000:4B 62 4B 07 C8 85 77 51 D4 9E 95 76 99 C7 74 47 KbK ... wQ ... v..tG
 0010:C9 73 43 EE 8D 45 02 04 9E 63 27 37 F2 01 9B E2 .sC..E ... c'7 ....
服务器现时:
 0000:99 4B 98 16 7A BB 99 7A C2 D8 04 56 44 6A 5C 53 .K..z..z ... VDj \ S
 0010:A6 16 9C 67 1E 5D 05 59 8A 6C BF 65 29 26 C9 07 ... g。]。Yle)&..
主秘密:
 0000:65 CA 12 63 80 48 D8 4A 33 63 A3 93 6F FB F8 5A e..cHJ3c..o..Z
 0010:87 7D 2E C4 19 3D 0E 2E 66 D4 0A 28 B8 27 76 79 ..... = .. f ..(。'vy
 0020:F9 C8 53 67 0D 87 CB 47 29 9E 3E 37 44 7D 19 11 ..Sg ... G)。> 7D ......
客户端MAC写密码:
 0000:26 03 49 9F 35 73 6B B4 2E 22 BF EC 57 84 F1 55&.I.5sk ..“.. W..U
服务器MAC写秘密:
 0000:3F D0 4C 7F AD 9B 16 CD 9F 1E 81 DD 0E B9 88 CF?.L .............
客户端写密钥:
 0000:55 C0 0D 36 BA 82 88 26 7B CE 16 BC B0 96 5D 9F U..6 ......&......]。
服务器写密钥:
 0000:73 B1 C3 EF E5 1F E7 B4 B9 90 BA B9 EC D7 13 70 s .............. p
 ...没有IV用于此密码
 main,WRITE:SSLv3更改密码规范,长度= 1
 ***完了
 verify_data:{36,108,19,115,108,210,76,3,226,30,160,20,81,59,1,35,71,57,221,18,4,164,97,253 ,166,69,253,104,207,70,44,39,0,231,237,172}
 ***
 main,WRITE:SSLv3握手,长度= 56
 main,READ:SSLv3警报,长度= 2
 main,RECV SSLv3 ALERT:致命,handshake_failure
 main,名为closeSocket()
 main,处理exception:javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure
 javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure
     at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
     at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(Unknown Source)
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    在sun.net.www.protocol.https.HttpsClient.afterConnect(未知来源)
    在sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(未知来源)
     at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
     at java.net.URLConnection.getContent(Unknown Source)
     at sun.net.www.protocol.https.HttpsURLConnectionImpl.getContent(Unknown Source)
    在java.net.URL.getContent(未知来源)
    在h.Hacks.main(Hacks.java:11)


编辑2010年1月31日:

使用wireshark查看数据包,Firefox 3.5和Java 1.6之间的客户端问候消息略有不同。

Java 1.6发送SSLv2 hello消息,但版本设置为TLS 1.0(0x0301)

Firefox 3.5发送SSLv2 hello消息,但版本设置为SSLv3.0(0x0300)

服务器似乎以相同的方式响应两者。 首先是服务器hello数据包,然后是带有服务器证书和’server hello done’的组合数据包

Java和Firefox的反应不同: Java将三个SSL记录作为三个数据包发送:客户端密钥交换,然后更改密码规范,然后加密握手消息

Firefox将所有这三个SSL记录作为一个数据包发送。

此时,对于Java,服务器发送致命警报,指示握手失败,而firefox获取成功完成握手过程的响应。

我在这一点上最好的猜测是,来自java的TLSv1的初始请求是令人困惑的事情,或者单独的数据包在某种程度上混淆了服务器。 知道如何测试这两种理论吗?



编辑2010年2月1日:阅读相关问题,我看到’openssl’命令行工具可以诊断某些问题。 运行openssl s_client -connect membership.usairways.com:443表明发送TLSv1请求正常。 因此,java与服务器交互的方式更加微妙。

有你的设置:

 System.setProperty("https.protocols", "SSLv3"); 

你是对的 – 这是导致问题的SSL版本。 这是一些解释。

祝贺这个很好的研究问题!

我将FF 3.6连接到该网站,并嗅探了与Wireshark的连接。 实际上,第一次SSL连接尝试发送TLS1.0客户端问候,服务器响应握手失败,然后FF3.6立即使用成功的SSLv2兼容hello重试。 所有这些对用户来说都是透明的,所以你不会注意到最初的失败。 尝试将系统属性https.protocols设置为SSLv2Hello 。 请注意,JSSE不支持SSL v2,这只是初始客户端hello的格式。

编辑:

好吧,没关系,我看到JSSE默认使用SSLv2客户端问候。 我不知道为什么第一次连接失败。 也许你只需要连续尝试两次。