CLIENT
SERVER
TLS 协议 分两层:
1. TLS 握手协议 (身份认证、密钥协商)
2. TLS 记录协议 (数据加密、压缩、发送接收等)
1. Client Hello
read from 0xb8880ab8 [0xb888a2e3] (5 bytes => 5 (0x5))
0000 - 16 03 01 00 7b
Received Record
Header:
....{
Version = TLS 1.0 (0x301)
Content Type = Handshake (22)
Length = 123
read from 0xb8880ab8 [0xb888a2e8] (123 bytes => 123 (0x7B))
0000 - 01 00 00 77 03 03 5e 28-01 6a b5 0a fd d0 11 1f
0010 - f4 7e 4d 66 82 67 7d 05-33 a2 70 81 4f e4 62 5d
0020 - 32 d5 c4 98 07 5e 00 00-04 e1 02 00 ff 01 00 00
0030 - 4a 00 0b 00 04 03 00 01-02 00 0a 00 0c 00 0a 00
0040 - 1e 00 1d 00 17 00 19 00-18 00 23 00 00 00 0d 00
0050 - 22 00 20 06 01 06 02 06-03 05 01 05 02 05 03 04
0060 - 01 04 02 04 03 03 01 03-02 03 03 02 01 02 02 02
0070 - 03 07 07 00 16 00 00 00-17
007b -
...w..^(.j......
.~Mf.g}.3.p.O.b]
2....^..........
J...............
..........#.....
". .............
................
.........
ClientHello, Length=119
client_version=0x303 (TLS 1.2)
Random:
gmt_unix_time=0x5E28016A (时间戳)
random_bytes
(len=28):
B50AFDD0111FF47E4D6682677D0533A270814FE4625D32D5C
498075E (随机数, 用于后续用伪随机方法散列生产会话过程的对称 SM4 密钥)
session_id (len=0):
cipher_suites (len=4)
{0xE1, 0x02} GMTLS_ECDHE_SM2_WITH_SMS4_SM3
{0x00, 0xFF} TLS_EMPTY_RENEGOTIATION_INFO_SCSV
compression_methods (len=1)
No Compression (0x00)
extensions, length = 74
extension_type=ec_point_formats(11), length=4
uncompressed (0)
ansiX962_compressed_prime (1)
ansiX962_compressed_char2 (2)
extension_type=elliptic_curves(10), length=12
sm2p256v1 (30)
ecdh_x25519 (29)
secp256r1 (P-256) (23)
secp521r1 (P-521) (25)
secp384r1 (P-384) (24)
extension_type=session_ticket(35), length=0
extension_type=signature_algorithms(13), length=34
sha512+rsa (6+1)
sha512+dsa (6+2)
sha512+ecdsa (6+3)
sha384+rsa (5+1)
sha384+dsa (5+2)
sha384+ecdsa (5+3)
sha256+rsa (4+1)
sha256+dsa (4+2)
sha256+ecdsa (4+3)
sha224+rsa (3+1)
sha224+dsa (3+2)
sha224+ecdsa (3+3)
sha1+rsa (2+1)
sha1+dsa (2+2)
sha1+ecdsa (2+3)
sm3+sm2sign (7+7)
extension_type=encrypt_then_mac(22), length=0
extension_type=extended_master_secret(23), length=0
....
TLS client extension "EC point formats" (id=11), len=4
0000 - 03 00 01 02
TLS client extension "elliptic curves" (id=10), len=12
0000 - 00 0a 00 1e 00 1d 00 17-00 19 00 18
TLS client extension "session ticket" (id=35), len=0
TLS client extension "signature algorithms" (id=13), len=34
0000 - 00 20 06 01 06 02 06 03-05 01 05 02 05 03 04 01
0010 - 04 02 04 03 03 01 03 02-03 03 02 01 02 02 02 03
0020 - 07 07
TLS client extension "encrypt-then-mac" (id=22), len=0
TLS client extension "extended master secret" (id=23), len=0
..
............
. ..............
................
2. Server Hello
read from 0xb784d748 [0xb785365b] (5 bytes => 5 (0x5))
0000 - 16 03 03 00 45
Received Record
Header:
....E
Version = TLS 1.2 (0x303)
Content Type = Handshake (22)
Length = 69
read from 0xb784d748 [0xb7853660] (69 bytes => 69 (0x45))
0000 - 02 00 00 41 03 03 55 1b-fc 47 c4 6f 49 9a 19 fc
0010 - 0b f2 e0 4c 59 ac d2 48-ee 09 18 ce 11 54 e4 5a
0020 - 34 ea 81 bc 37 b2 00 e1-02 00 00 19 ff 01 00 01
0030 - 00 00 0b 00 04 03 00 01-02 00 23 00 00 00 16 00
0040 - 00 00 17
0045 -
...A..U..G.oI...
...LY..H.....T.Z
4...7...........
..........#.....
...
ServerHello, Length=65
server_version=0x303 (TLS 1.2)
Random:
gmt_unix_time=0x551BFC47
random_bytes
(len=28):
C46F499A19FC0BF2E04C59ACD248EE0918CE1154E45A34EA81BC37B2
session_id (len=0):
cipher_suite {0xE1, 0x02} GMTLS_ECDHE_SM2_WITH_SMS4_SM3
compression_method: No Compression (0x00)
extensions, length = 25
extension_type=renegotiate(65281), length=1
extension_type=ec_point_formats(11), length=4
uncompressed (0)
ansiX962_compressed_prime (1)
ansiX962_compressed_char2 (2)
extension_type=session_ticket(35), length=0
extension_type=encrypt_then_mac(22), length=0
extension_type=extended_master_secret(23), length=0
TLS server extension "renegotiation info" (id=65281), len=1
0001 -
TLS server extension "EC point formats" (id=11), len=4
0000 - 03 00 01 02
TLS server extension "session ticket" (id=35), len=0
TLS server extension "encrypt-then-mac" (id=22), len=0
TLS server extension "extended master secret" (id=23), len=0
....
3. Certificate (Server)
服务端证书,使用 CA 公钥签名。 客户端用 CA 公钥,来验证签名。
验证签名方法:
(1)SM3 计算验证签名数据的摘要
用户 ID 的 bit 位长度 00 80
+ ID (1234567812345678)
+ Public Key (p,a,b,n,Gx,Gy)
(Sm3) Digest_temp1;
Disgest_temp1
+ 验签的数据(证书数据)
(SM3) Digest_Final
(2) SM2 验证签名:
应该是用 CA 的公钥,加密 Digest_Final, 然后和签名数据(证书中原签名)
进行比较。 (具体方法是 SM2 Digest 内部实现, 算法未深入研究。)
GMSSL 源码中的函数 “SM2_do_verify(digest,len,signature,ec_key)”
============= calculate digest data: =============
30820265a003020102020109300a06082a811ccf55018375308191310b30090603550
4061302434e3111300f06035504080c084c69616f6e696e673111300f06035504070c
085368656e79616e6731153013060355040a0c0c4e6575736f667420436f72
7031153013060355040b0c0c4e6575736f667420436f72703111300f06035504030c0
84e65752e524f4f54311b301906092a864886f70d010901160c6e657540736f66742e
636f6d301e170d3138303832313036323332395a170d323830383138303632
3332395a308181310b300906035504061302434e3111300f06035504080c084c69616
f6e696e6731153013060355040a0c0c4e6575736f667420436f72703110300e060355
040b0c074269616e7a61693113301106035504030c0a4e65752e5365727665
723121301f06092a864886f70d0109011612536572766572406e6575736f66742e636
f6d3059301306072a8648ce3d020106082a811ccf5501822d03420004cf1af7401073
c76e2aa1aecae34afb252b2b76553efcb820d918abae2404b254b275d2e4f4
0034b94a68025aa57316e3a0fb4898db81dd25e40b3915e3fd83c7a381bb3081b8300
90603551d1304023000301106096086480186f8420101040403020640303306096086
480186f842010d042616244f70656e53534c2047656e657261746564205365
72766572204365727469666963617465301d0603551d0e04160414c7e9cc40069ea05
464c782a01a0532d4ac63a5fd301f0603551d23041830168014f0e24ad78212ab26ee
2c1af8448ad4d029146bf4300e0603551d0f0101ff0404030205a030130603
551d25040c300a06082b06010505070301
============== ID: ==============
31323334353637383132333435363738
============== Public Key: ==============
fffffffeffffffffffffffffffffffffffffffff00000000fffffffffffffffc
28e9fa9e9d9f5e344d5a9e4bcf6509a7f39789f515ab8f92ddbcbd414d940e93
32c4ae2c1f1981195f9904466a39c9948fe30bbff2660be1715a4589334c74c7
bc3736a2f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a0
15ed4750147f9314fff3417eeb5ee19a42d1f6b4f1c7fd4345d6d84f6f797da1
23ada5ef12a7b22ccce28c57b198b081fed5fee24dbb758398b450c6e5fd9a8e
sm3_update, ================= data_len = 2 =================
sm3_update,================= data: ====================
0080
sm3_update, ================= data_len = 16 =================
sm3_update,================= data: ====================
31323334353637383132333435363738
sm3_update, ================= data_len = 192 =================
sm3_update,================= data: ====================
fffffffeffffffffffffffffffffffffffffffff00000000fffffffffffffffc28e9f
a9e9d9f5e344d5a9e4bcf6509a7f39789f515ab8f92ddbcbd414d940e9332c4ae2c1f
1981195f9904466a39c9948fe30bbff2660be1715a4589334c74c7bc3736a2
f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a015ed4750147f9
314fff3417eeb5ee19a42d1f6b4f1c7fd4345d6d84f6f797da123ada5ef12a7b22ccc
e28c57b198b081fed5fee24dbb758398b450c6e5fd9a8e
sm3_final, ================= digest: ====================
4e89f8ff c9bb42a8 a857ad07 2a7e95b9 d957b30a 27bfe321 82689508 ddbeda55
sm3_update, ================= data_len = 32 =================
sm3_update,================= data: ====================
fff8894ea842bbc907ad57a8b9957e2a0ab357d921e3bf270895688255dabedd
sm3_update, ================= data_len = 617 =================
sm3_update,================= data: ====================
30820265a003020102020109300a06082a811ccf55018375308191310b30090603550
4061302434e3111300f06035504080c084c69616f6e696e673111300f06035504070c
085368656e79616e6731153013060355040a0c0c4e6575736f667420436f72
7031153013060355040b0c0c4e6575736f667420436f72703111300f06035504030c0
84e65752e524f4f54311b301906092a864886f70d010901160c6e657540736f66742e
636f6d301e170d3138303832313036323332395a170d323830383138303632
3332395a308181310b300906035504061302434e3111300f06035504080c084c69616
f6e696e6731153013060355040a0c0c4e6575736f667420436f72703110300e060355
040b0c074269616e7a61693113301106035504030c0a4e65752e5365727665
723121301f06092a864886f70d0109011612536572766572406e6575736f66742e636
f6d3059301306072a8648ce3d020106082a811ccf5501822d03420004cf1af7401073
c76e2aa1aecae34afb252b2b76553efcb820d918abae2404b254b275d2e4f4
0034b94a68025aa57316e3a0fb4898db81dd25e40b3915e3fd83c7a381bb3081b8300
90603551d1304023000301106096086480186f8420101040403020640303306096086
480186f842010d042616244f70656e53534c2047656e657261746564205365
72766572204365727469666963617465301d0603551d0e04160414c7e9cc40069ea05
464c782a01a0532d4ac63a5fd301f0603551d23041830168014f0e24ad78212ab26ee
2c1af8448ad4d029146bf4300e0603551d0f0101ff0404030205a030130603
551d25040c300a06082b06010505070301
sm3_final, ================= digest: ====================
35873d11 e7e91774 69bd8d71 51bc9ce6 c161bce8 e8f3102d 92669188 427dfc3e
============ calculated digest: ==============
11 3d 87 35 74 17 e9 e7 71 8d bd 69 e6 9c bc 51 e8 bc 61 c1 2d 10 f3 e8
88 91 66 92 3e fc 7d 42
============ signature data from cert: ==============
30 45 02 21 00 b8 f8 2c b8 30 e6 0c 19 17 f8 96 09 9e 05 21 4a a0 66 15
a9 29 bb 20 04 93 f4 35 32 19 95 42 97 02 20 38 45 be 98 72 59 b6 39 2b
bc c8 88 d9 3c 50 f9 92 a0 51 a3 d4 b8 97 a3 55 73 46 50
e5 f5 66 4f
SM2_verify debug| dgst :============
113d87357417e9e7718dbd69e69cbc51e8bc61c12d10f3e8889166923efc7d42
SM2_verify debug| sig :============
3045022100b8f82cb830e60c1917f896099e05214aa06615a929bb200493f43532199
5429702203845be987259b6392bbcc888d93c50f992a051a3d4b897a355734650e5f5
664f
SM2_verify OK!
4. Server Key Exchange
发送数据中包含:
参与验证签名的数据 DATA,
签名 Signature_S (参与签名的数据包含: Client/server 的时间戳和随机数
及 DATA)
客户端对接收的数据,进行 SM3/SM2 验签。
(1) SM3 计算 Digest
用户 IDbit 位长度 00 80
+ ID (1234567812345678)
+ PublicKey
Digest_temp1
Disgest_temp1
+Client (时间戳+随机数,32B)
+Server (时间戳+随机数,32B)
+参与签名的数据 DATA
Digest_Final
(2) SM2 验证签名
SM2 digest is “Digest_Final”, signature is “Signatrue_S”。
Received Record
Header:
Version = TLS 1.2 (0x303)
Content Type = Handshake (22)
Length = 149
read from 0xb784d748 [0xb7853660] (149 bytes => 149 (0x95))
0000 - 0c 00 00 91 03 00 1e 41-04 94 7d c4 a8 a3 ee 89
0010 - 6e e0 e3 f0 b7 2b bf 25-76 18 cb 48 cc 93 56 b7
0020 - aa 8b f6 c5 cc 2d 26 99-63 70 7b 2b ef 20 e3 ee
0030 - 99 9c 5a 68 2f f6 75 6c-1b e4 32 df b1 34 9f 06
0040 - b3 4c fa d0 ab 6c 9c 10-f6 07 07 00 48 30 46 02
0050 - 21 00 9f dc 43 09 fb f6-db 10 df e2 70 ca 9a 60
0060 - e8 ba 3f ee ba cb c3 4e-e6 2b e1 65 82 ec df c6
0070 - de 06 02 21 00 eb a2 18-e3 e4 cf 84 e6 3d 7a 44
0080 - 47 73 92 8f 9a 39 fb 1b-a6 ee 7b 4f be 5e be 97
0090 - ab 8a cf 8f 04
.......A..}.....
n....+.%v..H..V.
.....-&.cp{+. ..
..Zh/.ul..2..4..
.L...l......H0F.
!...C.......p..`
..?....N.+.e....
...!.........=zD
Gs...9....{O.^..
.....
ServerKeyExchange, Length=145
KeyExchangeAlgorithm=ECDHE
named_curve: sm2p256v1 (30)
point
(len=65):
04947DC4A8A3EE896EE0E3F0B72BBF257618CB48CC9356B7AA8BF6C5CC2D269963707
B2BEF20E3EE999C5A682FF6756C1BE432DFB1349F06B34CFAD0AB6C9C10F6
Signature Algorithm sm3+sm2sign (7+7)
Signature
(len=72):
30460221009FDC4309FBF6DB10DFE270CA9A60E8BA3FEEBACBC34EE62BE16582ECDFC
6DE06022100EBA218E3E4CF84E63D7A444773928F9A39FB1BA6EE7B4FBE5EBE97AB8A
CF8F04
============== ID: ==============
31323334353637383132333435363738
============== Public Key: ==============
fffffffeffffffffffffffffffffffffffffffff00000000fffffffffffffffc
28e9fa9e9d9f5e344d5a9e4bcf6509a7f39789f515ab8f92ddbcbd414d940e93
32c4ae2c1f1981195f9904466a39c9948fe30bbff2660be1715a4589334c74c7
bc3736a2f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a0
cf1af7401073c76e2aa1aecae34afb252b2b76553efcb820d918abae2404b254
b275d2e4f40034b94a68025aa57316e3a0fb4898db81dd25e40b3915e3fd83c7
sm3_update, ================= data_len = 2 =================
sm3_update,================= data: ====================
0080
sm3_update, ================= data_len = 16 =================
sm3_update,================= data: ====================
31323334353637383132333435363738
sm3_update, ================= data_len = 192 =================
sm3_update,================= data: ====================
fffffffeffffffffffffffffffffffffffffffff00000000fffffffffffffffc28e9f
a9e9d9f5e344d5a9e4bcf6509a7f39789f515ab8f92ddbcbd414d940e9332c4ae2c1f
1981195f9904466a39c9948fe30bbff2660be1715a4589334c74c7bc3736a2
f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a0cf1af7401073c
76e2aa1aecae34afb252b2b76553efcb820d918abae2404b254b275d2e4f40034b94a
68025aa57316e3a0fb4898db81dd25e40b3915e3fd83c7
sm3_final, ================= digest: ====================
52748b60 edce63ed 2c8d551b 80d74db0 aca91cb2 ca9ca75a b5a6d765 6d6603e7
sm3_update, ================= data_len = 32 =================
sm3_update,================= data: ====================
608b7452ed63ceed1b558d2cb04dd780b21ca9ac5aa79cca65d7a6b5e703666d
sm3_update, ================= data_len = 32 =================
sm3_update,================= data: ====================
5e28016ab50afdd0111ff47e4d6682677d0533a270814fe4625d32d5c498075e
sm3_update, ================= data_len = 32 =================
sm3_update,================= data: ====================
551bfc47c46f499a19fc0bf2e04c59acd248ee0918ce1154e45a34ea81bc37b2