老青菜

TLS1.2 Client Key Exchange

2019-06-10

如果Client发送了Client Certificate消息,那么紧接着,发送Client Key Exchange消息,除此以外,Client Key Exchange将作为Server Hello Done之后的第一条消息。
通过此消息,可以直接交换premaster secret,或者交换DH的协商参数。

密钥交换算法

Server Key Exchange这一节中,我们详细的介绍了RSA密钥交换算法和DH密钥协商算法,这里就不再重复说明了。
Client Key Exchange消息里,针对不同的算法,消息结构也不一样。

RSA交换算法

客户端生成46位随机数+2位client_version,作为premaster secret,加密后作为消息参数。
而这种情况,Server Key Exchange是不会发送的。因为只需要Client发起交换,Server负责解密就可以了。

#rsa 预主密钥
struct {
      ProtocolVersion client_version;
      opaque random[46];
  } PreMasterSecret;

  client_version
     The latest (newest) version supported by the client.  This is
     used to detect version rollback attacks.

  random
     46 securely-generated random bytes.

  struct {
      public-key-encrypted PreMasterSecret pre_master_secret;
  } EncryptedPreMasterSecret;

DH协商算法

Server Key Exchange一样,Client随机一个大数,作为X1,计算P1 = g^X1 mod p,把P1作为消息参数。然后再结合Server Key Exchange里的P2计算出premaster secret(S = P2^X1 mod p)。

我们来看下该消息的具体结构:

struct {
      select (KeyExchangeAlgorithm) {
          case rsa:
              EncryptedPreMasterSecret;
          case dhe_dss:
          case dhe_rsa:
          case dh_dss:
          case dh_rsa:
          case dh_anon:
              ClientDiffieHellmanPublic;
      } exchange_keys;
  } ClientKeyExchange;

#dh 预主密钥的协商参数
struct {
       select (PublicValueEncoding) {
           case implicit: struct {};
           case explicit: opaque DH_Yc<1..2^16-1>;
       } dh_public;
   } ClientDiffieHellmanPublic;

消息格式

EC Diffie-Hellman Server Params

椭圆曲线协商算法服务端参数,因为在Server Hello里,Server选择的密码套件是

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

也就是指定ECDHE为密钥协商算法,所以这里Client只要传递premaster secret的协商参数,比如说随机一个大数X1,计算P1 = g^X1 mod p,把P1作为协商参数。

Name Cure

曲线名称,secp256r1。

Pubkey

协商参数,对应DH协商算法中大数P1(g^X mod p),双方交换后,可计算出premaster secret预主密钥。

参考链接

DH算法原理
TLS1.2
TLS1.3
HandShake Protocol

Tags: HTTP
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章