A boost-asio
SSL/TLS TCP 套接字实现为ssl::stream
over a tcp::socket
:
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket;
In the TLS https://www.rfc-editor.org/rfc/rfc5246协议,加密安全关闭涉及各方交换close_notify
消息。简单地关闭最低层可能会使会话容易受到截断攻击 https://en.wikipedia.org/wiki/Transport_Layer_Security#Truncation_attack.
In boost asio ssl async_shutdown 总是以错误结束? https://stackoverflow.com/questions/25587403/boost-asio-ssl-async-shutdown-always-finishes-with-an-error/25703699#25703699@Tanner Sansbury 通过多种场景详细描述了 SSL 关闭过程,并建议使用async_shutdown
随后是一个async_write
在关闭套接字之前断开 SSL 流:
ssl_socket.async_shutdown(...);
const char buffer[] = "";
async_write(ssl_socket, buffer, [](...) { ssl_socket.close(); })
执行一个async_shutdown
on an ssl::stream
发送 SSLclose_notify
消息并等待另一端的响应。之后写入流的目的async_shutdown
时将被通知async_shutdown
已发送close_notify
这样就可以关闭套接字而无需等待响应。然而,在当前(1.59)版本中boost http://www.boost.org/打电话给async_write
失败...
In 如何优雅地关闭 boost asio ssl 客户端? https://stackoverflow.com/questions/22575315/how-to-gracefully-shutdown-a-boost-asio-ssl-client@maxschlepzig 建议关闭底层 TCP 套接字的接收器:
ssl_socket.lowest_layer()::shutdown(tcp::socket::shutdown_receive);
这会产生一个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, 0, SSL_R_SHORT_READ))
{
// -> not a real error:
do_ssl_async_shutdown();
}
或者取消套接字上的读/写操作,然后调用 SSL 异步关闭,即:
boost::system::error_code ec;
ssl_socket.cancel(ec);
ssl_socket.async_shutdown([](...) { ssl_socket.close(); };
我目前正在使用最后一种方法,因为它适用于当前版本boost
.
安全断开连接的正确/最佳方法是什么boost-asio
SSL 套接字?