检查TLS实施中的错误

时间:2016-09-12 18:17:07

标签: security ssl aes rsa hmac

我正在开发一个小型TLS客户端,它与SMTP一起使用。握手工作正常,直到我的客户端发送加密完成的消息。所以Client Hello,Server Hello,Certificate,Server Hello Done,Client Key Exchange和Change Cipher Spec正在运行。作为chiper套件,我正在使用TLS_RSA_WITH_AES_256_CBC_SHA256。

我的问题是,我在发送完成的消息后收到服务器的“Bad Record MAC”警告。但我不知道在哪里可以开始搜索错误。我已经仔细检查了我的所有功能,并重复了两次RFC。

在我的观点中,以下几点之一会导致“错误记录MAC”警告:

  • 主秘密错了。
  • client_write_MAC_key错误。
  • client_write_encryption_key错误。
  • P_hash功能错误。
  • PRF功能错误。
  • MAC功能错误。
  • AES加密无法正常工作。
  • 完成消息的哈希是错误的。

有谁知道如何才能找到问题。是否有任何工具可以检查主密钥,MAC和密钥计算是否正确?或者是否可以使用Wireshark解密内容?请注意,我没有服务器的私钥。

1 个答案:

答案 0 :(得分:0)

我已经建立了一个OpenSSL的本地测试服务器,正如Steffen Ullrich建议的那样。我已经对Wireshark提供的“调试输出”进行了详细的分析。

我能够解决填充问题。但我仍然收到Bad Record MAC警报。与调试输出一样,MAC不正确(消息ssl_decrypt_record: mac failed)。

有关连接和调试输出的更多信息:

  1. pre-master-secret,master-secret和所有密钥(客户端写入MAC密钥,服务器写入MAC密钥,客户端写入密钥,服务器写入密钥,客户端写入IV,服务器写入IV)都是正确的。我已将我的软件与调试输出中的这些进行了比较。所以在Encrypted Finished Message之前都是正确的。
  2. 服务器/ Wireshark可以成功解密Encrypted Finished Message
  3. 服务器/ Wireshark正确检测到填充。
  4. 服务器/ Wireshark“跳过”IV,仅显示行Finished Message
  5. 中的Plaintext[64]:和MAC

    在我看来,只有两件事可能导致此错误:

    1. MAC计算错误。
    2. 握手消息中的散列(verify_data)错误。
    3. 我的Encrypted Finished Message的全长为80个字节,结构如下:

      struct
      {
          // TLS record
          ContentType type;
          ProtocolVersion version;
          uint16 length;
          // TLS handshake and content (encrypted)
          uint8 IV[16];
          struct
          {
              HandshakeType msg_type;
              uint24 length;
              uint8 verify_data[12];
          } content;
          uint8 MAC[32];
          uint8 padding[15];
          uint8 paddingLength;
      } FinishedMessage;
      

      内容如下所示:

           00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
      0000 16 03 03 00 50 XX XX XX XX XX XX XX XX XX XX XX
      0010 XX XX XX XX XX 14 00 00 0C YY YY YY YY YY YY YY
      0020 YY YY YY YY YY ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ
      0030 ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ
      0040 ZZ ZZ ZZ ZZ ZZ 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F
      0050 0F 0F 0F 0F 0F
      

      其中XX代表随机生成的IV和YY,verify_data和ZZ是消息的MAC,如RFC中所述。

      verify_data包含SHA-256哈希的前12个字节。哈希值由消息Client HelloServer HelloCertificate(来自服务器),Server Hello DoneClient Key Exchange计算得出。对于散列,使用没有记录头(前5个字节)的完整消息。

      MAC由客户端写入MAC密钥和消息计算。作为序列号,使用数字0。用于计算MAC的fragment仅包含msg_typelengthverify_data(请参阅上面的结构content)。

      有谁知道如何找到我的MAC有什么问题?