我正在用java编写一个程序,将官方发票信息发送给财政管理部门。此公共服务提供了证书,以便在与Web服务的SSL连接中使用,并加密请求正文消息中的某些特定数据字段。
在客户端和服务器同意使用商定的密码套件(在本例中为TLS_RSA_WITH_AES_128_CBC_SHA)进行通信后,我在握手阶段遇到了EOFException错误。
遵循SSL协议,客户端使用新密码成功执行测试并将测试数据发送到服务器,以便服务器也可以重复相同的测试并确认它还能够加密和解密数据。在这一点上,服务器发送EOFException。
以下是SSL通信日志的最后一部分:
向服务器发送快速确认,确认我们知道与我们刚刚发送的客户端证书相对应的私钥...
* CertificateVerify
[write] MD5和SHA1哈希:len = 262
这里的二进制数据太大而没有显示
main,WRITE:TLSv1握手,长度= 262
[原始写入]:长度= 267
这里的二进制数据太大而没有显示
* 告诉服务器我们要更改为新建立的密码套件。所有其他消息将使用我们刚刚建立的参数进行加密。 *
main,WRITE:TLSv1 Change Cipher Spec,length = 1
[原始写入]:长度= 6
0000:14 03 01 00 01 01
...并成功完成
..成品
我们发送加密的已完成邮件以验证一切正常。
verify_data:{221,96,47,110,19,170,244,8,37,152,160,40}
... 客户端加密测试数据..
[write] MD5和SHA1哈希:len = 16
<00> 0000:14 00 00 0C DD 60 2F 6E 13 AA F4 08 25 98 A0 28 .....` / n ....%..(ENCRYPTION之前的填充明文:len = 48
<00> 0000:14 00 00 0C DD 60 2F 6E 13 AA F4 08 25 98 A0 28 .....` / n ....%..(0010:10 7F 85 11 EC 6D 5D ED 21 70 27 F4 DC 23 C0 9B ..... m]。!p'..#..
0020:A7 6F C2 80 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B .o ..............
main,WRITE:TLSv1握手,长度= 48
* ...并将测试数据发送到服务器,以便服务器可以进行相同的测试并确认可以建立加密通信(53个字节= 48个测试数据+ 5个来自标头)*
[原始写入]:长度= 53
0000:16 03 01 00 30 1C 17 08 0F 49 C9 6A 7A 8B 8C 48 .... 0 .... I.jz..H
0010:BA 57 2D CB 06 46 1E 65 61 7C 5F 74 F2 08 AB 12 .W - .. F.ea._t ....
0020:91 47 72 8C 8F 84 0A CB D7 29 E2 FD 84 B2 FD 9E .Gr ......)......
0030:47 DC 13 60 B4 G..`。
...并且服务器响应EOFException错误
main,收到EOFException:错误
main,处理异常:javax.net.ssl.SSLHandshakeException:远程主机已关闭
握手期间的连接
%%无效:[会话-1,TLS_RSA_WITH_AES_128_CBC_SHA]
main,SEND TLSv1 ALERT:致命,描述= handshake_failure
ENCRYPTION之前的填充明文:len = 32
0000:02 28 BC 65 1A CA 68 87 79 84 5F 64 16 F5 28 72。(。e..h.y._d ..(r
0010:F7 8A 69 72 93 D8 09 09 09 09 09 09 09 09 09 09 ..ir ............
main,WRITE:TLSv1 Alert,length = 32
[原始写入]:长度= 37
0000:15 03 01 00 20 0D 9A 35 18 B7 98 4B 7B AF 82 4E .... 5 ... K ... N
0010:1A EE 7D AC 5D D5 49 05 4E 74 B9 77 E4 CD 87 61 ....]。I.Nt.w ... a
0020:23 03 5C 9C 7E#...
main,名为closeSocket()
main,名为close()
main,名为closeInternal(true)
我不知道造成这种失败的原因是什么,以及如何以编程方式影响此过程中此步骤的结果。我已经尝试强制使用客户端和服务器识别的其他密码,例如SSL_RSA_WITH_RC4_128_MD5,但错误仍然存在。 有关如何解决这个问题的任何想法?
答案 0 :(得分:2)
有关如何解决此问题的任何想法?
我建议您与运行该服务的人员联系,让他们查看他们的日志,了解他们的服务器在SSL设置期间关闭连接的原因。
(严格来说,服务器没有“以[an] EOFException错误响应”。它实际上正在关闭TCP连接,而客户端Java库正在抛出异常。如果使用正确的术语,您可能会从服务的维护者那里得到更有帮助的回复。)