如何从boost::system::system_error中排查TLS/SSL特定错误
Boost TLS客户端错误码判断方案
Boost ASIO的TLS模块错误码不仅包含在asio/error.hpp和system库中,还有专门的SSL错误定义在<boost/asio/ssl/error.hpp>里。对于你需要区分的四类错误,具体判断方式如下:
1. 密码套件不匹配(Cipher suite mismatch)
直接判断错误码是否等于boost::asio::ssl::error::no_shared_cipher,该错误明确表示客户端与服务器没有共同支持的密码套件。
2. TLS版本不匹配(TLS version mismatch)
- 匹配Boost定义的错误码:
boost::asio::ssl::error::protocol_version - 或通过底层OpenSSL原生错误码判断:对应
SSL_R_WRONG_VERSION_NUMBER(数值为336027808)
3. 证书错误(Incorrect certificate)& 证书过期(Expired certificate)
这类错误统一触发boost::asio::ssl::error::certificate_verify_failed,需进一步解析OpenSSL错误栈区分具体类型:
- 证书过期:对应OpenSSL错误码
X509_V_ERR_CERT_HAS_EXPIRED(数值为10) - 证书未生效:
X509_V_ERR_CERT_NOT_YET_VALID(数值为9) - 其他证书错误(如不被信任、颁发者无效等):对应其他
X509_V_ERR_*系列错误码
示例代码:解析证书错误详情
#include <boost/asio/ssl.hpp> #include <openssl/err.h> #include <openssl/x509_vfy.h> void handle_tls_error(const boost::system::system_error& e) { if (e.code() == boost::asio::ssl::error::certificate_verify_failed) { // 获取OpenSSL错误栈最后一个错误 unsigned long err = ERR_get_error(); if (err == X509_V_ERR_CERT_HAS_EXPIRED) { // 处理证书过期逻辑 } else if (err == X509_V_ERR_CERT_NOT_YET_VALID) { // 处理证书未生效逻辑 } else { // 处理其他证书错误逻辑 } // 清空错误栈 ERR_clear_error(); } else if (e.code() == boost::asio::ssl::error::no_shared_cipher) { // 处理密码套件不匹配逻辑 } else if (e.code() == boost::asio::ssl::error::protocol_version) { // 处理TLS版本不匹配逻辑 } }
注意:使用OpenSSL相关函数需链接OpenSSL库,并确保项目包含对应头文件路径。
内容的提问来源于stack exchange,提问作者Krakadil
相关产品推荐
相关产品推荐

