Опубликован: 10.10.2007 | Уровень: специалист | Доступ: платный
Лекция 16:

Протокол TLS

Протокол записей TLS

Протокол записей TLS является послойным. На каждом уровне сообщения могут включать поля длины, описания и содержимого. Протокол записей берет сообщения, подлежащие пересылке, разбивает их на блоки, опционно сжимает данные, применяет MAC (Message Authentication Code), шифрует и передает результат. Полученные данные дешифруются, верифицируются, декомпрессируются, восстанавливается их первоначальный вид, результат передается клиентам верхнего уровня. (См. также http://book.itep.ru/6/tls.htm.)

Четыре протокола описаны в данном документе: протокол диалога, протокол уведомления, протокол спецификации изменения шифра, и прикладной информационный протокол. Чтобы позволить расширение протокола TLS, разрешена поддержка протоколом дополнительных типов записей. Любые новые типы записей должны размещать значения типа немедленно за величинами ContentType четырех типов, описанных здесь. Если реализация TLS получает рекорд нераспознаваемого типа, она должна его игнорировать. Любой протокол, предназначенный для использования поверх TLS, должен быть тщательно сконфигурирован, чтобы противостоять любым атакам. Заметим, что из-за того, что тип и длина записи не защищены шифрованием, следует принимать меры, чтобы минимизировать трафик анализа этих величин.

Состояния соединений

Состояние соединения TLS является операционной средой протокола записей TLS. Оно специфицирует алгоритмы сжатия, шифрования и MAC. Кроме того, известны параметры этих алгоритмов: секретный код MAC, а также ключи шифрования и IV (вектор инициализации) соединения для направлений чтения и записи. Логически существует четыре состояния соединения: текущие состояния чтения и записи и отложенные состояния чтения и записи. Все записи обрабатываются в текущих состояниях чтения или записи. Параметры безопасности для отложенных состояний могут быть установлены протоколом диалога TLS. Протокол диалога может селективно переводить любое отложенное состояние в текущее, при этом соответствующее текущее состояние становится отложенным. Не допускается формировать состояние, которое не инициализировано с учетом параметров безопасности текущего состояния. Исходное текущее состояние всегда специфицировано без компрессии, шифрования или MAC. Параметры безопасности для состояния чтения и записи соединения TLS задаются путем определения следующих величин (таблица 16.1).

Эти параметры определены в языке представления в виде:

enum { server, client } ConnectionEnd;
enum { null, rc4, rc2, des, 3des, des40 } BulkCipherAlgorithm;
enum { stream, block } CipherType;
enum { true, false } IsExportable;
enum { null, md5, sha } MACAlgorithm;
enum { null(0), (255) } CompressionMethod;
/* Алгоритмы, специфицированные в CompressionMethod,
BulkCipherAlgorithm и MACAlgorithm могут быть добавлены. */
struct { ConnectionEnd       entity;
         BulkCipherAlgorithm bulk_cipher_algorithm;
         CipherType          cipher_type;
         uint8               key_size;
         uint8               key_material_length;
         IsExportable        is_exportable;
         MACAlgorithm        mac_algorithm;
         uint8               hash_size;
         CompressionMethod   compression_algorithm;
         Opaque              master_secret[48];
         Opaque              client_random[32];
         Opaque              server_random[32];} SecurityParameters;
Таблица 16.1.
Конец соединения Клиент или сервер участник соединения.
Алгоритм массового шифрования Алгоритм, используемый для массового шифрования. Эта спецификация включает размер ключа алгоритма, степень секретности ключа, является ли этот шифр блочным или поточным, размер блока и является ли шифр экспортным.
Алгоритм MAC Алгоритм аутентификации сообщений. Эта спецификация включает размер хэша, который возвращается алгоритмом MAC.
Алгоритм сжатия Алгоритм сжатия данных. Эта спецификация должна включать всю информацию, необходимую для выполнения компрессии.
Секретный код сервера (master secret) 48-байтовый секретный код, общий для обоих партеров соединения.
Случайный код клиента 32-байтный код, предоставляемый клиентом.
Случайный код сервера 32-байтный код, предоставляемый сервером.

Уровень записей будет использовать параметры безопасности для формирования следующих шести объектов:

  • Секретный код MAC записи клиента
  • Секретный код MAC записи сервера
  • Ключ записи клиента
  • Ключ записи сервера
  • IV записи клиента (только для блочного шифра)
  • IV записи сервера (только для блочного шифра)

Параметры записи клиента используются сервером при получении и обработке записей и наоборот. Раз параметры безопасности определены и ключи сформированы, состояния соединения могут быть в любой момент реализованы путем перевода их в текущее состояние. Эти текущие состояния должны актуализоваться после обработки записи. Каждое состояние соединения включает в себя следующие элементы:

Состояние сжатия Текущее состояние алгоритма сжатия.
Состояние шифра Текущее состояние алгоритма шифрования. Оно состоит из текущего ключа для данного соединения. Кроме того, для блочного шифра, работающего в режиме CBC (единственный режим, специфицированный в TLS ), оно в исходный момент содержит IV для данного состояния соединения и должно актуализоваться, чтобы содержать текст последнего шифрованного или дешифрованного блока. Для поточных шифров оно содержит всю необходимую информацию для продолжения шифрования или дешифрования данных.
Секретный код MAC Секретный код MAC для данного соединения.
Номер по порядку Каждое состояние соединения содержит номер по порядку, который поддерживается независимо для состояний чтения и записи. Номер по порядку должен быть установлен равным нулю, как только соединение переведено в активное состояние. Номера по порядку имеют тип uint64 и не могут превышать 264-1. Номер по порядку инкрементируется после прихода каждой записи: в частности, первая запись, передаваемая через некоторое соединение, имеет порядковый номер 0.

Уровень записей

Уровень записей TLS получает неинтерпретированные данные от верхних уровней в непустых блоках произвольного размера.

Уровень записей фрагментирует информационные блоки и превращают их в записи TLSPlaintext, несущие данные в виде последовательностей длиной 214 байтов или меньше. Границы сообщения клиента на уровне записей не сохраняются (т.e., несколько сообщений клиента одного и того же ContentType могут быть объединены в одну запись TLSPlaintext, или одно сообщение может быть фрагментировано).

struct { uint8 major, minor;} ProtocolVersion;
enum         { change_cipher_spec(20), alert(21), handshake(22),
             application_data(23), (255)
             } ContentType;
struct { ContentType type;
             ProtocolVersion version;
             uint16 length;
             opaque fragment[TLSPlaintext.length];
             } TLSPlaintext;
type Протокол верхнего уровня, использованный для обработки вложенного фрагмента.
version Версия примененного протокола.
length Длина (в байтах) следующего TLSPlaintext.fragment. Длина не должна превосходить 214.
Fragment Прикладные данные. Эти данные прозрачны и обрабатываются как независимые блоки, с которыми должен работать протокол верхнего уровня, специфицированный полем тип.

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

Все записи сжаты с использованием алгоритма сжатия, определенным состоянием текущей сессии. Всегда имеется активный алгоритм сжатия; однако в исходный момент он определен как CompressionMethod. null. Алгоритм сжатия преобразует структуру TLSPlaintext в структуру TLSCompressed. Функции сжатия инициализируются информацией по умолчанию при переходе соединения в активное состояние.

Должно использоваться сжатие без потерь, а длина содержимого не может стать больше чем 1024 байт. Если функция восстановления встречает фрагмент TLSCompressed.fragment, длина которого окажется больше 214 байт, она должна выдать уведомление о фатальной ошибке преобразования.

Struct { ContentType type;       /* то же самое, что и TLSPlaintext.type */
       ProtocolVersion version;  /* то же самое, что и TLSPlaintext.version */
       uint16 length;
       opaque fragment
       [TLSCompressed.length];
       } TLSCompressed;
length Длина (в байтах) следующего TLSCompressed.fragment. Длина не должна превосходить 214 + 1024.
Fragment Сжатая форма TLSPlaintext.fragment.

Операция CompressionMethod.null является идентификационной; ни одно из полей здесь не меняется.

Функции декомпрессии (восстановления) отвечают за то, что внутренний буфер не будет переполнен при обработке сообщения.

Функции шифрования и MAC преобразуют структуру TLSCompressed в TLSCiphertext. Функции дешифрования выполняют обратную процедуру. MAC записи включает также номер по порядку, чтобы было можно детектировать лишние или повторные сообщения.

Struct { ContentType type;
       ProtocolVersion version;
       uint16 length;
       select (CipherSpec.cipher_type) {
       case stream: GenericStreamCipher;
       case block: GenericBlockCipher; } fragment;
       } TLSCiphertext;
type Поле тип идентично TLSCompressed.type.
Version Поле версия идентично TLSCompressed.version.
length Длина (в байтах) последующего TLSCiphertext.fragment. Длина не может превосходить 214 + 2048.
Fragment Зашифрованная форма TLSCompressed.fragment, с MAC.
Наталья Шульга
Наталья Шульга

Курс "информационная безопасность" .

Можно ли на него записаться на ПЕРЕПОДГОТОВКУ по данному курсу? Выдается ли диплом в бумажном варианте и высылается ли он по почте?

Нияз Сабиров
Нияз Сабиров

Здравствуйте. А уточните, пожалуйста, по какой причине стоимость изменилась? Была стоимость в 1 рубль, стала в 9900 рублей.

Авхьад Нагаев
Авхьад Нагаев
Казахстан
Covalenco Igor
Covalenco Igor
Россия, Киев