有没有办法在使用库 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/