相关疑难解决方法(0)

如何优雅地关闭一个提升asio ssl客户端?

客户端执行一些ssl::stream<tcp_socket>::async_read_some()/ ssl::stream<tcp_socket>::async_write()调用,并且在某些时候需要退出,即它需要关闭连接.

调用ssl::stream<tcp_socket>::lowest_layer().close()工作,但(正如预期的那样)服务器(openssl s_server -state ...命令)报告关闭连接时出错.

看看API正确的方式似乎是打电话ssl::stream<tcp_socket>::async_shutdown().

现在基本上有两种情况需要关机:

1)客户端处于async_read_some()回调状态,并对来自服务器的"退出"命令做出反应.从那里调用会async_shutdown()在关闭回调中产生"短读"错误.

这是令人惊讶的,但谷歌搜索后似乎是正常的行为 - 似乎必须检查是否是一个真正的错误或不是这样的:

// const boost::system::error_code &ec
if (ec.category() == asio::error::get_ssl_category() &&
  ec.value() == ERR_PACK(ERR_LIB_SSL, 0, SSL_R_SHORT_READ)) {
  // -> not a real error, just a normal TLS shutdown
}
Run Code Online (Sandbox Code Playgroud)

TLS服务器似乎很高兴,但它报告说:

DONE
shutting down SSL
CONNECTION CLOSED
Run Code Online (Sandbox Code Playgroud)

2)A async_read_some()处于活动状态 - 但用户决定退出客户端(例如,通过stdin命令).async_shutdown()发生以下情况时从该上下文调用:

  • async_read_some()回调以"短读"错误代码执行的-种目前预计
  • async_shutdown()回调与执行解密失败或不良记录MAC错误代码-这是意外

服务器端不报告错误.

因此我的问题是如何使用boost asio正确关闭TLS客户端.

c++ ssl boost openssl boost-asio

14
推荐指数
1
解决办法
5342
查看次数

安全断开asio SSL插槽的正确方法是什么?

一个boost-asioSSL/TLS TCP套接字实现为ssl::streamtcp::socket:

boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket;
Run Code Online (Sandbox Code Playgroud)

TLS协议中,加密安全关闭涉及各方交换close_notify消息.简单地关闭最低层可能会使会话容易受到截断攻击.

提升asio ssl async_shutdown总是以错误结束?@Tanner Sansbury在很多场景中详细描述了SSL关闭过程,并建议在关闭套接字之前使用a async_shutdown后跟a async_write断开SSL流:

ssl_socket.async_shutdown(...);
const char buffer[] = "";
async_write(ssl_socket, buffer, [](...) { ssl_socket.close(); }) 
Run Code Online (Sandbox Code Playgroud)

执行async_shutdownon on ssl::stream发送SSL close_notify消息并等待来自另一端的响应.async_shutdownasync_shutdown发送之后将被通知的目的是写入流,close_notify以便可以在不等待响应的情况下关闭套接字.但是,在当前(1.59)版本的boost中,调用async_write失败...

如何优雅地关闭提升asio ssl客户端?@maxschlepzig建议关闭底层TCP套接字的接收者:

ssl_socket.lowest_layer()::shutdown(tcp::socket::shutdown_receive);
Run Code Online (Sandbox Code Playgroud)

这会产生short read错误,并async_shutdown在错误处理程序中检测到时调用:

// const boost::system::error_code &ec
if (ec.category() == asio::error::get_ssl_category() &&
  ec.value()    == ERR_PACK(ERR_LIB_SSL, …
Run Code Online (Sandbox Code Playgroud)

c++ ssl boost-asio

8
推荐指数
1
解决办法
3058
查看次数

使用 Boost Beast 通过代理发出同步 http 请求的问题

我已经修改了 http_sync 示例以通过代理连接,我已经用 Wireshark 进行了测试,问题是在我发送 http 连接请求后,代理返回代码 200 OK,而我的程序无法读取,它得到在 http::read 上等待大约 1 分钟,然后服务器断开了我的连接。我试过解决这个问题,只是没有读取响应,但是当我尝试进行 ssl 握手时,我收到一个错误:未知协议(就wireshark 而言,我的 ssl 握手发送了一个客户端你好,然后我收到了完整的服务器你好,但我的程序在此期间发送了一个 FIN 并给了我错误,我认为这是因为他阅读了 200 OK 而不是服务器的答案并感到困惑)。所以我想我的问题是,有没有办法解决这个问题?我不知道为什么 http::read 卡住了。它在没有中间代理的情况下正常工作。这是我的代码:

using tcp = boost::asio::ip::tcp;       // from <boost/asio/ip/tcp.hpp>
namespace ssl = boost::asio::ssl;       // from <boost/asio/ssl.hpp>
namespace http = boost::beast::http;    // from <boost/beast/http.hpp>


int main(int argc, char** argv)
{
try
{
    // Check command line arguments.
    auto const target = "www.discogs.com:443";
    auto const host = "192.116.142.153";
    auto const port = "443";
    int version = 11;

    // The …
Run Code Online (Sandbox Code Playgroud)

c++ boost-asio boost-beast

6
推荐指数
1
解决办法
2099
查看次数

Boost Asio SSL 第二次以后无法接收数据(第一次正常)

我正在为简单的 RESTful 服务器开发 Boost Asio 和 Boost Beast。对于普通的 HTTP 和 TCP 套接字,它工作得很好。我用 JMeter 对它进行了负载测试,一切正常。

我尝试添加 SSL 套接字。我设置了“ssl::context”,也称为“async_handshake()”——与普通套接字相比,SSL 的附加步骤。仅在第一次时有效。客户端可以与我(服务器)连接,我也可以通过“boost::beast::http::async_read()”接收数据。

因为这是 RESTful,所以连接将在请求和响应后断开。我调用“SSL_Socket.shutdown()”,然后调用“SSL_Socket.lowest_layer().close()”来关闭 SSL 套接字。

当下一个传入请求时,客户端能够与我(服务器)连接。我调用了“SSL_Socket.async_handshake()”,然后调用了“boost::beast::http::async_read()”。但这次我无法收到任何数据。但连接已成功建立。

有人知道我错过了什么吗?

非常感谢!

c++ ssl boost openssl boost-asio

6
推荐指数
1
解决办法
2087
查看次数

标签 统计

boost-asio ×4

c++ ×4

ssl ×3

boost ×2

openssl ×2

boost-beast ×1