在 SSL 中解析 ServerKeyExchange 消息

Parsing ServerKeyExchange message in SSL

我正在构建一个 Java 解析器来读取和处理 SSL 握手消息。每ietf spec,ServerKeyExchange消息表示如下:

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;

..而 ServerDHParams 定义如下:

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 */

现在,当我使用 wireshark 查看包含服务器密钥交换实例的样本跟踪时,我看到一种不符合上述定义的格式:

如何使用 ietf 定义来解析这样的服务器密钥交换消息?

他们都是正确的。 DHE 和 ECDHE 是不同的算法。 RFC 5246 中的结构定义指定了 DHE 的消息格式,而在 Wireshark 中,您看到的是 ECDHE 密钥交换。对于ECDHE,你可以在RFC 4492中找到它的定义,这与你在WireShark中看到的是一样的:

ec_diffie_hellman: Indicates the ServerKeyExchange message contains an ECDH public key.

    select (KeyExchangeAlgorithm) {
        case ec_diffie_hellman:
            ServerECDHParams    params;
            Signature           signed_params;
    } ServerKeyExchange;

    struct {
        ECParameters    curve_params;
        ECPoint         public;
    } ServerECDHParams;