Понимание протокола TLS / SSL - PullRequest
5 голосов
/ 03 декабря 2010

В настоящее время я учусь в университете на предмет безопасности и криптографии, и один из проектов, который мы делаем, включает реализацию базового сокета 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?

Ответы [ 2 ]

9 голосов
/ 03 декабря 2010

То, что вы видите, является совместимым с версией 2 SSL.Посмотрите на приложение E к RFC 5246 .Я не верю, что новейшие версии Firefox отправят это, они отправят только тот привет формат V3, который вы ожидали.

5 голосов
/ 03 декабря 2010

В Wireshark есть парсер для HTTPS / TLS / SSL, который сможет разобраться в текстовой части рукопожатия.

Также обязательно прочитайте Первые несколько миллисекунд HTTPS-соединения n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...