我正在尝试使用Windows套接字“手动”实现SSL 3.0(我知道openSSL和MS SSL API都在那里,但我只是想做它以获得乐趣并且从内部视图中学习它)
我用来启动新SSL会话的第一条消息(记录),我发送给SSL服务器的第一条TCP消息(真实服务器,如https://yahoo.com:443)就像这样(十六进制) :
"16 03 00 00 19 01 00 00 15 03 00 bb 80 f3 8c 5d db f7 6c 94 56 d8 34 7a b5 9d 02 00 39 00"
Explanation:
16 //-- (22 in decimal) SSL3_RT_HANDSHAKE
03 00 //-- version : 3.0
00 19 //-- length of record excluding 5 bytes of header
01 //-- SSL3_MT_CLIENT_HELLO
00 00 15 //-- length of the following data
03 00 //-- SSL version 3.0
bb 80 f3 8c 5d db f7 6c 94 56 d8 34 7a b5 9d 02 00 //---- Random 16 bytes
39 //-- TLS_DHE_RSA_AES_256_CBC_SHA
00 //-- Compression method : none
但服务器回复我(十进制):
21-3-0-0-2-2-40
通过this引用,我知道SSL握手协议失败,没有任何关于原因的线索。出了什么问题?
答案 0 :(得分:4)
您的16个字节的数据实际上是 17 个字节,使标题中的“跟随数据的长度”逐个变为一个。
$ xxd data.dat
0000000: bb80 f38c 5ddb f76c 9456 d834 7ab5 9d02 ....]..l.V.4z...
0000010: 00 .
$ wc -c data.dat
17 data.dat
随机数据中的尾随00
看起来像是我的罪魁祸首。
如果我可以添加,你可以使用openssl测试你的实现,如果只是为了比较你发送的内容(这就是我自己找到它的方式)。使用-ssl3
函数的-debug
和s_client
标记,如下所示:
openssl s_client -connect yahoo.com:443 -ssl3 -debug
我使用的openssl(我自己在Windows XP上构建的1.0.1c)发送的数据比你多,但它可以派上用场。
Loading 'screen' into random state - done
CONNECTED(00000724)
write to 0xac7fc0 [0xad1abb] (152 bytes => 152 (0x98))
0000 - 16 03 00 00 93 01 00 00-8f 03 00 52 58 68 2c 6f ...........RXh,o
0010 - 3b 22 89 66 14 e5 c4 fa-14 81 43 e6 48 31 a4 74 ;".f......C.H1.t
0020 - 96 67 6f a1 86 d0 08 8f-ef 1e bc 00 00 68 c0 14 .go..........h..
0030 - c0 0a c0 22 c0 21 00 39-00 38 00 88 00 87 c0 0f ...".!.9.8......
0040 - c0 05 00 35 00 84 c0 12-c0 08 c0 1c c0 1b 00 16 ...5............
0050 - 00 13 c0 0d c0 03 00 0a-c0 13 c0 09 c0 1f c0 1e ................
0060 - 00 33 00 32 00 9a 00 99-00 45 00 44 c0 0e c0 04 .3.2.....E.D....
0070 - 00 2f 00 96 00 41 00 07-c0 11 c0 07 c0 0c c0 02 ./...A..........
0080 - 00 05 00 04 00 15 00 12-00 09 00 14 00 11 00 08 ................
0090 - 00 06 00 03 00 ff 01 .......
0098 - <SPACES/NULS>
实时解码有效负载的快捷方法是通过Wireshark观看。
您还可以针对s_server
测试您的实施。使用您的客户端和您拥有密钥的openssl服务器,您可以provide Wireshark with the server's key并实时查看内部加密流量。