Экстернат |
Безопасность на транспортном уровне: SSL и TLS
7.3. Форматы сообщения SSL
Мы уже знаем, что сообщения из трех протоколов и данные от прикладного уровня инкапсулируются (вставляются) в сообщения протокола передачи записей. Другими словами, сообщение в протокол передачи записей инкапсулируется из четырех различных источников на стороне передатчика. На стороне приемника протокол передачи записей извлекает сообщения и доставляет их различным пунктам назначения. Протокол передачи записей имеет общий заголовок, который добавляется к каждому сообщению, прибывающему от источников, как показано на рис. 7.23.
Ниже приводится описание полей.
- Протокол. Это 1-байтовое поле определяет источник или пункт назначения инкапсулированного сообщения. Оно используется для мультиплексирования и демультиплексирования. Значения - 20 (ChangeCipherSpec-протокол), 21 (аварийный протокол), 22 (протокол установления соединения) и 23 (данные от прикладного уровня).
- Версия. Это 2-байтовое поле определяет версию SSL; один байт - первая цифра версии и другой - вторая. Текущая версия SSL - 3.0.
- Длина. Это 2-байтовое поле определяет размер сообщения (без заголовка) в байтах.
ChangeCipherSpec-протокол
Как мы говорили раньше, протокол ChangeCipherSpec имеет одно сообщение: ChangeCipherSpec. Это сообщение содержит только один байт, инкапсулированный в сообщение протокола передачи записей со значением 20, как показано на рис. 7.24.
Однобайтовое поле в сообщении названо CCS, и его значение в настоящее время равно 1.
Аварийный протокол
Аварийный протокол, как мы говорили прежде, имеет одно сообщение - рапорт об ошибках в процессе. рис. 7.25 показывает инкапсуляцию этого единственного сообщения в Протоколе передачи записей со значением 21.
Два поля аварийного сообщения разъясняются ниже.
- Уровень. Это однобайтовое поле определяет уровень ошибки. В настоящее время определены два уровня: предупреждение и полный отказ.
- Описание. Однобайтовое описание определяет тип ошибки.
Протокол установления соединения
Несколько сообщений были определены для протокола установления соединения. Все эти сообщения имеют четырехбайтовый типовой заголовок, показанный на рис. 7.26. Рисунок приводит заголовок протокола передачи записей и типовой заголовок для протокола установления соединения. Обратите внимание, что значение поля протокола - 22.
- Тип. Это однобайтовое поле определяет тип сообщения. В настоящее время определены десять типов, которые перечислены в табл. 7.5.
- Длина. Это трехбайтовое поле определяет длину сообщения (исключая длину типа и поля длины). Читатель может задать вопрос: почему мы нуждаемся в двух полях длины - одном в общем заголовке протокола передачи записей и одном в типовом заголовке для сообщений установления соединения? Ответ: сообщение протокола передачи записей может доставить два сообщения установления соединения в одно и то же время, если нет потребности передать другое сообщение между ними.
Сообщение HelloRequest
Сообщение HelloRequest, которое используется редко, является запросом от сервера к клиенту для перезапуска сеанса. Это может быть необходимо, если в сервере обнаружены сбои и необходим новый сеанс. Например, если сеанс становится таким длинным, что это угрожает его безопасности, сервер может передать рассматриваемое сообщение. Клиент тогда должен передать сообщение ClientHello и договориться о параметрах безопасности. рис. 7.27 показывает формат такого сообщения. Это - четыре байта со значением типа 0. Он не имеет никакого текстового блока, так что значение поля длины - также 0.
Сообщение ClientHello
Сообщение ClientHello - первое сообщение в обмене при установлении соединения. На рис. 7.28 показан формат сообщения.
Поле "тип" и поле длины предварительно были уже обсуждены. Ниже приводится краткое описание других полей.
- Версия. Это 2-байтовое поле показывает версии используемого SSL. Версия - 3.0 для SSL и 3.1 - для TLS. Обратите внимание, что значение версии, например, 3.0, сохраняется в двух байтах: 3 в первом байте и 0 - во втором.
- Случайное число клиента. Это 32-байтовое поле используется клиентом, чтобы передать случайное число, которое создает параметры безопасности.
- Длина ID сеанса. Это 1-байтовое поле определяет длину ID сеанса (следующее поле). Если нет ID сеанса, значение этого поля - 0.
- ID сеанса. Значение этого поля переменной длины - 0, когда клиент начинает новый сеанс. ID сеанса инициируется сервером. Однако если клиент хочет возобновить предварительно остановленный сеанс, он может включить предварительно определенный ID сеанса в этом поле. Протокол определяет для ID сеанса максимум 32 байта.
- Длина набора шифров. Это 2-байтовое поле определяет длину предложенного клиентом списка набора шифров (следующее поле).
- Список набора шифров. Это поле переменной длины дает список набора шифров, поддерживаемых клиентом. Поле перечисляет набор шифров от наиболее предпочтительных к наименее предпочтительным. Каждый набор шифров кодируется как двухбайтовое число.
- Длина методов сжатия. Это 1-байтовое поле определяет длину списка предложенных клиентом методов сжатия (следующее поле).
- Список методов сжатия. Это поле переменной длины дает список методов сжатия, которые поддерживает клиент. Поле перечисляет методы от наиболее предпочтительных к наименее предпочтительным. Каждый метод кодируется как однобайтовое число. Сейчас единственный метод - метод NULL ("нет сжатия"). В этом случае значение длины методов сжатия - 1, и список метода сжатия имеет только один элемент со значением 0.
Сообщение ServerHello
Cообщение ServerHello - ответ сервера на сообщение ClientHello. Формат подобен сообщению ClientHello, но с меньшим количеством полей. рис. 7.29 показывает формат сообщения.
Поле версии - то же самое, что и в сообщении ClientHello. Поле случайного числа сервера определяет значение, выбранное сервером. Длина ID сеанса и поле ID сеанса - те же самые, что и в сообщении ClientHello. Однако ID сеанса - обычно пробел (и длина обычно устанавливается на 0), если сервер не возобновляет старый сеанс. Другими словами, если сервер позволяет возобновление сеанса, он вставляет соответствующее значение в поле ID сеанса, которое используется клиентом (в сообщении ClientHello), когда клиент желает повторно открыть старый сеанс.
Поле выбранного набора шифров определяет единственный набор шифров, который выбран сервером из списка, посланного клиентом. Поле методов сжатия определяет выбранный сервером метод из списка, посланного клиентом.
Сообщение Certificate
Сообщение Certificate может быть передано клиентом или сервером, чтобы передать список сертификатов открытого ключа. рис. 7.30 показывает формат.
Значение поля "тип" - 11. Текстовый блок сообщения включает следующие поля.
- Длина цепочки сертификатов. Это трехбайтовое поле показывает длину цепочки сертификатов. Это поле избыточно, потому что его значение - всегда на 3 меньше, чем значение поля длины.
-
Цепочка сертификатов. Это поле переменной длины содержит цепочку сертификатов открытого ключа, который использует клиент или сервер. Для каждого сертификата есть два дополнительных поля:
- трехбайтовое поле длины;
- сам сертификат - поле переменного размера.
Сообщение ServerKeyExchange
ServerKeyExchange-сообщение передают от сервера к клиенту. рис. 7.31 показывает общий формат.
Сообщение содержит ключи, сгенерированные сервером. Формат сообщения зависит от набора шифров, выбранного в предыдущем сообщении. Клиент, который получает сообщение, должен интерпретировать его согласно предыдущей информации. Если сервер передал сообщение сертификата, то сообщение содержит подписанный параметр.
Сообщение CertificateRequest
CertificateRequest-сообщение передают от сервера к клиенту. Сообщение просит, чтобы клиент подтвердил серверу свою подлинность, а также подлинность одного из используемых сертификатов и одной из удостоверяющих администраций, названной в сообщении. рис. 7.32 показывает общий формат.
Значение поля типа - 13. Текстовый блок сообщения включает следующие поля:
- Длина типов сертификатов (Len of Cert Types). Это однобайтовое поле показывает длину типов сертификатов.
- Типы сертификатов (Certificate Types). Это поле переменной длины содержит список сертификата открытого ключа, который принят сервером. Каждый тип - один байт.
- Длина сертификатов подтверждения подлинности (Length of CAs). Это двухбайтовое поле показывает длину списка сертификатов, удостоверяющих подлинность (остальная часть пакета).
- Длина сертификата подлинности x. Имя. (Length of CA x. Name). Это двухбайтовое поле определяет длину x-ого сертификата и название администрации. x может принимать значение от 1 до N.
- Сертификат x, подтверждающий подлинность. Имя. ( CA x. Name). Это поле переменной длины определяет название x-ого сертификата администрации. x может принимать значение от 1 до N.