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
相关产品推荐
相关产品推荐

