【问题标题】:Preparing a secret file using OpenSSL APIs to decrypt TLS 1.3 traffic in Wireshark使用 OpenSSL API 准备秘密文件以解密 Wireshark 中的 TLS 1.3 流量
【发布时间】:2022-01-07 14:28:05
【问题描述】:

我想从我的 TLS 客户端和服务器程序创建一个秘密文件(这些目前只是测试程序:client.exe 和 server.exe,我在其中玩 SSL/TLS),稍后可用于解密 Wireshark 中的流量。

对于 TLS 1.2,我创建了一个具有以下格式的 CLIENT_RANDOM 文件(仅测试单个连接,因此文件中只有 1 行):

CLIENT_RANDOM <32 bytes client random in hex format> <48 bytes master secret in hex format>

代码 sn -p 读取随机数和主密钥:

uint8_t random[SSL3_RANDOM_SIZE];
size_t randomLength = SSL_get_client_random(ssl, random, SSL3_RANDOM_SIZE);
...
uint8_t masterKey[SSL_MAX_MASTER_KEY_LENGTH];
size_t masterKeyLength = SSL_SESSION_get_master_key(SSL_get_session(ssl), masterKey, sizeof(masterKey));

将此(客户端或服务器)机密文件作为 Pre-Master-Secret 日志文件导入 Wireshark,我能够解密 TLS 1.2 流量,但据我所知,CLIENT_RANDOM 不能用于 TLS 1.3(至少它对我不起作用),但我应该在那里使用,即 CLIENT_HANDSHAKE_TRAFFIC_SECRET/SERVER_HANDSHAKE_TRAFFIC_SECRET。

这种秘密的格式是什么?如何使用 OpenSSL API 获取这些数据,以便能够解密 Wireshark 中的 TLS 1.3 流量?

【问题讨论】:

    标签: c++ ssl openssl wireshark


    【解决方案1】:

    OpenSSL 具有this 功能,并且可以设置回调函数以获取有关握手期间生成的所有新密钥的更新。在回调中,OpenSSL 发送完整的日志行,因此可以简单地将它们添加到“主机密”日志文件中。

    void SSL_CTX_set_keylog_callback(SSL_CTX *ctx, SSL_CTX_keylog_cb_func cb);
    

    日志格式如下:

    KEY_NAME <CLIENT_RAND in hex> <KEY/SECRET in hex>
    

    回调中收到的键:

    SERVER_HANDSHAKE_TRAFFIC_SECRET

    CLIENT_HANDSHAKE_TRAFFIC_SECRET

    EXPORTER_SECRET

    SERVER_TRAFFIC_SECRET_0

    CLIENT_TRAFFIC_SECRET_0

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 2019-12-09
      • 2017-09-18
      • 2017-09-23
      • 2018-04-15
      • 1970-01-01
      • 2014-02-07
      • 2014-09-26
      • 2015-10-06
      相关资源
      最近更新 更多