7. Протокол диалога TLS
Протокол диалога TLS содержит набор из трех суб-протоколов, которые используются, чтобы партнеры могли согласовать используемые параметры безопасности для уровня записи, аутентифицировать себя, и уведомлять друг друга об ошибках.
Протокол диалога ответственен за согласования характеристик сессии, куда входят следующие объекты:
идентификатор сессии | Произвольная последовательность байтов, выбранная сервером для идентификации состояния сессии (активная/ возобновляемая). |
сертификат партнера | X509v3 [X509] сертификат партнера. Этот элемент состояния может быть равен нулю. |
метод сжатия | Алгоритм, используемый для сжатия информации перед шифрованием. |
спецификация шифра | Специфицирует алгоритм массового шифрования (такой как нуль, DES, и т.д.) и алгоритм MAC (такой как MD5 или SHA). Она определяет также криптографические атрибуты, такие как hash_size. (Смотри приложение A.6) |
мастерный секретный код | 48-байтовый секретный код, общий для сервера и клиента. |
'is resumable' | Флаг, указывающий, может ли сессия использоваться для инициализации нового соединения. |
Эти объекты используются затем для определения параметров безопасности для уровня записей при защите прикладных данных. Многие соединения могут реализоваться в рамках той же сессии с помощью процедуры возобновления (resumption) протокола диалога.
7.1. Протокол изменения спецификации шифра
Протокол изменения спецификации шифра предназначен для оповещения об изменении стратегии шифрования. Протокол использует одно сообщение, которое зашифровано и архивировано в рамках текущего состояния соединения. Сообщение состоит из одного байта со значением 1.
struct { enum { change_cipher_spec(1), (255) } type;} ChangeCipherSpec;
Сообщение изменения спецификации шифра посылается как клиентом, так и сервером, для того чтобы уведомить партнера о том, что последующие записи будут защищены с помощью только что согласованных ключей и спецификации CipherSpec. Получение этого сообщения заставляет получателя на уровне записей немедленно скопировать состояние ожидания чтения в текущее состояние чтения.
Сразу после посылки сообщения отправитель должен дать команду уровню записей преобразовать состояние ожидания записи в активное состояние записи. (Смотри раздел 6.1.) Сообщение изменения спецификации шифра посылается во время диалога после согласования набора параметров безопасности, но до посылки проверочного завершающего сообщения (смотри раздел 7.4.9).
7.2. Протокол оповещения
Одним из типов содержимого, поддерживаемого слоем записей TLS, является оповещение. Сообщения оповещения передают описание возникшей ситуации. Оповещения с аварийным уровнем вызывают немедленное прерывание соединения. В этом случае, другие соединения сессии могут оставаться в рабочем состоянии, но идентификатор сессии должен быть объявлен не действительным, блокируя установление новых соединений. Подобно другим сообщениям, оповещения шифруются и сжимаются, как это специфицировано состоянием текущего соединения.
enum { warning(1), fatal(2), (255) } AlertLevel;
enum { close_notify(0),
unexpected_message(10), | |
bad_record_mac(20), | |
decryption_failed(21), | |
record_overflow(22), | |
decompression_failure(30), | |
handshake_failure(40), | |
bad_certificate(42), | |
unsupported_certificate(43), | |
certificate_revoked(44), | |
certificate_expired(45), | |
certificate_unknown(46), | |
illegal_parameter(47), | |
unknown_ca(48), | |
access_denied(49), | |
decode_error(50), | |
decrypt_error(51), | |
export_restriction(60), | |
protocol_version(70), | |
insufficient_security(71), | |
internal_error(80), | |
user_canceled(90), | |
no_renegotiation(100), |
close_notify | Это сообщение обращает внимание получателя, что отправитель не будет посылать более каких-либо данных через это соединение. Сессия становится не возобновляемой (unresumable), если любое соединение разорвано без соответствующих сообщений close_notify с уровнем равным предупреждению. |
unexpected_message | Получено не предусмотренное сообщение. Это оповещение является всегда фатальным и не должно встречаться при обменах между корректными реализациями. |
bad_record_mac | Это оповещение присылается, если получена запись с неверным MAC. Это сообщение всегда вызывает фатальную ошибку. |
decryption_failed | TLSCiphertext дешифрован не верно: либо текст не имел длину четную и кратную размеру блока или их значения (заполнители) при проверке оказались некорректными. Это сообщение всегда вызывает фатальную ошибку. |
record_overflow | Получена запись TLSCiphertext, которая имеет длину больше 214+2048 байт, запись дешифрована TLSCompressed в запись с более чем 214+1024 байтов. Это сообщение всегда вызывает фатальную ошибку. |
decompression_failure | Функция декомпрессии получила неприемлемые данные (напр., данные, которые после восстановления будут иметь слишком большой объем). Это сообщение вызывает фатальную ошибку. |
handshake_failure | Получение сообщения оповещения handshake_failure указывает, что отправитель не мог согласовать приемлемый набор параметров безопасности из числа предлагаемых опций. Это фатальная ошибка. |
bad_certificate | Сертификат был поврежден, содержал подписи, которые не прошли проверку и т.д.. |
unsupported_certificate | Сертификат имел не поддерживаемый тип. |
certificate_revoked | Сертификат был отозван его подписантом. |
certificate_expired | Сертификат имеет исчерпанный срок годности или не пригоден по другой причине. |
certificate_unknown | Некоторая другая, не специфицированная причина при обработке сертификата, делающая его неприемлемым. |
illegal_parameter | Поле при диалоге оказалось вне диапазона допустимых значений или не согласуется с другими полями. Это фатальная ошибка.. |
unknown_ca | Получена корректная сертификатная последовательность или ее часть, но сертификат не был воспринят из-за того, что CA-сертификат не может быть обнаружен или не согласуется с известным проверенным CA. Это сообщение всегда вызывает фатальную ошибку. |
access_denied | Получен правильный сертификат, но при проверке доступа отправитель решил не продолжать согласование. Это сообщение всегда вызывает фатальную ошибку. |
decode_error | Сообщение не может быть дешифровано из-за того, что некоторое поле выходит за пределы допустимого или сообщение имеет не верный размер. Это сообщение всегда вызывает фатальную ошибку. |
decrypt_error | Диалог криптографической операции не прошел, это может включать неудачу проверки подписи, обмена ключами или контроль завершающего сообщения. |
export_restriction | Согласование параметров вошло в противоречие с экспортными регламентациями. Например: попытка передать 1024 битов ephemeral RSA-ключа для метода диалога RSA_EXPORT. Это сообщение всегда вызывает фатальную ошибку. |
protocol_version | Протокольная версия клиента распознана, но не поддерживается. (Например: старые версии протокола могут отвергаться по соображениям безопасности). Это сообщение всегда вызывает фатальную ошибку. |
insufficient_security | Возвращается вместо handshake_failure, когда согласование не прошло в частности из-за того, что сервер требует более секретного шифра, чем может поддержать клиент. Это сообщение всегда вызывает фатальную ошибку. |
internal_error | Внутренняя ошибка, не связанная с партнером, или требования протокола не допускают продолжения процедуры (например, ошибка при выделении памяти). Это сообщение всегда вызывает фатальную ошибку. |
user_canceled | Этот диалог аннулирован по какой-то причине, не связанной с протокольной ошибкой. Если пользователь аннулирует операцию после завершения диалога, закрытие соединения путем посылки close_notify является более приемлемым. За этим оповещением должно следовать close_notify. Это сообщения является предупреждением. |
no_renegotiation | Посылается клиентом в ответ на запрос hello или сервером - в ответ на hello клиента после стартового диалога. Любое из этих сообщений должно, в норме, вызывать повторное согласование параметров. Когда это не приемлемо, получатель должен реагировать посылкой этого уведомления (alert). В этой точке отправитель исходного запроса может решить, следует ли сохранять соединение. Случаем, когда это приемлемо, может оказаться ситуация, когда сервер запускает процесс, чтобы удовлетворить запросу. Процесс может получить параметры безопасности (длину ключа, аутентификацию и т.д.) при запуске, и может быть, трудно сообщить об изменении этих параметров в этой точке процесса. Это сообщение всегда является предупреждением. |
Клиент | Сервер |
ClientHello --------> | |
ServerHello | |
Certificate* | |
ServerKeyExchange* | |
CertificateRequest* | |
Finished --------> | |
[ChangeCipherSpec] | |
Прикладные данные | Прикладные данные |