我想从我的 TLS 客户端和服务器程序创建一个 secret 文件(目前这些只是测试程序: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>
读取随 secret 钥和主 key 的代码片段:
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));
将此(客户端或服务器) secret 文件作为 Pre-Master-Secret 日志文件导入 Wireshark,我能够解密 TLS 1.2 流量,但据我所知,CLIENT_RANDOM 不能用于 TLS 1.3(至少它对我不起作用),但我应该使用即 CLIENT_HANDSHAKE_TRAFFIC_SECRET/SERVER_HANDSHAKE_TRAFFIC_SECRET。
此类 secret 的格式是什么?如何使用 OpenSSL API 获取这些数据,以便能够解密 Wireshark 中的 TLS 1.3 流量?
最佳答案
OpenSSL 有 this可以设置回调函数来获取有关握手期间生成的所有新 key 的更新。在回调中,OpenSSL 发送完整的日志行,因此可以将它们简单地添加到“主 key ”日志文件中。
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>
回调中收到的 key :
SERVER_HANDSHAKE_TRAFFIC_SECRET
CLIENT_HANDSHAKE_TRAFFIC_SECRET
EXPORTER_SECRET
SERVER_TRAFFIC_SECRET_0
CLIENT_TRAFFIC_SECRET_0
关于c++ - 使用 OpenSSL API 准备 secret 文件以解密 Wireshark 中的 TLS 1.3 流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70622681/