Как и когда протокол рукопожатия использовать для сертификата закрытый ключ?
Как сервер использует закрытый ключ сертификата для создания сообщения проверки сертификата в TLS 1.3? А как Клиент, использующий открытый ключ Сертификата для проверки рукопожатия, не подлежит изменению? Просто в TLS 1.3 не в TLS 1.2
1 ответ
В качестве хорошего обзора фаз рукопожатия 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. добавьте хэш рукопожатия к этому пункту
$ 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