You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 15:15:05