首页 文章

如何在openssl中管理错误队列(SSL_get_error和ERR_get_error)

提问于
浏览
14

在OpenSSl中,大多数SSL_ *调用的手册页通过返回值<= 0来指示错误,并建议调用SSL_get_error()来获取扩展错误 .

但是在这些调用的手册页以及其他OpenSSL库调用中,有一些模糊的引用在OpenSSL中使用"error queue" - SSL_get_error的手册页就是这种情况:

The current thread's error queue must be empty before the TLS/SSL I/O
   operation is attempted, or  SSL_get_error() will not work reliably.

在同一个手册页中,SSL_ERROR_SSL的描述说明了这一点:

SSL_ERROR_SSL
       A failure in the SSL library occurred, usually a protocol error.
       The OpenSSL error queue contains more information on the error.

这意味着错误队列中有一些值得阅读的东西 . 无法读取它会使后续调用SSL_get_error变得不可靠 . 据推测,对make的调用是ERR_get_error .

我打算在我的代码中使用非阻塞套接字 . 因此,重要的是我可靠地发现错误条件是SSL_ERROR_WANT_READ还是SSL_ERROR_WANT_WRITE,这样我就可以将套接字置于正确的轮询模式 .

所以我的问题是这样的:

  • SSL_get_error()是否隐式为我调用ERR_get_error()?或者我需要同时使用两者吗?

  • 我应该在每次OpenSSL库调用之前调用ERR_clear_error吗?

  • OpenSSL库调用完成后,队列中是否可能出现多个错误?因此,是否存在队列中的第一个错误比上一个错误更相关的情况?

1 回答

  • 5
    • SSL_get_error不调用ERR_get_error . 因此,如果您只调用SSL_get_error,则错误将保留在队列中 .

    • 您应该在任何SSL调用(SSL_read,SSL_write等)之前调用ERR_clear_error,然后是SSL_get_error,否则您可能正在读取先前在当前线程中发生的旧错误 .

相关问题