Сообщение SERVER - HELLO
char MSG-SERVER-HELLO
char SESSION-ID-HIT
char
CERTIFICATE-TYPE
char SERVER-VERSION-MSB
char
SERVER-VERSION-LSB
char CERTIFICATE-LENGTH-MSB
char
CERTIFICATE-LENGTH-LSB
char CIPHER-SPECS-LENGTH-MSB
char
CIPHER-SPECS-LENGTH-LSB
char CONNECTION-ID-LENGTH-MSB
char
CONNECTION-ID-LENGTH-LSB
char
CERTIFICATE-DATA[MSB<<8|LSB]
char
CIPHER-SPECS-DATA[MSB<<8|LSB]
char
CONNECTION-ID-DATA[MSB<<8|LSB]
Сервер посылает это сообщение после получения CLIENT-HELLO. Сервер возвращает флаг SESSION-ID-HIT, указывающий, известен ли серверу полученный идентификатор сессии (т.e. хранится ли он в кэше сервера). Флаг SESSION-ID-HIT будет не равен нулю, если клиент посылает серверу идентификатор сессии (в сообщении CLIENT-HELLO с SESSION-ID-LENGTH != 0), а сервер обнаружит этот идентификатор в своем кэше. Если флаг SESSION-ID-HIT не равен нулю, то поля CERTIFICATE-TYPE, CERTIFICATE-LENGTH и CIPHER-SPECS-LENGTH будут содержать код нуль.
Значение CERTIFICATE-TYPE, если оно не равно нулю, должно содержать одну из перечисленных выше величин (см. информацию о сообщении CLIENT-CERTIFICATE).
Когда флаг SESSION-ID-HIT равен нулю, сервер укладывает свой сертификат, спецификацию шифров и идентификатор соединения и посылает их клиенту. Используя эту информацию, клиент может сформировать ключ сессии и послать его серверу в сообщении CLIENT-MASTER-KEY.
Когда флаг SESSION-ID-HIT не равен нулю, как сервер так и клиент вычисляют новую пару ключей сессии, базируясь на мастерном ключе MASTER-KEY, который они получили при создании идентификатора SESSION-ID. SERVER-READ-KEY и SERVER-WRITE-KEY получаются из исходных ключей MASTER-KEY тем же способом, что CLIENT-READ-KEY и CLIENT-WRITE-KEY:
SERVER-READ-KEY = CLIENT-WRITE-KEY
SERVER-WRITE-KEY =
CLIENT-READ-KEY
Заметим, что когда ключи получены и установлен флаг SESSION-ID-HIT, а сервер обнаружил идентификатор сессии клиента в своем кэше, тогда данные KEY-ARG-DATA используются с момента, когда определен идентификатор SESSION-ID. Это делается, потому что клиент не посылает новых данных KEY-ARG-DATA (напомним, что данные KEY-ARG-DATA посланы в сообщении CLIENT-MASTER-KEY).
CONNECTION-ID-DATA представляет собой строку случайных байт, используемых сервером и клиентом в разных местах протокола. Сообщение CLIENT-FINISHED содержит зашифрованную версию CONNECTION-ID-DATA. Длина CONNECTION-ID должна лежать между 16 и 32 байтами, включительно.
CIPHER-SPECS-DATA определяет тип шифра и длину ключа (в битах), которые поддерживает принимающая сторона. Каждая спецификация SESSION-CIPHER-SPEC имеет длину 3 байта и выглядит как:
char CIPHER-KIND-0
char CIPHER-KIND-1
char
CIPHER-KIND-2
Где CIPHER-KIND равен одному из:
Этот список не является исчерпывающим и может быть расширен в будущем. Конфигурации этих средств безопасности стандартизованы (см. табл.4).
Табл.4. Описание и уровень безопасности шифрпреобразований
Набор |
Уровень безопасности |
Описание |
DES-CBC3-MD5 |
Очень высокий |
Тройной DES в режиме CBC, хэш MD5, 168-битный ключ сессии |
DES-CBC3-SHA |
Очень высокий |
Тройной DES в режиме CBC, хэш SHA, 168-битный ключ сессии |
RC4-MD5 |
Высокий |
RC4, хэш MD5, 128-битный ключ |
RC4-SHA |
Высокий |
RC4, хэш SHA, 128-битный ключ |
RC2-CBC-MD5 |
Высокий |
RC2 в режиме CBC, хэш MD5, 128-битный ключ |
DES-CBC-MD5 |
Средний |
DES в режиме CBC, хэш MD5, 56-битный ключ |
DES-CBC-SHA |
Средний |
DES в режиме CBC, хэш SHA, 56-битный ключ |
EXP-DES-CBC-SHA |
Низкий |
DES в режиме CBC, хэш SHA, 40-битный ключ |
EXP-RC4-MD5 |
Низкий |
Экспортное качество RC4, хэш MD5, 40-битный ключ |
EXP-RC2-CBC-MD5 |
Низкий |
Экспортное качество RC2, хэш MD5, 40-битный ключ |
NULL-MD5 |
- |
Без шифрования, хэш MD5, только аутентификация |
NULL-SHA |
- |
Без шифрования, хэш SHA, только аутентификация |
Шифр SSL_CK_RC4_128_EXPORT40_WITH_MD5 имеет тип RC4, где некоторые ключи сессии посылаются открыто, а остальные в зашифрованном виде. MD5 используется в качестве хэш-функции для получения MAC и ключей сессии. Этот тип шифра предлагается для поддержки "экспортных" версий (т.e. версий протокола, которые могут быть применены за пределами Соединенных Штатов) клиента или сервера.
Экспортные реализации протокола диалога SSL будут иметь длины секретных ключей не более 40 бит. Для не экспортных реализаций длины ключей могут быть больше (рекомендуется, по крайней мере, 128 бит). Клиенты и серверы могут иметь не перекрывающийся набор поточных шифров. Но это означает, что они не могут общаться.
Версия 2 протокола диалога SSL определяет, что SSL_CK_RC4_128_WITH_MD5 должен иметь длину ключа 128 бит. SSL_CK_RC4_128_EXPORT40_WITH_MD5 также имеет длину ключа 128 бит. Однако только 40 бит являются секретными (другие 88 пересылаются от клиента к серверу открыто).
Сообщение SERVER-HELLO посылается, после того как сервер получит сообщение CLIENT-HELLO, и до того как сервер пошлет SERVER-VERIFY.
Сообщение SERVER - VERIFY
char MSG-SERVER-VERIFY
char CHALLENGE-DATA[N-1]
Сервер посылает это сообщение после пары ключей сессии (SERVER-READ-KEY и SERVER-WRITE-KEY), согласованных посредством идентификатора сессии или явно через спецификацию сообщения CLIENT-MASTER-KEY. Сообщение содержит зашифрованную копию данных CHALLENGE-DATA, посланных клиентом в сообщении CLIENT-HELLO.
"N" равен числу байт в сообщении, которое было послано, таким образом, "N-1" соответствует числу байт в CHALLENGE-DATA за вычетом байта заголовка.
Это сообщение используется для верификации сервера следующим образом. Настоящий сервер имеет секретный ключ, который соответствует общедоступному ключу, содержащемуся в его сертификате, переданном в сообщении SERVER-HELLO. Таким образом, настоящий сервер сможет извлечь и реконструировать пару ключей сессии (SERVER-READ-KEY и SERVER-WRITE-KEY). Наконец, только сервер, который выполнил корректно извлечение и дешифрование может правильно зашифровать CHALLENGE-DATA. Это, по существу, "доказывает", что сервер имеет секретный ключ, который образует пару с открытым ключом из сертификата сервера.
Данные CHALLENGE-DATA должны иметь в точности ту же длину, что и в сообщении клиента CLIENT-HELLO. Их значение должно в точности согласовываться с посланным клиентом открыто в сообщении CLIENT-HELLO. Клиент должен дешифровать это сообщение и сравнить полученный результат с тем, что было послано, и только в случае успешного сравнения сервер считается достойным доверия. Если длины не совпадают или не согласуются значения, клиент соединение разрывает.
Это сообщение должно быть послано сервером клиенту либо после обнаружения идентификатора сессии (при этом посылается отклик SERVER-HELLO с флагом SESSION-ID-HIT не равным нулю) или когда сервер получает сообщение CLIENT-MASTER-KEY. Это сообщение должно быть послано до любого сообщения фазы 2 или до сообщения SEVER-FINISHED.
Сообщение SERVER - FINISHED
char MSG-SERVER-FINISHED
char
SESSION-ID-DATA[N-1]
Сервер посылает это сообщение, когда он удовлетворен результатом диалога с клиентом по поводу безопасности и готов продолжить передачу/прием протокольных данных верхнего уровня. Кэши идентификаторов сессии должны содержать копию MASTER-KEY, посланного в сообщении CLIENT-MASTER-KEY, в качестве мастерного ключа, предназначенного для генерации всех последующих ключей сессии.
Здесь "N" имеет то же значение, что и в определениях, представленных выше. Это сообщение должно посылаться после сообщения SERVER-VERIFY.
Сообщение REQUEST - CERTIFICATE
char MSG-REQUEST-CERTIFICATE
char
AUTHENTICATION-TYPE
char CERTIFICATE-CHALLENGE-DATA[N-2]
Сервер может выдать этот запрос в любое время диалога второй фазы, требуя присылки сертификата клиента. Клиент немедленно откликается посылкой сообщения CLIENT-CERTIFICATE, если он имеет сертификат, в противном случае присылается уведомление об ошибке с кодом NO-CERTIFICATE-ERROR. CERTIFICATE-CHALLENGE-DATA представляет собой короткую строку байтов (с длиной ³ 16 байт и £ 32 байтам), которую клиент использует для отклика на этот запрос.
Значение AUTHENTICATION-TYPE используется, чтобы выбрать конкретные средства для аутентификации клиента.
Тип SSL_AT_MD5_WITH_RSA_ENCRYPTION требует, чтобы клиент сформировал MD5-дайджест сообщения, используя информацию, как это описано выше в разделе о сообщении CLIENT-CERTIFICATE. Раз дайджест сформирован, клиент шифрует его, используя свой секретный ключ. Сервер аутентифицирует клиента, когда получает сообщение CLIENT-CERTIFICATE.
Это сообщение может быть послано после сообщения SERVER-VERIFY и до сообщения SERVER-FINISHED.