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 调用。注意:此 必须 发生在与原始调用相同的线程上。您的回调将从之前暂停的点恢复。
证书验证通常需要异步操作,例如: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 调用。注意:此 必须 发生在与原始调用相同的线程上。您的回调将从之前暂停的点恢复。