SSL / TLS原始字节转储

时间:2017-05-09 19:18:59

标签: linux ssl openssl

有谁知道如何轻松获取原始字节并输出相关的OpenSSL SSL / TLS协议信息?例如,如果我只是在.bin文件中有与服务器Hello消息相关联的字节,那么我是否可以使用Linux命令或工具来获取字节并以某种方式显示它以便每个字段都是结构输出,类似于你在wireshark中看到的。下面的图片显示了我希望如何能够使用Linux工具输出您在Wireshark中从包含相关信息的bin文件中看到的类似信息。已知的唯一信息是bin文件包含与TLS协议相关的消息信息。

TLS image

1 个答案:

答案 0 :(得分:1)

有一些警告,一个简单的C程序可以做到这一点。警告:

  • 您需要拥有OpenSSL 1.1.0的自定义编译版本。构建OpenSSL时,需要使用“enable-ssl-trace”选项
  • 运行“config”
  • 您将无法以这种方式处理任何加密记录,因为您无权访问密钥

据说这个程序应该做你想要的。该程序假定您拥有的字节由单个记录组成。如果你有多个记录,那么你将不得不拆分它。

#include <stdio.h>
#include <openssl/ssl.h>
#include <openssl/bio.h>

int main(void)
{
    /* Insert your raw data here. Assumes that you have a single record */
    unsigned char data[] = {
        0x16, 0x03, 0x02, 0x00, 0x04, 0x0e, 0x00, 0x00, 0x00
    };
    BIO *bio_out = BIO_new_fp(stdout, BIO_NOCLOSE | BIO_FP_TEXT);
    SSL_CTX *ctx;
    SSL *ssl;
    int ret = 1;

    if (bio_out == NULL)
        return 1;

    ctx = SSL_CTX_new(TLS_method());
    if (ctx == NULL)
        goto err;
    ssl = SSL_new(ctx);
    if (ssl == NULL)
        goto err;

    SSL_trace(0, 0, SSL3_RT_HEADER, data, SSL3_RT_HEADER_LENGTH, ssl,
             (void *)bio_out);
    SSL_trace(0, TLS1_2_VERSION, SSL3_RT_HANDSHAKE,
              data + SSL3_RT_HEADER_LENGTH,
              sizeof(data) - SSL3_RT_HEADER_LENGTH, ssl,
              (void *)bio_out);

    ret = 0;

 err:
    BIO_free(bio_out);
    SSL_free(ssl);
    SSL_CTX_free(ctx);

    return ret;
}