В настоящее время я беру университетский класс по безопасности и криптографии, и один из проектов, которые мы делаем, включает в себя реализацию базового TLS-сокета.Понимание протокола TLS/SSL
Итак, я изучил протокол TLS, используя как мой учебник, так и последние RFC, поэтому у меня довольно хорошее представление о том, как работает TLS/SSL, а также о том, как выкладывается формат записи TLS, байт -по байт.
Итак, для начала я решил написать серверную программу, которая прослушивает порт 443 и принимает входящие защищенные HTTP-соединения. Все, что он делает, - это принять клиентское соединение, а затем распечатать шестнадцатеричный дамп исходного сообщения, отправленного клиентом.
Но когда я подключаюсь к своему серверу с помощью веб-браузера (Firefox), я полностью озадачен потоковым потоком, который меня отправляет браузер. According to the RFC, первое, что должен сделать клиент TLS, - отправить сообщение ClientHello
. Все сообщения должны быть инкапсулированы в формате запись TLS, который должен быть отформатирован, как это (с использованием C-МОГЛО обозначений 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?
удивительный источник, thx! – kraiz