老青菜

TLS1.2 Server Key Exchange

2019-06-09

在发送Server Certificate证书消息之后,根据Server Hello选择的算法不同,并且证书里没有足够的数据交换premaster secret预主密钥,Server就会发送Server Key Exchange消息,交换协商参数,以便双方生成premaster secret预主密钥。

发送条件

那么哪些情况会发送,哪些情况不会发送呢? rfc5246 中有以下规定:
. DHE_DSS、DHE_RSA、DH_anon 算法会发送此消息
. RSA、DH_DSS、DH_RSA 算法不会发送此消息

并提供了大致的代码实现:

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 dh_anon:
              ServerDHParams params;
          case dhe_dss:
          case dhe_rsa:
              ServerDHParams params;
              digitally-signed struct {
                  opaque client_random[32];
                  opaque server_random[32];
                  ServerDHParams params;
              } signed_params;
          case rsa:
          case dh_dss:
          case dh_rsa:
              struct {} ;
             /* message is omitted for rsa, dh_dss, and dh_rsa */
          /* may be extended, e.g., for ECDH -- see [TLSECC] */
      };
  } ServerKeyExchange;

从上面的代码看到,有些密钥协商算法会发送,有些则不会,本质上是算法性质和功能的区别,详细的算法比较可以看这里premaster secret预主密钥

消息格式

了解了几种协商算法的区别之后,我们再看一下Server Key Exchange消息格式。

EC Diffie-Hellman Server Params

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

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

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

Name Cure

曲线名称,secp256r1。

Pubkey

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

参考链接

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

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

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

扫描二维码,分享此文章