c++ - 使用 OpenSSL API 准备 secret 文件以解密 Wireshark 中的 TLS 1.3 流量

标签 c++ ssl openssl wireshark

我想从我的 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/

相关文章:

c++ - 将值存储在链表的结构中

c++ - 使用 boost :timer and slerp, 四元数进行插值

wcf - 使用SSL时私钥存储在哪里?

c - C中的机器人访问API不起作用,为什么?

cryptography - 从 OpenSSL 命令行生成 EC key 对

php - 使用 PHP 和 openssl 并将其存储在 MySQL 中 - 无法解密数据

c++ - 路径变得太长的解决方法?

c++ - 基于 SDL2 的游戏和 GADBannerView

security - CA 公钥与服务器公钥 : what should I use to establish an HTTPS connection?

mongodb社区版支持ssl