使用库时的 openssl 调试信息

标签 openssl

有没有办法在使用库 API 时接收与使用“s_client -debug”时相同的调试输出? (我正在尝试调试握手问题,在每个系统上安装命令行工具是不切实际的)

最佳答案

-debug 选项提供硬编码到 s_client 中的各种事件的调试输出。我想您可能最感兴趣的是在每个阶段转储从套接字读取和写入的数据的位。

为此,您可以使用以下命令:

BIO_set_callback(sbio, callback);
BIO_set_callback_arg(sbio, (char *)outbio);

其中 sbio 是您的套接字 BIO,outbio 是您想要调试输出的 BIO。 “callback”是实际转储输出的回调。 s_client 使用的看起来像这样:

long bio_dump_callback(BIO *bio, int cmd, const char *argp,
                       int argi, long argl, long ret)
{
    BIO *out;

    out = (BIO *)BIO_get_callback_arg(bio);
    if (out == NULL)
        return (ret);

    if (cmd == (BIO_CB_READ | BIO_CB_RETURN)) {
        BIO_printf(out, "read from %p [%p] (%lu bytes => %ld (0x%lX))\n",
                   (void *)bio, (void *)argp, (unsigned long)argi, ret, ret);
        BIO_dump(out, argp, (int)ret);
        return (ret);
    } else if (cmd == (BIO_CB_WRITE | BIO_CB_RETURN)) {
        BIO_printf(out, "write to %p [%p] (%lu bytes => %ld (0x%lX))\n",
                   (void *)bio, (void *)argp, (unsigned long)argi, ret, ret);
        BIO_dump(out, argp, (int)ret);
    }
    return (ret);
}

另一种选择是使用 SSL_trace() 功能,它为您提供更多人类可读的握手信息。要使用它,您必须使用enable-ssl-trace 选项编译OpenSSL。然后你调用:

SSL_set_msg_callback(con, SSL_trace);
SSL_set_msg_callback_arg(con, outbio);

其中 con 是 SSL 连接,outbio 是您想要调试输出的位置。 SSL_trace 是一个内置回调,无需进一步工作即可使用。

关于使用库时的 openssl 调试信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44585974/

相关文章:

c - openssl X509_verify_cert() 是否验证证书中的签名?

c++ - 如何修复 OSX 中“找不到 "fatal error: ' sys/epoll.h”文件?

c - OpenSSL API 以 DER 格式而不是 PEM 读取私钥

openssl - 了解将 .pem 文件转换为 .pfx 的 OpenSSL 步骤

c - 非阻塞 BIO 并在 BIO_do_connect 后挂起

javascript - Jsrsasign。如何验证服务器上的签名?

linux - 内核模块和 SSL

c - 从 EVP_CipherInit_ex 中键入会返回什么值?

python - M2Crypto RSA.sign 与 OpenSSL rsautl -sign

python - 使用带有 python 的 openssl 签署数据