ssl - 通过代理提升 Asio SSL,“握手:版本号错误”
问题描述
我正在尝试使用 Boost.Asio(和 Boost.Beast)通过我的代理服务器建立 TLS 连接。
使用 HTTP CONNECT 设置隧道按预期工作。我用作演示的代码是:
net::io_context ioc{};
std::thread([&] {
ioc.run();
}).detach();
ssl::context ssl_context_{ssl::context::tls};
ssl_context_.set_default_verify_paths();
ssl_context_.add_verify_path("/opt/misc/certificates");
auto websocket_secure_ = std::make_shared<websocket::stream<ssl::stream<tcp::socket>>>(ioc, ssl_context_);
tcp::resolver resolver_{ioc};
auto const resolve_results = resolver_.resolve("www-my.proxy.int", "8080");
net::connect(websocket_secure_->next_layer().next_layer(), resolve_results.begin(), resolve_results.end());
const std::string HOST_TO_CONNECT_TO = "my.host.com:443";
http::request<http::string_body> request_connect{http::verb::connect, HOST_TO_CONNECT_TO, 11};
request_connect.insert(http::field::proxy_authorization, "Basic dXNlcm5hbWU6cGFzc3dvcmQ=");
request_connect.insert(http::field::host, HOST_TO_CONNECT_TO);
boost::beast::http::write(websocket_secure_->next_layer().next_layer(), request_connect);
正如预期的那样,Wireshark 显示一个 HTTP CONNECT,后跟一个 200 响应。
但是,之后尝试进行 SSL 握手会导致抛出错误:“握手:错误的版本号”。
try {
websocket_secure_->next_layer().handshake(ssl::stream_base::client);
} catch (boost::system::system_error& error) {
std::cout << error.what();
throw error;
}
Wireshark 显示一个 Client Hello,然后是一个 Server Hello、Certificate、Server Key Exchange、Certificate Request、Server Hello Done。跟踪对我来说看起来不错,并且与我的浏览器对同一网站的请求没有什么不同。
如果我不必通过代理传输请求,SSL 握手就可以正常工作。
为什么我的应用程序中出现抛出错误?提前感谢您的帮助!
解决方案
对于任何有类似问题的人:
Vinnie Falco 在 Github 上发布了一个有效的回复(再次感谢!):
推荐阅读
- ios - Firebase Crashlytics 作为 pod 依赖项
- javascript - 使用来自 JavaScript 的参数调用托管 bean 方法
- node.js - PurchaseLogsModel.find() 在猫鼬中返回空
- sass - Sapper - 导入的 scss 样式消失
- java - 如何在 Bukkit 插件中的命令上重新加载 config.yml 文件?
- ascii - ADFV2 中的特殊字符 (¿) 编码为 (?) 问题
- java - Java String 和 byte[] 转换疯狂
- scala - 如何使用 scala 宏生成顶级类/对象
- node.js - 函数返回的 Jest 模拟值
- django - 无法将关键字“用户名”解析为字段。选项有:bio、blog、description、id、image、speciality、status、user、user_id