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

时间:2013-08-12 03:22:03

标签: sockets ssl openssl

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

但是在这些调用的手册页以及其他OpenSSL库调用中,有一些模糊的引用在OpenSSL中使用“错误队列” - SSL_get_error的手册页就是这种情况:< / p>

   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变得不可靠。据推测,致电是ERR_get_error

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

所以我的问题是:

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

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

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

1 个答案:

答案 0 :(得分:6)

  • SSL_get_error不会调用ERR_get_error。因此,如果您只是调用SSL_get_error,则错误将保留在队列中。
  • 您应该在任何SSL调用(SSL_read,SSL_write等)之前调用ERR_clear_error,然后是SSL_get_error,否则您可能正在读取先前在当前线程中发生的旧错误。