как получить трассировки и журналы библиотеки openssl

#openssl

#openssl

Вопрос:

Я использую openssl версии 1.02 k в качестве библиотеки в своем приложении (которое является программой на языке Си). Теперь, как включить/получить все внутренние трассировки и журналы, присутствующие в библиотеке openssl, во время запуска моего приложения?

Ответ №1:

Опция-debug обеспечивает вывод отладки для различных событий, которые жестко закодированы в s_client. Я думаю, что, вероятно, вас больше всего интересует бит, который сбрасывает данные, считанные и записанные из сокета на каждом этапе.

Для этого вы можете использовать следующее:

BIO_set_callback(sbio, обратный вызов); BIO_set_callback_arg(sbio, (символ *)outbio); Где sbio-это БИОГРАФИЯ вашего сокета, а outbio-это БИОГРАФИЯ того, куда вы хотите отправить отладочный вывод. «обратный вызов» — это обратный вызов, который фактически сбрасывает выходные данные. Тот, который использует s_client, выглядит так:

длинный bio_dump_callback(BIO *bio, int cmd, const char *argp, int argi, длинный argl, длинный 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 =gt; %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 =gt; %ld (0x%lX))n",  (void *)bio, (void *)argp, (unsigned long)argi, ret, ret);  BIO_dump(out, argp, (int)ret); } return (ret);  

} Другой альтернативой является использование функции SSL_trace (), которая предоставляет вам более понятную для человека информацию о рукопожатии. Чтобы использовать это, вы должны скомпилировать OpenSSL с опцией enable-ssl-trace. Тогда ты позвонишь:

SSL_set_msg_callback(con, SSL_trace); SSL_set_msg_callback_arg(con, outbio); Где con-это SSL-соединение, а outbio-это место, куда вы хотите отправить вывод отладки. SSL_trace-это встроенный обратный вызов, который можно использовать без дополнительной работы.