RFC: 2246
Оригинал: The TLS Protocol Version 1.0
Другие версии: RFC 4346
Категория: Предложенный стандарт
Дата публикации:
Авторы: ,
Перевод: Семенов Юрий Алексеевич

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

Это сообщение будет послано немедленно после сообщения сертификата сервера (или сообщения server hello, если это анонимное согласование параметров).

Сообщение ключевого обмена сервера посылается сервером только когда сообщение сертификата сервера (если послано) не содержит достаточно данных, чтобы позволить клиенту осуществлять обмен предмастерными секретными кодами (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

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

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

Согласно настоящему закону США об экспорте, модули 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
  • The modulus of the server's temporary RSA key.
  • rsa_exponent
  • The public exponent of the server's temporary RSA key.
struct {
    opaque dh_p<1..2^16-1>;
    opaque dh_g<1..2^16-1>;
    opaque dh_Ys<1..2^16-1>;
} ServerDHParams;     /* Ephemeral DH parameters */
  • dh_p
  • Простой модуль, используемый для операции Diffie-Hellman.
  • dh_g
  • Генератор, используемый для операции Diffie-Hellman.
  • dh_Ys
  • Общедоступное значение (g^X 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;
2007 - 2017 © Русские переводы RFC, IETF, ISOC.