有没有办法在使用库API时接收相同的调试输出,就像使用" s_client -debug"? (我正在尝试调试握手问题,在每个系统上安装命令行工具都不实际)
答案 0 :(得分:6)
-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是一个内置的回调函数,可以在没有进一步工作的情况下使用。