OpenSSL 1.1.1d - Asyn c использование SSL_CTX_set_cert_verify_callback? - PullRequest
0 голосов
/ 20 января 2020

Проверка сертификата в целом требует асинхронных операций, таких как: выборка OCSP / CRL.

С другой стороны, обратный вызов от SSL_CTX_set_cert_verify_callback ожидает синхронный результат: 1 (успех) / 0 (сбой). ( ссылка ).

Мне кажется странным, что любая проверка этого типа ожидается синхронной.

Существует ли альтернативный API для проверки цепочки сертификатов, который поддерживает асинхронные операции?

1 Ответ

2 голосов
/ 20 января 2020

Теоретически я думаю, что вы должны быть в состоянии использовать 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, которая была ранее приостановлена. Примечание: это должно происходить в том же потоке, из которого был сделан исходный вызов. Ваш обратный вызов возобновится с того места, на котором он был ранее приостановлен.

...