Понимание протокола TLS / SSL

В настоящее время я посещаю университетский курс по безопасности и криптографии, и один из проектов, над которыми мы работаем, включает реализацию базового сокета TLS.

Так что я' Я изучал протокол TLS, используя как свой учебник, так и последний RFC , поэтому у меня довольно хорошее представление о том, как работает TLS / SSL, а также о том, как устроен формат записи TLS, побайтно. -byte.

Итак, для начала я решил написать серверную программу, которая прослушивает порт 443 и принимает входящие безопасные HTTP-соединения. Все, что он делает, это принимает соединение с клиентом, а затем распечатывает шестнадцатеричный дамп исходного сообщения, отправленного клиентом.

Но когда я подключаюсь к своему серверу с помощью веб-браузера (Firefox), я совершенно сбит с толку bytestream мне присылает браузер. Согласно 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, которое является частью рукопожатия, я бы ожидал, что самый первый байт в bytestream должен быть 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?

5
задан Channel72 2 December 2010 в 23:08
поделиться