簡體   English   中英

如何破譯 boost asio ssl 錯誤代碼?

[英]How to decipher a boost asio ssl error code?

我在 boost asio ssl 實現中偶爾出現通信故障,boost 返回的超級有用的錯誤消息是“asio.ssl:336458004”

我懷疑數字是某種由 SSL 標志組成的聚合結構,我說這是因為 linux 錯誤代碼、boost asio 錯誤代碼和 ssl 錯誤代碼沒有任何對“336458004”的引用,所以大概它必須動態構建。

任何人都可以提供一些有關我應該如何破譯此錯誤代碼的見解嗎?謝謝。

他們使用來自 crypto/err/err.h 的 ERR_PACK

這將允許將錯誤轉換為字符串

#include <crypto/err/err.h>

std::string err = error.message();
if (error.category() == boost::asio::error::get_ssl_category()) {
    err = std::string(" (")
            +boost::lexical_cast<std::string>(ERR_GET_LIB(error.value()))+","
            +boost::lexical_cast<std::string>(ERR_GET_FUNC(error.value()))+","
            +boost::lexical_cast<std::string>(ERR_GET_REASON(error.value()))+") "
    ;
    //ERR_PACK /* crypto/err/err.h */
    char buf[128];
    ::ERR_error_string_n(error.value(), buf, sizeof(buf));
    err += buf;
}

可能不包含在 boost 中,因此在使用純套接字時 asio 不需要鏈接到 ssl

通過在調試中構建 openssl 並在 OpenSSL 錯誤報告函數ERR_put_error上放置斷點,我最終對這個問題有了一些了解。

調用堆棧顯示問題源自 SSL_read,這是由於握手函數尚未初始化造成的。 ERR_put_error函數使用的實際錯誤號是 276,boost 如何設法將其分解為 336458004,這超出了我的理解。 該錯誤本身是由一個全局標志引起的,當我通過代理通過隧道連接到遠程 HTTPS 服務器時,我使用該標志來切換 SSL 功能。

希望這可以幫助某人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM