跳转到内容

OpenSSL/错误处理

来自维基教科书,开放的书籍,开放的世界

大多数 OpenSSL 函数在成功时返回 1,在失败时返回其他值。失败结果通常为 0,但一些函数(如 ssl_connect())在错误时也可能返回 -1,因此最安全的方法是将成功与 1 进行比较,而不是将失败与 0 进行比较。

当发生错误时,更详细的信息将存储在“错误队列”(有时也称为“错误堆栈”或“错误状态”)中,该队列可以包含多个错误代码(以记录一系列错误)。错误队列是线程本地化的(尽管它使用 OpenSSL 自行开发的线程本地状态机制实现,而不是使用操作系统的线程本地状态机制)。

对错误队列可以做的最简单的事情是打印整个队列。可以使用 ERR_print_errors_fp 将错误队列打印到 FILE *,或使用ERR_print_errors 将错误队列打印到BIO。这两个函数在打印完错误队列后都会清空它。

以下是如何使用内存 BIO 将错误队列打印到一个 malloc 分配的字符串的示例

char *ossl_err_as_string (void)
{ 
  BIO *bio = BIO_new (BIO_s_mem ());
  ERR_print_errors (bio);
  char *buf = NULL;
  size_t len = BIO_get_mem_data (bio, &buf);
  char *ret = (char *) calloc (1, 1 + len);
  if (ret)
    memcpy (ret, buf, len);
  BIO_free (bio);
  return ret;
}

另一方面,将错误堆栈打印到标准错误与以下操作一样简单

ERR_print_errors_fp (stderr);

TODO:解释从错误队列中提取单个错误代码和解释它们的更细粒度的方法

华夏公益教科书