跳轉到內容

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:解釋從錯誤佇列中提取單個錯誤程式碼和解釋它們的更細粒度的方法

華夏公益教科書