服务器如何使用证书私钥在TLS 1.3中创建证书验证消息?客户端如何使用证书公钥来验证握手是否被修改?仅在TLS 1.3中,而不在TLS 1.2中
答案 0 :(得分:0)
作为TLS 1.3握手阶段的一个很好的概述,我喜欢使用site,它将连接断开,使其更容易理解,然后再通过RFC。
从以上站点:
签名
因为服务器正在为每个服务器生成临时密钥 会话(在TLS 1.2中是可选的,在TLS 1.3中是必需的),该会话不是 与证书的先前版本固有地绑定在一起 TLS,当证书的公用/专用密钥用作密钥时 交换。
为了证明服务器拥有服务器证书(给予 TLS会话中的证书有效性),它会签名 使用证书的私钥的握手消息。签名 客户可以使用证书的公共证明其有效 键。 08 04-RSA-PSS-RSAE-SHA256签名01 00的保留值 -0x100(256)字节的签名数据遵循17 fe b5 ... 36 9f 9e-此握手哈希中的签名我们可以验证签名 自己在命令行中使用服务器的证书:
构建已签名的数据:
1。添加64个空格字符
$ echo -n ' ' > /tmp/tosign
$ echo -n ' ' >> /tmp/tosign
2。添加此固定字符串
$ echo -n 'TLS 1.3, server CertificateVerify' >> /tmp/tosign
3。添加一个空字符
$ echo -en '\0' >> /tmp/tosign
4。在这一点上添加握手哈希值
$ handshake_hash=3e66361ada42c7cb97f9a62b00cae1d8b584174c745f9a338cf9f7cdd51d15f8
$ echo $handshake_hash | xxd -r -p >> /tmp/tosign
复制我们要验证的签名
$ echo "17 fe b5 33 ca 6d 00 7d 00 58 25 79 68 42 4b bc 3a a6 90
9e 9d 49 55 75 76 a5 20 e0 4a 5e f0 5f 0e 86 d2 4f f4 3f 8e b8 61
ee f5 95 22 8d 70 32 aa 36 0f 71 4e 66 74 13 92 6e f4 f8 b5 80 3b
69 e3 55 19 e3 b2 3f 43 73 df ac 67 87 06 6d cb 47 56 b5 45 60 e0
88 6e 9b 96 2c 4a d2 8d ab 26 ba d1 ab c2 59 16 b0 9a f2 86 53 7f
68 4f 80 8a ef ee 73 04 6c b7 df 0a 84 fb b5 96 7a ca 13 1f 4b 1c
f3 89 79 94 03 a3 0c 02 d2 9c bd ad b7 25 12 db 9c ec 2e 5e 1d 00
e5 0c af cf 6f 21 09 1e bc 4f 25 3c 5e ab 01 a6 79 ba ea be ed b9
c9 61 8f 66 00 6b 82 44 d6 62 2a aa 56 88 7c cf c6 6a 0f 38 51 df
a1 3a 78 cf f7 99 1e 03 cb 2c 3a 0e d8 7d 73 67 36 2e b7 80 5b 00
b2 52 4f f2 98 a4 da 48 7c ac de af 8a 23 36 c5 63 1b 3e fa 93 5b
b4 11 e7 53 ca 13 b0 15 fe c7 e4 a7 30 f1 36 9f 9e" | xxd -r -p > /tmp/sig
从证书中提取公钥
$ openssl x509 -pubkey -noout -in server.crt > server.pub
验证签名
$ cat /tmp/tosign | openssl dgst -verify server.pub -sha256 \
-sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:-1 -signature /tmp/sig
Verified OK