Протокол Handshake работает поверх протокола Record и используется для согласования следующих параметров сессии:
идентификатор сессии | - | произвольная последовательность байтов, выработанная сервером для идентификации активной или возобновляемой сессии; |
сертификат стороны | - | сертификат в формате Х.509, формирующийся в соответствии с [2]. Аутентификация опционально может быть односторонней (аутентификация сервера клиентом, сертификат предоставляет только сервер) или взаимной (взаимная аутентификация сервера и клиента, клиент и сервер обмениваются сертификатами); |
идентификатор криптонабора | - | идентификатор, определяющий набор алгоритмов и их параметров, использующихся в рамках данной сессии; |
значение MS (master secret) | - | общее секретное значение длиной 48 байт, которое вырабатывается сторонами с помощью протокола выработки и подтверждения ключа (см. 6.4); |
значение флага возобновления | - | флаг, разрешающий/запрещающий повторные соединения в рамках данной сессии. |
Протокол Handshake начинает свою работу с сообщения ClientHello, которое может быть послано клиентом по его собственной инициативе либо в качестве ответа на сообщение сервера HelloRequest.
Схема обмена сообщениями в протоколе Handshake может быть полной или упрощенной.
Полная схема обмена сообщениями (см. рисунок 3) используется, если клиент в сообщении приветствия ClientHello в качестве идентификатора сессии указал пустую строку либо если сервер не смог найти в кэше сессий параметры сессии, соответствующей данному идентификатору.
Рисунок 3 - Полная схема обмена сообщениями в протоколе Handshake
Примечание 1 - Фигурными скобками отмечены те сообщения, которые являются опциональными.
Примечание 2 - Сообщение ChangeCipherSpec формально относится не к протоколу Handshake, а к протоколу Change Cipher Spec.
Примечание 3 - В соответствии с [1] протокол TLS 1.2 допускает возможность установления анонимного соединения без обмена сертификатами, однако в протоколе, соответствующем криптонаборам, описанным в данных рекомендациях, данная опция использоваться не должна.
Если клиент хочет создать соединение в рамках существующей сессии, то в сообщении приветствия ClientHello он должен указать идентификатор этой сессии. В случае если сервер смог найти в кэше сессий параметры сессии, соответствующей данному идентификатору, процесс обмена сообщениями протокола Handshake соответствует упрощенной схеме (см. рисунок 4).