Теоретически я думаю, что вы должны быть в состоянии использовать OpenSSL ASYN C API для этого. Обычно это используется асинхронными движками, но я не понимаю, почему это не будет работать и в приложениях.
Во-первых, вам нужно перевести ваш объект SSL в режим ASYN C, используя вызов функции SSL_set_mode()
и указав SSL_MODE_ASYNC
. Вы также можете сделать это на уровне SSL_CTX, используя SSL_CTX_set_mode()
. См .:
https://www.openssl.org/docs/man1.1.1/man3/SSL_set_mode.html
Как только это будет сделано, вам необходимо убедиться, что ваше приложение готово обработать возвращаемое значение SSL_ERROR_WANT_ASYNC
из любого вызова SSL_get_error()
, См .:
https://www.openssl.org/docs/man1.1.1/man3/SSL_get_error.html
Ваше приложение может затем реализовать обратный вызов обычным способом через SSL_CTX_set_cert_verify_callback
. Если необходимо временно приостановить операцию, чтобы дождаться завершения какой-либо асинхронной операции, тогда обратный вызов должен вызвать ASYNC_pause_job()
. См .:
https://www.openssl.org/docs/man1.1.1/man3/ASYNC_pause_job.html
В результате контроль вернется к основному приложению, а SSL_get_error()
вернет SSL_ERROR_WANT_ASYNC
. Вам потребуется реализовать некоторый механизм, чтобы приложение знало, когда асинхронная обработка завершена. Если это так, просто повторите попытку ввода-вывода SSL, которая была ранее приостановлена. Примечание: это должно происходить в том же потоке, из которого был сделан исходный вызов. Ваш обратный вызов возобновится с того места, на котором он был ранее приостановлен.