В настоящее время я учусь в университете на предмет безопасности и криптографии, и один из проектов, который мы делаем, включает реализацию базового сокета TLS.
Итак, я изучил протокол TLS, используя оба моихучебник, а также последний RFC , так что я довольно хорошо понимаю, как работает TLS / SSL, а также как формат записи TLS, побайтный.
Итак, для начала я решил написать серверную программу, которая прослушивает порт 443 и принимает входящие безопасные HTTP-соединения.Все, что он делает, это принимает соединение с клиентом, а затем распечатывает шестнадцатеричный дамп исходного сообщения, отправленного клиентом.
Но когда я подключаюсь к своему серверу с помощью веб-браузера (Firefox), я полностьюсбитый с толку потоком, который посылает мне браузер. Согласно RFC , первое, что должен сделать клиент TLS, это отправить сообщение ClientHello
.Все сообщения должны быть инкапсулированы в формате записи TLS, который должен быть отформатирован следующим образом (с использованием нотации C-ish, используемой RFC):
struct {
ContentType type;
ProtocolVersion version;
uint16 length;
opaque fragment[TLSPlaintext.length];
} TLSPlaintext;
Поле ContentType
представляет собой одно значение перечисленияэто должен быть один из следующих типов: change_cipher_spec = 0x14, alert = 0x15, handshake = 0x16, application_data = 0x17
Итак, поскольку первое, что клиент должен сделать, это отправить сообщение ClientHello, которое является частью рукопожатия, я ожидаю, что самый первый байт вбайтовым потоком должен быть 0x16
, указывающий, что это сообщение о рукопожатии.
Но вместо этого фактический байтовый поток, который отправляет мой браузер:
80 55 01 03 00 00 3c 00 00 00 10 00 00 88 00 00 87 00 00 39 00 00
38 00 00 84 00 00 35 00 00 45 00 00 44 00 00 33 00 00 32 00 00 96
00 00 41 00 00 04 00 00 05 00 00 2f 00 00 16 00 00 13 00 fe ff 00
00 0a 00 00 ff 07 99 58 ad 17 f3 17 23 be 63 8c 6d cb 9b 5f 6f
Я не могу понятьэтот поток, даже после заливки RFC в течение нескольких часов.Все, что я прочитал о TLS, говорит мне, что первый байт должен быть 0x16
для обозначения рукопожатия, за которым следует двухбайтовое поле версии, за которым следует двухбайтовое поле длины записи.Но этот поток байтов начинается с 0x80 0x55
, что для меня бессмысленно.
Может кто-нибудь прояснить, что здесь происходит?Я неправильно понимаю некоторую часть протокола TLS?