!!! Overview [{$pagename}] describes a Step within the [TLS Handshake] process. %%information [{$pagename}] has been removed in [TLS 1.3] %% In [TLS 1.0], The server sends [ServerKeyExchange] message is sent after the server [Certificate] message if it does not contain enough information for the client to exchange the [Premaster Secret], or after the server hello if anonymous [Key-Exchange] is in use. More specifically it is used for [anonymous] [Diffie-Hellman], [Diffie-Hellman Ephemeral] and Ephemeral RSA [Key-Exchange] methods. The [{$pagename}] message will be sent immediately after the [ServerCertificate] message or the [ServerHello] message if this is an anonymous negotiation. The [{$pagename}] message is sent by the server only when the [ServerCertificate] message (if sent) does not contain enough data to allow the [user-agent] to exchange a premaster secret. This is true for the following key exchange methods: * RSA_EXPORT (if the public key in the server certificate is longer than 512 bits) * DHE_DSS * DHE_DSS_EXPORT * DHE_RSA * DHE_RSA_EXPORT * DH_anon It is not legal to send the server key exchange message for the following key exchange methods: * RSA * [RSA_EXPORT] (when the public key in the server certificate is less than or equal to 512 bits in length) * DH_DSS * DH_RSA The [{$pagename}] message conveys cryptographic information to allow the [user-agent] to communicate the [premaster Secret] with which the client can complete a [ClientKeyExchange] with the result containing the [premaster Secret]. As additional [Cipher Suites] are defined for TLS which include new [key-Exchange] algorithms, the [{$pagename}] message will be sent if and only if the certificate type associated with the key exchange algorithm does not provide enough information for the client to exchange a [premaster Secret]. The Structure of [{$pagename}] message: %%prettify {{{ enum { rsa, diffie_hellman } KeyExchangeAlgorithm; struct { opaque rsa_modulus<1..2^16-1>; opaque rsa_exponent<1..2^16-1>; } ServerRSAParams; 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 */ struct { select (KeyExchangeAlgorithm) { case diffie_hellman: ServerDHParams params; Signature signed_params; case rsa: ServerRSAParams params; Signature signed_params; }; } ServerKeyExchange; 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; } }}} /% Where: * rsa_modulus - The modulus of the server's temporary RSA key. * rsa_exponent - The public exponent of the server's temporary RSA key. * dh_p - The prime modulus used for the Diffie-Hellman operation. * dh_g - The generator used for the Diffie-Hellman operation. * dh_Ys - The server's Diffie-Hellman public value (g^X mod p). * params - The server's key exchange parameters. * signed_params - For non-anonymous key exchanges, a hash of the corresponding params value, with the signature appropriate to that hash applied. * md5_hash - MD5(ClientHello.random + ServerHello.random + ServerParams); * sha_hash - SHA(ClientHello.random + ServerHello.random + ServerParams); !! More Information There might be more information for this subject on one of the following: [{ReferringPagesPlugin before='*' after='\n' }]