0

服务器如何使用证书私钥在 TLS 1.3 中创建证书验证消息?以及客户端如何使用证书公钥来验证握手不被修改?只是在 TLS 1.3 而不是 TLS 1.2

4

1 回答 1

0

作为对 TLS 1.3 握手阶段的一个很好的概述,我喜欢使用这个站点,它将连接分解为更容易理解的阶段,然后通过 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. 到此添加握手的hash

$ 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
于 2019-03-27T17:17:47.593 回答