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

C++ Boost.Asio SSL连接接收数据为密文问题排查

问题结论

Boost.Asio的boost::asio::ssl::stream会自动处理SSL层的加解密逻辑,你收到密文乱码是因为代码里收发业务数据时直接调用了底层原始TCP socket的接口,完全绕过了SSL封装层。

具体错误点

你的asyncRead()和asyncWrite()函数中,都通过socketSSL.next_layer()获取了SSL stream包裹的原始TCP socket,直接调用这个原始socket的async_receive/async_send接口,只会读写网卡收到的未经过SSL处理的原始字节流——这些就是TLS协议传输的加密密文,自然无法解析出明文。

补充说明:你代码里TCP连接阶段、设置socket keepalive/no_delay选项时调用next_layer()是正确的,这些操作属于TCP层配置,本来就需要在SSL握手前针对原始socket执行。

修复方案

将业务数据收发的调用对象从socketSSL.next_layer()换成socketSSL本身,让SSL stream自动完成加解密流程:

  • 修改asyncRead函数:
static void asyncRead()
{
    socketSSL.async_receive(
        boost::asio::buffer(recvBuffer, MAX_BUFFER_RECV),
        boost::bind(
            onReceive,
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred));
}
  • 修改asyncWrite函数:
static void asyncWrite()
{
    boost::json::object root;
    root["id"] = 1;
    root["method"] = "mining.subscribe";
    root["params"] = boost::json::array{ "Test/1.0", "EthereumStratum/1.0.0" };

    std::ostringstream oss;
    oss << root;
    std::string str{ oss.str() + "\n" };

    socketSSL.async_send(
        boost::asio::buffer(str.c_str(), str.size()),
        boost::bind(
            &onSend,
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred));
}

修改后重新编译运行,SSL模式下就能正常收到解密后的明文数据了。

内容的提问来源于stack exchange,提问作者s4oul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:54:28