如果您的目标是从 Wireshark 中的 OpenSSL 应用程序中读取解密的应用程序数据,请注意 RSA 私钥不是您唯一的选择,您还可以将映射传递给(预)主密钥。此功能不仅限于 SSL 客户端,即使在SSLKEYLOGFILE
使用 NSS 的应用程序中也很常见。
有关从 OpenSSL 客户端和服务器应用程序检索预主密钥的方法,请参阅此 Sec.SE 帖子(不需要更改应用程序)。如果你想在你的应用程序中嵌入这样的调试功能,那么你可以通过在握手完成时设置一个回调来更干净地做到这一点。例子:
// converts bytes to hex
void to_hex(unsigned char *dst, unsigned char *src, size_t len) {
unsigned char hex[] = "0123456789abcdef";
unsigned i;
for (i = 0; i < len; i++) {
unsigned char c = src[i];
*dst++ = hex[c >> 4];
*dst++ = hex[c & 0xf];
}
*dst = '\0';
}
static FILE *ssl_keylog;
void info_callback(const SSL *ssl, int where, int ret) {
unsigned char rnd[SSL3_RANDOM_SIZE*2+1];
unsigned char pmk[SSL_MAX_MASTER_KEY_LENGTH*2+1];
// skip in case the session is invalid, or if it is not
// a Handshake Done notification.
if (!ssl || !ssl->session || !ssl->s3 || !(where & SSL_CB_HANDSHAKE_DONE)) {
return;
}
// convert bytes to hex
to_hex(rnd, ssl->s3->client_random, SSL3_RANDOM_SIZE);
to_hex(pmk, ssl->session->master_key, ssl->session->master_key_length);
// write to SSL keylog file
fprintf(keylog_file, "CLIENT_RANDOM %s %s\n", rnd, pmk);
}
static void run(const char *service, const char *key_file,
const char *cert_file) {
SSL_CTX *ssl_ctx;
...
ssl_ctx = create_ssl_ctx(key_file, cert_file);
if (!keylog_file) {
// open key log file if any.
keylog_file = fopen("premaster.txt", "a");
}
// register callback (for SSL objects, use SSL_set_info_callback instead)
SSL_CTX_set_info_callback(ssl_ctx, info_callback);
...
}