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

Протокол TLS

Сертификат сервера

Сервер должен посылать сертификат всякий раз, когда согласованный метод обмена ключами не является анонимным. За этим сообщением всегда непосредственно следует сообщение server hello.

Тип сертификата должен соответствовать выбранному алгоритму обмена ключами шифров, обычно это сертификат X.509v3. Он должен содержать ключ, который соответствует методу обмена ключами. Если не специфицировано обратного, алгоритм подписи для сертификата должен быть тем же, что и алгоритм для ключа сертификата. Если не специфицировано обратного, общедоступный ключ может иметь любую длину.

Алгоритм обмена ключами Тип сертификата ключа
RSA Общедоступный ключ RSA ; сертификат должен допускать использование ключа для шифрования.
RSA_EXPORT Общедоступный ключ RSA с длиной больше чем 512 бит, который может быть использован для подписи, или ключ длиной 512 бит или короче, который может быть использован для шифрования или подписи.
DHE_DSS Общедоступный ключ DSS.
DHE_DSS_EXPORT Общедоступный ключ DSS.
DHE_RSA Общедоступный ключ RSA, который может использоваться для подписи.
DHE_RSA_EXPORT Общедоступный ключ RSA, который может использоваться для подписи.
DH_DSS Ключ Diffie-Hellman. Алгоритмом, используемым для подписи сертификата, должен быть DSS.
DH_RSA Ключ Diffie-Hellman. Алгоритмом, используемым для подписи сертификата, должен быть RSA.

Все сертификатные профайлы, ключи и криптографические форматы определены рабочей группой IETF PKIX [PKIX]. Когда присутствует расширение применения ключа, бит digitalSignature должен быть установлен для ключа, выбранного для подписи, как это описано выше, а бит keyEncipherment должен присутствовать, чтобы разрешить шифрование, как это описано выше. Бит keyAgreement должен быть установлен для сертификатов Diffie-Hellman.

Так как параметр CipherSuites, который специфицирует методы нового ключевого обмена, заданы для протокола TLS, они используют формат сертификата и необходимые ключевые данные.

Структура этого сообщения имеет вид:

opaque ASN.1Cert<1..224-1>;
struct { ASN.1Cert certificate_list<0..224-1>; } Certificate;
certificate_list Это последовательность (цепочка) сертификатов X.509v3. Сертификат отправителя должен быть записан в списке первым. Каждый следующий сертификат должен непосредственно сертифицировать предшествующий сертификат. Так как верификация сертификата требует, чтобы корневые ключи распределялись независимо, самоподписывающий сертификат, который специфицирует корневой источник сертификата, может быть опционно удален из цепочки, в предположении, что партнер должен уже иметь его, чтобы проверить его в любом случае.

Тот же тип сообщения и структура будут использоваться для отклика клиента на сообщение запроса сертификата. Заметим, что клиент может не посылать сертификата, если он не имеет подходящего, чтобы послать его серверу в ответ на его аутентификационный запрос.

Сообщение ключевого обмена сервера

Сообщение ключевого обмена сервера посылается сервером только, когда сообщение сертификата сервера (если послано) не содержит достаточно данных, чтобы позволить клиенту осуществлять обмен предмастерными секретными кодами (premaster secret). Это верно для следующих методов обмена ключами:

  • RSA_EXPORT (если открытый ключ в сертификате длиннее, чем 512 бит)
  • DHE_DSS
  • DHE_DSS_EXPORT
  • DHE_RSA
  • DHE_RSA_EXPORT
  • DH_anon

Некорректно посылать сообщение ключевого обмена сервера для следующих методов пересылки ключей:

  • RSA
  • RSA_EXPORT (когда открытый ключ в сертификате сервера короче или равен 512 бит)
  • DH_DSS
  • DH_RSA

Это сообщение передает криптографическую информацию, чтобы позволить клиенту оперировать с предмастерным секретным кодом: либо общедоступный ключ RSA, чтобы зашифровать предмастерный секретный код, либо общедоступный ключ Diffie-Hellman, с помощью которого клиент может завершить обмен ключами.

В качестве дополнительных определены наборы CipherSuites, которые включают в себя новые алгоритмы обмена ключами. Сервер пошлет сообщение обмена ключами тогда и только тогда, когда тип сертификата, ассоциированный с алгоритмов обмена ключами, не предоставил достаточно информации клиенту, чтобы осуществить пересылку предмастерного секретного кода.

Согласно экспортному закону США, модули RSA больше 512 бит не могут применяться для ключевого обмена в программах, экспортируемых из США. Более длинные ключи RSA, зашифрованные в сертификатах, могут быть использованы для подписи более коротких ключей RSA в случае метода ключевого обмена RSA_EXPORT.

Структура этого сообщения:

enum { rsa, diffie_hellman } KeyExchangeAlgorithm;
struct { opaque rsa_modulus<1..2^16-1>; opaque rsa_exponent
   <1..2^16-1>;} ServerRSAParams;
rsa_modulus Модуль временного RSA -ключа сервера.
rsa_exponent Общедоступный показатель временного RSA -ключа сервера.
struct { opaque dh_p<1..2^16-1>;
opaque dh_g<1..2^16 1>;
opaque dh_Ys<1..2^16 1>;} ServerDHParams; /* Временные DH параметры */
dh_p Простой модуль, используемый для операции Diffie-Hellman.
dh_g Генератор, используемый для операции Diffie-Hellman.
dh_Ys Общедоступное значение (gX mod p) метода Diffie-Hellman для сервера.
struct { select (KeyExchangeAlgorithm) {
          case diffie_hellman:
          ServerDHParams params;
          Signature signed_params;
          case rsa:
          ServerRSAParams params;
          Signature signed_params; };
          } ServerKeyExchange;
Params Параметры ключевого обмена сервера.
signed_params Для неанонимных ключевых обменов. Хэш соответствующих значений параметров с подписью, согласованной с примененным хэшем.
md5_hash MD5(ClientHello.random + ServerHello.random + ServerParams);
sha_hash SHA(ClientHello.random + ServerHello.random + ServerParams);
enum { anonymous, rsa, dsa } SignatureAlgorithm;
select (SignatureAlgorithm)
         { case anonymous: struct { };
         case rsa:
         digitally-signed struct
         {
         opaque md5_hash[16];
         opaque sha_hash[20];
         };
         case dsa:
         digitally-signed struct {
         opaque sha_hash[20];
         };
         } Signature;

Запрос сертификата

Не анонимный сервер может опционно запросить сертификат от клиента, если это возможно для выбранного шифрового набора. За этим сообщением, если оно послано, непосредственно следует сообщение ключевого обмена сервера ( Server Key Exchange ) (в противном случае, сообщение сертификата сервера).

Структура этого сообщения:

enum { rsa_sign(1), dss_sign(2), rsa_fixed_dh(3), 
   dss_fixed_dh(4), (255)} ClientCertificateType;
opaque DistinguishedName<1..216-1>;
struct { ClientCertificateType certificate_types<1..28-1>;
DistinguishedName certificate_authorities<3..216-1>;
} CertificateRequest;
certificate_types Это поле представляет собой список типов запрошенных сертификатов, расположенных в порядке предпочтения сервера.
certificate_authorities Список имен приемлемых провайдеров сертификатов. Эти имена могут специфицировать уникальное имя корневого или подчиненного CA. Таким образом, это сообщение может быть использовано как для описания известных корней и желательного пространства авторизации.

DistinguishedName получается из [X509]. Считается фатальной ошибкой (оповещение handshake_failure), если анонимный сервер запрашивает идентификацию клиента.

Hello done сервера

Сообщение сервера hello done посылается сервером, чтобы индицировать завершение операций с hello сервера и связанных с ним сообщений. После отправки этого сообщения сервер ждет отклика клиента.

Это сообщение означает, что сервер завершил подготовку ключевого обмена и клиент может приступить к процедуре пересылки ключей.

После получения сообщения сервера hello done клиент должен проверить, что сервер предоставил корректный сертификат, если это требуется, и что параметры, присланные сервером, приемлемы.

Структура этого сообщения: struct { } ServerHelloDone;

Сертификат клиента

Это первое сообщение, которое может послать клиент после получения сообщения от сервера hello done. Это сообщение посылается только в случае запроса присылки сертификата со стороны сервера. Если приемлемого сертификата нет, клиент должен послать пустое сообщение сертификата. Если серверу для продолжения диалога требуется аутентификация клиента, он может откликнуться, послав уведомление о фатальной ошибке.

Сообщение обмена ключами клиента

Это сообщение непосредственно следует за сообщением сертификата клиента (если оно посылается). В противном случае оно будет первым сообщением, посылаемым клиентом после получения сообщения сервера hello done.

Предмастерный секретный код устанавливается с помощью этого сообщения, либо путем прямой его передачи, зашифровав с применением RSA, либо с помощью передачи параметров Diffie-Hellman, которые позволят каждой из сторон согласовать применение одного и того же предмастерного секретного кода. Когда в качестве метода передачи ключей использован DH_RSA или DH_DSS, запрашивается сертификация клиента, и клиент может откликаться посылкой сертификата, который содержит общедоступный ключ Diffie-Hellman, чьи параметры (группа и генератор) соответствуют, специфицированным в сертификате сервера. Это сообщение не содержит никаких других данных.

Структура этого сообщения:

struct { select (KeyExchangeAlgorithm) 
  { case rsa: EncryptedPreMasterSecret;
case diffie_hellman: ClientDiffieHellmanPublic; } exchange_keys;
} ClientKeyExchange;
Наталья Шульга
Наталья Шульга

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

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

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

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

Антон Шавергин
Антон Шавергин
Россия
Степан Крупа
Степан Крупа
Украина, Львів, СЗШ №65, 2012