【问题标题】:OpenSSL 1.1.1d - Async use of SSL_CTX_set_cert_verify_callback?OpenSSL 1.1.1d - SSL_CTX_set_cert_verify_callback 的异步使用?
【发布时间】:2020-01-20 07:10:09
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ ssl openssl certificate ssl-certificate


    【解决方案1】:

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

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

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

    完成后,您需要确保您的应用程序准备好处理来自任何对SSL_get_error() 的调用的返回值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

    这将使控制权返回您的主应用程序,SSL_get_error() 将返回SSL_ERROR_WANT_ASYNC。您将需要为您的应用程序实现一些机制,以了解异步处理何时完成。如果是,则只需重试先前暂停的 SSL I/O 调用。注意:这个必须发生在最初调用的同一个线程上。然后,您的回调将从之前暂停的点恢复。

    【讨论】:

    • 好主意,如果确实可能,我会尝试并更新。但我事先有两个问题:1)如何从证书验证回调中调用 ASYNC_pause_job() 方法?无论如何,它都希望得到答案。或者您可能建议在调用回调之前从不同的上下文调用 ASYNC_pause_job()? 2) SSL_get_error() 到底有什么重要性?
    • ASYNC API 通过为异步操作的代码创建一个完全独立的堆栈来工作。当您调用 ASYNC_pause_job() 时,您的回调的执行实际上会在其执行时暂停,并保存堆栈的状态。控制流立即返回到您的应用程序。当您重新调用 SSL I/O 调用时,您的回调将准确地从它停止的地方恢复,其堆栈处于完全相同的状态 - 就好像什么都没发生一样。所以回调只有在它等待的异步操作实际完成时才会返回。
    • SSL_get_error() 是编写 libssl 应用程序的基本函数调用。如果调用 libssl I/O 函数,例如 SSL_read()/SSL_write()/SSL_connect()/SSL_accept() 等,则需要检查操作是否成功。如果调用返回错误代码,那么您必须调用 SSL_get_error() 来确定下一步该做什么。该错误可能是暂时的(例如,当前无法读取数据 - 但您可以稍后再试),也可能是永久性的(例如,某些致命错误,例如底层套接字已关闭)。 SSL_get_error() 告诉您遇到了什么类型的错误。
    • 但据我了解,ASYNC_pause_job() 在工作环境中有效,对吗?这意味着证书验证回调本身应该在 OpenSSL 内部使用 ASYNC_start_job() 执行,默认情况下不会发生。 (除非我手动更改)
    • 如果设置 SSL_MODE_ASYNC 则所有 libssl IO 操作都发生在作业中,因此在回调中调用 ASYNC_pause_job() 应该是完全可以的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 2012-07-29
    相关资源
    最近更新 更多