18

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

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

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 类型为:jks
keyStore 提供者是:
初始化密钥库
SunX509 类型的 init 密钥管理器
trustStore 是:C:\Program Files (x86)\Java\jre6\lib\security\cacerts
trustStore 类型是:jks
trustStore 提供者是:
初始化信任库
添加为受信任的证书:
  主题:CN=SwissSign Platinum CA - G2,O=SwissSign AG,C=CH
  发行人:CN=SwissSign Platinum CA - G2,O=SwissSign AG,C=CH
  算法:RSA;序列号:0x4eb200670c035d4f
  有效期从 2006 年 10 月 25 日星期三 04:36:00 EDT 到 2036 年 10 月 25 日星期六 04:36:00 EDT

 (对大量证书重复上述操作,尤其是此处的下一个)

添加为受信任的证书:
  主题:EMAILADDRESS=premium-server@thawte.com, CN=Thawte Premium Server CA, OU=Certification Services Division, O=Thawte Consulting cc, L=Cape Town, ST=Western Cape, C=ZA
  颁发者:EMAILADDRESS=premium-server@thawte.com, CN=Thawte Premium Server CA, OU=Certification Services Division, O=Thawte Consulting cc, L=Cape Town, ST=Western Cape, C=ZA
  算法:RSA;序列号:0x1
  有效期从 1996 年 7 月 31 日星期三 20:00:00 EDT 到 2020 年 12 月 31 日星期四 18:59:59 EST



触发 SecureRandom 播种
完成播种 SecureRandom
%% 没有缓存的客户端会话
*** 客户端你好,TLSv1
RandomCookie: GMT: 1264732935 字节 = { 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}
***
主要,写入:TLSv1 握手,长度 = 73
主要,写入:SSLv2 客户端问候消息,长度 = 98
主要,阅读:SSLv3 握手,长度 = 74
*** 服务器你好,SSLv3
RandomCookie: GMT: -1723164650 字节 = { 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
主要,阅读: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 EDT,
               至:2010 年 4 月 30 日星期五 08:12:47 EDT]
  颁发者:EMAILADDRESS=premium-server@thawte.com, CN=Thawte Premium Server CA, OU=Certification Services Division, O=Thawte Consulting cc, L=Cape Town, ST=Western Cape, C=ZA
  序列号:[645f032d 08d4bd17 40df6c90 666e6bf3]

证书扩展:4
[1]:对象 ID:2.5.29.31 关键性 = 假
CRLDistributionPoints [
  [分发点:
     [URI名称:http://crl.thawte.com/ThawtePremiumServerCA.crl]
]]

[2]:对象 ID:2.5.29.37 关键性 = 假
ExtendedKeyUsages [
  服务器验证
  客户端验证
]

[3]:对象 ID:2.5.29.19 关键性=真
基本约束:[
  CA:假
  PathLen:未定义
]

[4]:ObjectId:1.3.6.1.5.5.7.1.1 临界=假
授权信息访问 [
  [访问方法:1.3.6.1.5.5.7.48.1
   访问位置: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......"F......
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....v..S
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=Certification Services Division, O=Thawte Consulting cc, L=Cape Town, ST=Western Cape, C=ZA
  签名算法:MD5withRSA,OID = 1.2.840.113549.1.1.4

  密钥:Sun RSA 公钥,1024 位
  模量:147615723393259181416635428961329342020669051439139433844527551020558419419302186744111967954084722208863267607710475139716371688682959340524636682374402009636778742019638875797953488482650734868036331360260559337468576998663423718393870107693392913633351064416793992445974512528326405756434384337574662315063
  公共指数:65537
  有效期:[来自:1996 年 7 月 31 日星期三 20:00:00 EDT,
               至:2020 年 12 月 31 日星期四 18:59:59 EST]
  颁发者:EMAILADDRESS=premium-server@thawte.com, CN=Thawte Premium Server CA, OU=Certification Services Division, O=Thawte Consulting cc, L=Cape Town, ST=Western Cape, C=ZA
  序列号:[01]

证书扩展:1
[1]:对象 ID:2.5.29.19 关键性 = true
基本约束:[
  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

]
主要,阅读:SSLv3 握手,长度 = 4
*** 服务器HelloDone
*** ClientKeyExchange、RSA PreMasterSecret、SSLv3
主要,写入:SSLv3 握手,长度 = 132
会话密钥:
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 写入 Secret:
0000: 26 03 49 9F 35 73 6B B4 2E 22 BF EC 57 84 F1 55 &.I.5sk.."..W..U
服务器 MAC 写入 Secret:
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 秒 ....p
... 没有用于此密码的 IV
主要,写入:SSLv3 更改密码规范,长度 = 1
*** 完成的
验证数据:{ 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 }
***
主要,写入:SSLv3 握手,长度 = 56
主要,阅读:SSLv3 警报,长度 = 2
主要,RECV SSLv3 ALERT:致命,handshake_failure
主要的,称为 closeSocket()
主要,处理异常:javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure
javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure
    在 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(未知来源)
    在 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(未知来源)
    在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(未知来源)
    在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(未知来源)
    在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(未知来源)
    在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(未知来源)
    在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(未知来源)
    在 sun.net.www.protocol.https.HttpsClient.afterConnect(未知来源)
    在 sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(未知来源)
    在 sun.net.www.protocol.http.HttpURLConnection.getInputStream(未知来源)
    在 java.net.URLConnection.getContent(未知来源)
    在 sun.net.www.protocol.https.HttpsURLConnectionImpl.getContent(未知来源)
    在 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)

服务器似乎以相同的方式对两者进行响应。首先是服务器问候数据包,然后是带有服务器证书和“服务器问候完成”的组合数据包

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

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

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

在这一点上,我最好的猜测是,要么来自 java 的 TLSv1 的初始请求令人困惑,要么单独的数据包以某种方式混淆了服务器。 知道如何测试这些理论中的任何一个吗?



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

4

2 回答 2

15

有你的设置:

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

你是对的 - 这是导致问题的 SSL 版本。是某种解释。

恭喜您提出了这个经过深入研究的好问题!

于 2010-02-15T18:27:04.097 回答
1

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

编辑:

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

于 2010-01-29T03:25:48.623 回答