作者:手机用户2502872795 | 来源:互联网 | 2023-02-01 09:36
使用库API和使用“ s_client -debug”时,是否可以接收相同的调试输出?(我正在尝试调试握手问题,并且在每个系统上都安装命令行工具并不可行)
1> Matt Caswell..:
-debug选项提供对各种事件的调试输出,这些事件被硬编码到s_client中。我认为您可能最感兴趣的是在每个阶段都转储从套接字读取和写入的数据。
为此,您可以使用以下命令:
BIO_set_callback(sbio, callback);
BIO_set_callback_arg(sbio, (char *)outbio);
sbio是您的套接字BIO,outbio是您希望调试输出进入的BIO。“回调”是实际上转储输出的回调。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是一个内置回调,无需进一步工作即可使用。