2010-12-02 2 views
5

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

ответ

9

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

5

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

Также не забудьте прочитать The First few milliseconds of an HTTPS connectio n.

+0

удивительный источник, thx! – kraiz

Смежные вопросы