OpenSSL 1.1.1d - SSL_CTX_set_cert_verify_callback 的异步使用?

OpenSSL 1.1.1d - Async use of SSL_CTX_set_cert_verify_callback?

证书验证通常需要异步操作,例如:OCSP/CRL 获取。

另一方面,来自 SSL_CTX_set_cert_verify_callback 的回调需要一个同步结果: 1(成功)/ 0(失败)。 (reference).

我觉得这种类型的任何验证都应该是同步的,这有点奇怪。

是否有支持异步操作的证书链验证替代方案API?

理论上我认为您应该能够使用 OpenSSL ASYNC API 来执行此操作。通常这由具有异步能力的引擎使用,但我不明白为什么它不能在应用程序中工作。

首先,您需要使用函数调用 SSL_set_mode() 并指定 SSL_MODE_ASYNC 将 SSL 对象置于异步模式。您也可以使用 SSL_CTX_set_mode() 在 SSL_CTX 级别执行此操作。参见:

https://www.openssl.org/docs/man1.1.1/man3/SSL_set_mode.html

一旦完成,您需要确保您的应用程序准备好处理来自对 SSL_get_error() 的任何调用的 return 值 SSL_ERROR_WANT_ASYNC。参见:

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

这将对您的主应用程序产生控制 returning 的效果,SSL_get_error() 将 return SSL_ERROR_WANT_ASYNC。您需要为您的应用程序实现某种机制以了解异步处理何时完成。如果是,则只需重试先前暂停的 SSL I/O 调用。注意:此 必须 发生在与原始调用相同的线程上。您的回调将从之前暂停的点恢复。