使用Boost Asio读取SSL加密TCP套接字数据至末尾的问题
HTTPS代理SSL数据读取问题(基于Boost Asio)
我是C++新手,正在使用Boost Asio开发一款用于突破网络过滤的代理服务器,分为Agent和Server两部分:
- Agent:负责接收客户端请求并转发至Server
- Server:负责接收Agent请求并转发至源服务器
该代理对HTTP请求处理正常,但处理HTTPS请求时遇到问题。
请求流程
客户端通过HTTPS代理连接Agent → Agent将CONNECT请求Base64编码后放入HTTP POST请求体发送给Server → Server解码后建立与源服务器的连接,回复Agent连接成功 → 客户端开始SSL握手,此时问题出现。
尝试过的读取方法
- 使用
boost::asio::read_until按\r\n读取:SSL数据无此类结束标识,无法正常读取 - 使用
boost::asio::read搭配transfer_at_least(1):仅能读取部分数据(如部分Client Hello) - 使用
transfer_all():需等待EOF,但连接未断开时无法触发 - 逐字节循环读取:会长时间等待后续数据,无法判断何时停止
曾考虑解析SSL流的头部记录来判断数据结束,但实现难度极大。
更新说明
问题出在Agent读取客户端、Server读取源服务器的SSL数据时,无法判断数据结束。测试时设置代理后执行curl https://www.google.com,程序无法输出END,直到终止curl。
疑问
- 不解析SSL流是否能实现读取至数据末尾?
- Nginx等应用如何处理SSL请求?
- Boost是否适合该场景,还是应使用基础C++库?
临时方案
通过socket_.available()判断是否有剩余数据,但不可靠,最终可能需解析SSL头部记录。
内容的提问来源于stack exchange,提问作者Morteza Bashsiz
相关产品推荐
相关产品推荐

