【问题标题】:TLS-Structure of certificate messageTLS-Structure of certificate message
【发布时间】:2014-04-28 13:54:45
【问题描述】:

我正在实现 RFC 5246(TLS 1.2),但我被证书消息卡住了。我正在使用 Openssl s_client 和浏览器的组合调试服务器。服务器 hello 消息被接收并解释得很好,并且使用 openssl 中的 -msg 选项,我可以看到该消息已被正确解释为 Client_hello,没有任何错误。 发送证书消息时,浏览器没有响应,并且带有 -msg 的 openssl s_client 也没有响应。带有 -debug 的 Openssl s_client 读取消息,但在 server_hello_done 消息之后没有响应。没有记录错误。 我怀疑问题出在我的证书消息的结构上,因为我在接收到记录层长度之后发送的任何内容都没有任何错误,即使它只是随机文本或二进制数据。 将记录层的结构修改为不正确/不适当的值会引发错误并带有相应的错误消息,例如将版本设置为 9.3 会引发错误 5256:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number 正如预期的那样。 这是我目前使用的结构:

/记录层/

  • 一个字节用于消息类型,两个字节用于协议版本(主要和次要),两个字节用于消息长度。

/握手消息数据/

  • 两个字节表示长度,两个字节表示证书长度。最后是证书。

我目前正在使用自签名证书,并且浏览器和 openssl s_client 都没有在 Client_hello 中包含 signature_algorithms 扩展名,所以我以 .PEM 格式和纯文本形式发送证书。下面到目前为止,是 openssl 的握手的十六进制转储:

CONNECTED(00000164)
write to 0x14ad698 [0x13f1ffb] (210 bytes => 210 (0xD2))
0000 - 16 03 01 00 cd 01 00 00-c9 03 01 53 5e 5c d6 a0   ...........S^\..
0010 - 34 27 ea 22 ed 01 dc 36-bb 0b 84 1e 5a 58 3e d5   4'."...6....ZX>.
0020 - 95 4d 5f 81 9f 2a f0 27-75 fb 1f 00 00 5c c0 14   .M_..*.'u....\..
0030 - c0 0a 00 39 00 38 00 88-00 87 c0 0f c0 05 00 35   ...9.8.........5
0040 - 00 84 c0 12 c0 08 00 16-00 13 c0 0d c0 03 00 0a   ................
0050 - c0 13 c0 09 00 33 00 32-00 9a 00 99 00 45 00 44   .....3.2.....E.D
0060 - c0 0e c0 04 00 2f 00 96-00 41 00 07 c0 11 c0 07   ...../...A......
0070 - c0 0c c0 02 00 05 00 04-00 15 00 12 00 09 00 14   ................
0080 - 00 11 00 08 00 06 00 03-00 ff 01 00 00 44 00 0b   .............D..
0090 - 00 04 03 00 01 02 00 0a-00 34 00 32 00 01 00 02   .........4.2....
00a0 - 00 03 00 04 00 05 00 06-00 07 00 08 00 09 00 0a   ................
00b0 - 00 0b 00 0c 00 0d 00 0e-00 0f 00 10 00 11 00 12   ................
00c0 - 00 13 00 14 00 15 00 16-00 17 00 18 00 19 00 23   ...............#
00d2 - <SPACES/NULS>
read from 0x14ad698 [0x13edaab] (5 bytes => 5 (0x5))
0000 - 16 03 01 00 2c                                    ....,
read from 0x14ad698 [0x13edab0] (44 bytes => 44 (0x2C))
0000 - 02 00 00 26 03 01 53 5e-5c d6 4a 5a 5b 4d 63 38   ...&..S^\.JZ[Mc8
0010 - 57 47 53 45 4d 5b 3f 3c-5f 38 23 67 26 32 38 4c   WGSEM[?<_8#g&28L
0020 - 2e 67 47 67 28 56 00 00-2f                        .gGg(V../
002c - <SPACES/NULS>
read from 0x14ad698 [0x13edaab] (5 bytes => 5 (0x5))
0000 - 16 03 01 02 99                                    .....
read from 0x14ad698 [0x13edab0] (665 bytes => 665 (0x299))
0000 - 0b 02 96 02 94 2d 2d 2d-2d 2d 42 45 47 49 4e 20   .....-----BEGIN 
0010 - 43 45 52 54 49 46 49 43-41 54 45 2d 2d 2d 2d 2d   CERTIFICATE-----
0020 - 0a 4d 49 49 42 75 54 43-43 41 53 49 43 43 51 43   .MIIBuTCCASICCQC
0030 - 43 65 67 31 46 6f 4f 76-43 4b 6a 41 4e 42 67 6b   Ceg1FoOvCKjANBgk
0040 - 71 68 6b 69 47 39 77 30-42 41 51 55 46 41 44 41   qhkiG9w0BAQUFADA
0050 - 68 4d 51 73 77 43 51 59-44 56 51 51 47 45 77 4a   hMQswCQYDVQQGEwJ
0060 - 4c 0a 52 54 45 53 4d 42-41 47 41 31 55 45 41 78   L.RTESMBAGA1UEAx
0070 - 4d 4a 62 47 39 6a 59 57-78 6f 62 33 4e 30 4d 42   MJbG9jYWxob3N0MB
0080 - 34 58 44 54 45 30 4d 44-51 79 4d 54 45 32 4e 44   4XDTE0MDQyMTE2ND
0090 - 4d 30 4e 56 6f 58 44 54-45 31 4d 44 51 79 4d 54   M0NVoXDTE1MDQyMT
00a0 - 45 32 0a 4e 44 4d 30 4e-56 6f 77 49 54 45 4c 4d   E2.NDM0NVowITELM
00b0 - 41 6b 47 41 31 55 45 42-68 4d 43 53 30 55 78 45   AkGA1UEBhMCS0UxE
00c0 - 6a 41 51 42 67 4e 56 42-41 4d 54 43 57 78 76 59   jAQBgNVBAMTCWxvY
00d0 - 32 46 73 61 47 39 7a 64-44 43 42 6e 7a 41 4e 42   2FsaG9zdDCBnzANB
00e0 - 67 6b 71 0a 68 6b 69 47-39 77 30 42 41 51 45 46   gkq.hkiG9w0BAQEF
00f0 - 41 41 4f 42 6a 51 41 77-67 59 6b 43 67 59 45 41   AAOBjQAwgYkCgYEA
0100 - 72 51 71 76 50 36 4c 35-41 71 31 31 67 76 38 2b   rQqvP6L5Aq11gv8+
0110 - 2f 59 55 53 62 50 46 4b-34 66 51 71 30 74 42 79   /YUSbPFK4fQq0tBy
0120 - 36 53 39 6c 0a 78 6f 45-6d 50 47 79 52 49 7a 44   6S9l.xoEmPGyRIzD
0130 - 31 46 78 78 52 65 50 79-55 6a 69 78 63 39 66 41   1FxxRePyUjixc9fA
0140 - 59 6f 74 5a 31 53 71 71-2f 2b 37 77 69 52 2b 7a   YotZ1Sqq/+7wiR+z
0150 - 33 46 6f 65 51 58 73 53-64 32 78 32 44 4b 63 62   3FoeQXsSd2x2DKcb
0160 - 73 62 64 62 76 0a 2f 73-49 2b 68 63 57 39 4c 5a   sbdbv./sI+hcW9LZ
0170 - 48 4d 45 75 49 6a 4d 42-73 6f 6f 4d 52 6a 76 35   HMEuIjMBsooMRjv5
0180 - 79 78 79 50 67 38 33 35-34 66 46 6d 51 50 38 4a   yxyPg8354fFmQP8J
0190 - 49 73 54 54 48 31 54 56-5a 4f 47 48 79 49 62 76   IsTTH1TVZOGHyIbv
01a0 - 6e 34 7a 36 35 6b 0a 48-63 62 75 4f 52 38 43 41   n4z65k.HcbuOR8CA
01b0 - 77 45 41 41 54 41 4e 42-67 6b 71 68 6b 69 47 39   wEAATANBgkqhkiG9
01c0 - 77 30 42 41 51 55 46 41-41 4f 42 67 51 41 72 73   w0BAQUFAAOBgQArs
01d0 - 36 62 74 6f 38 6b 76 67-6b 48 70 4d 56 50 42 42   6bto8kvgkHpMVPBB
01e0 - 50 62 4e 71 6d 2f 62 0a-4a 78 4a 34 4a 78 5a 72   PbNqm/b.JxJ4JxZr
01f0 - 51 4c 6b 6a 48 7a 39 34-44 75 57 7a 64 67 41 6a   QLkjHz94DuWzdgAj
0200 - 56 2b 70 39 72 7a 65 76-37 56 65 57 44 49 5a 41   V+p9rzev7VeWDIZA
0210 - 78 39 6a 43 6b 65 39 59-51 4c 68 42 67 62 2b 7a   x9jCke9YQLhBgb+z
0220 - 48 73 6d 30 39 70 50 43-0a 4c 4f 50 37 4b 67 4b   Hsm09pPC.LOP7KgK
0230 - 42 78 6e 68 52 49 33 4f-43 48 41 39 6f 43 78 30   BxnhRI3OCHA9oCx0
0240 - 78 46 35 46 65 34 53 38-34 65 6b 30 5a 37 65 5a   xF5Fe4S84ek0Z7eZ
0250 - 4c 55 63 7a 52 41 6f 55-57 50 42 65 70 32 6e 62   LUczRAoUWPBep2nb
0260 - 44 77 39 78 6c 6e 30 57-49 0a 53 33 72 6d 2f 47   Dw9xln0WI.S3rm/G
0270 - 4d 6d 6e 4e 73 78 75 74-68 69 63 41 3d 3d 0a 2d   MmnNsxuthicA==.-
0280 - 2d 2d 2d 2d 45 4e 44 20-43 45 52 54 49 46 49 43   ----END CERTIFIC
0290 - 41 54 45 2d 2d 2d 2d 2d-0a                        ATE-----.
read from 0x14ad698 [0x13edaab] (5 bytes => 5 (0x5))
0000 - 0e 03 01                                          ...
0005 - <SPACES/NULS>
read from 0x14ad698 [0x13edaab] (5 bytes => -1 (0xFFFFFFFF))
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 724 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1398693078
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---

【问题讨论】:

    标签: ssl handshake


    【解决方案1】:

    PEM 肯定不是在线发送的正确格式。您应该以二进制形式发送(使用此 PEM 内容的 base-64 解码版本)。

    您还需要将它包装在其他层中,因为 certificate_list 中的 Certificate struct 是预期的。

    如果您想了解更多关于这一切的信息,可能值得查看使用 Wireshark 的工作实现产生的现有流量。它的SSL wiki page 甚至还有一个您可以使用的现有捕获文件。

    (您还提到您想要实施 TLS 1.2,但您发送的是用于 TLS 1.0 的 03 01,尽管在您实施的这个阶段这应该不是很重要。)

    【讨论】:

    • 我使用的是 3.1 版本,因为它是 Openssl 对 s_client 支持的最高版本。我使用了您提到的 Wireshark 页面以及其他资源,但没有一个真正显示证书消息的结构。他们都删除了内容。但是我应该能够自己捕获流量进行分析。谢谢。
    • 一些不太新的 OpenSSL 版本(至少几年前)支持 TLS 1.2。不确定 Wireshark 和其他“删除”所有内容的工具是什么意思。如果您从他们的 Wiki 打开“snakeoil”示例(即使没有设置私钥),会有一行显示“Server Hello, Certificate, Server Hello Done”。在下面的中间面板中,您可以展开“安全套接字层”->“证书”等。每当您单击一个条目时,它将在底部面板的十六进制转储中突出显示匹配部分,包括证书本身。
    • 这就是我的意思 openssl s_client -connect example.com:443 -debug -tls1。如果您提供 -tls2-tls3 作为参数,Openssl 不会将其识别为有效参数。当然 Openssl 支持TLS 1.2 有一段时间了。也许我不清楚,但我的意思是大多数关于 TLS 的在线教程都忽略了证书消息结构的细节。我已经使用 wireshark 捕获了我自己的 TLS 流量,并且该工具运行良好。除了记录层中的所有长度字段都是 3 个字节。这为我清除了一切。
    • 试试openssl s_client help,你会注意到-tls1_1-tls1_2(不知道你为什么要试试-tls2-tls3,因为没有TLS的版本2或3) .一般来说,你正在尝试做的是一个非常雄心勃勃的项目。您肯定需要多次阅读 RFC(包括“Presentation Language”部分)。
    • 试过了。 -tls1_1-tls1_2 未列出。无论如何,当我尝试它们时引发“未知选项”错误。 TLS 有三个版本:1.0(RFC 2246)、1.1(RFC 4346) 和 1.2(RFC 5246)。我数 3。我对“2”和“3”的使用不是这样的,但是,我假设由于 Openssl 将 v1.0 标识为 -tls1,那么 v1.2 将是 -tls2,依此类推。跨度>
    猜你喜欢
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2021-05-20
    相关资源
    最近更新 更多