【问题标题】:What's wrong with this SSL Handshake Client Hello record?这个 SSL 握手客户端 Hello 记录有什么问题?
【发布时间】:2013-10-11 13:27:55
【问题描述】:

我正在尝试使用 Windows 套接字“手动”实现 SSL 3.0(我知道 openSSL 和 MS SSL API 已经存在,但我只是想这样做是为了好玩并从内部视图中学习它)

我用来启动新 SSL 会话的第一条消息(记录),我发送到 SSL 服务器(真实服务器,如https://yahoo.com:443)的第一条 TCP 消息就是这样(十六进制):

"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 握手协议失败了,但没有任何关于原因的线索。出了什么问题?

【问题讨论】:

  • @EJP :我并没有尝试实现 SSL 的所有方面,只是 V3.0 仅带有 AES_128 和 SHA512。没有 CA(自签名),没有会话,没有重新谈判,..etc 我希望这不是太雄心勃勃?
  • 无论这段旅程在哪里结束,您都会学到很多关于 SSL 的知识。从头开始重新实现 SSL 是一项庞大、复杂且雄心勃勃的工作,但您将其范围尽可能地缩小。尽你所能,坚持下去,直到它不再有趣为止。
  • 谢谢@ixe013,你启发了我。我会继续转发,直到它不再有趣为止。

标签: ssl


【解决方案1】:

3 hard things in our craft

  1. 给事物命名
  2. 缓存失效
  3. 逐个错误

您的 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 测试您的实现,只要比较您发送的内容和它发送的内容(这就是我自己找到这个的方式)。使用s_client 函数的-ssl3-debug 标志,如下所示:

 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 并实时查看内部加密流量。

【讨论】:

  • 非常感谢。我将尝试观察 openSSL 的调试模式。但是 OpenSSL 是否向我解释了记录的哪一部分是什么?除了冗长、无聊和抽象的 RFC 之外,您是否有任何文档可以用 示例 向我解释 SSL 记录格式?
  • 有一些,但 RFC 和源代码通常是正确的并且经过测试。所以我通常会坚持下去,一遍又一遍地慢慢阅读。最终会有意义的。
  • Wireshark 是您解码发送内容的朋友。我在回答中提到了它,并带有指向 SSL 页面的链接。
  • 我再次阅读了 RFC 并将我的代码更改为一个体面的形式。但是事情还是不行。我想我需要一个家庭教师。 Wireshark 仅帮助我查看流量,但它并没有告诉我 SSL 记录中的内容。无论如何,谢谢。
  • 这可能会有所帮助 - TLS 字节解释 tls13.ulfheim.net
猜你喜欢
  • 1970-01-01
  • 2016-05-04
  • 2016-11-19
  • 2023-04-05
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多