Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 安全断开asio SSL套接字的正确方法是什么?_C++_Ssl_Boost Asio - Fatal编程技术网

C++ 安全断开asio SSL套接字的正确方法是什么?

C++ 安全断开asio SSL套接字的正确方法是什么?,c++,ssl,boost-asio,C++,Ssl,Boost Asio,boost-asioSSL/TLS-TCP套接字在TCP::socket上实现为SSL::stream: boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket; 在ssl::stream上执行async_shutdown会发送一条sslclose_notify消息,并等待另一端的响应。在async\u shutdown之后写入流的目的是在async\u shutdown发送了close\u notify时

boost-asio
SSL/TLS-TCP套接字在
TCP::socket
上实现为
SSL::stream

boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket;
ssl::stream
上执行
async_shutdown
会发送一条ssl
close_notify
消息,并等待另一端的响应。在
async\u shutdown
之后写入流的目的是在
async\u shutdown
发送了
close\u notify
时得到通知,以便在不等待响应的情况下关闭套接字。但是,在当前(1.59)版本中,调用
async\u write
失败

在@maxschlepzig中,建议关闭底层TCP套接字的接收器:

ssl_socket.lowest_layer()::shutdown(tcp::socket::shutdown_receive);
这会产生一个
short read
错误,当在错误处理程序中检测到该错误时,会调用
async\u 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 async shutdown,即:

boost::system::error_code ec;
ssl_socket.cancel(ec);
ssl_socket.async_shutdown([](...) { ssl_socket.close(); };
我目前使用的是最后一种方法,因为它适用于当前版本的
boost


安全断开boost asioSSL套接字的正确/最佳方法是什么?

要安全断开,请执行关机操作,然后在关机完成后关闭基础传输。因此,您当前使用的方法将执行安全断开连接:

boost::system::error\u code ec;
ssl_套接字取消(ec);
ssl_socket.async_shutdown([](…){ssl_socket.close();};
请注意,当前的
async_shutdown
操作将被视为在以下情况下完成:

  • 远程对等方已收到
    close\u notify
  • 远程对等方关闭套接字
  • 该操作已被取消
因此,如果资源绑定到套接字或连接的生存期,则这些资源将保持活动状态,等待远程对等方采取操作或本地取消操作。但是,安全关闭不需要等待
close\u notify
响应。如果资源绑定到连接,以及在发送关机时,本地连接被视为已断开,因此不必等待远程对等方采取操作:

ssl_socket.async_shutdown(…);
常量字符缓冲区[]=“”;
异步写入(ssl套接字,boost::asio::buffer(buffer),
[](…){ssl_socket.close();})
当客户端发送
close\u notify
消息时,客户端保证客户端不会通过安全连接发送额外数据用于检测客户端何时发送了
close\u notify
,并在完成处理程序中关闭底层传输,导致
async\u shutdown()
完成
boost::asio::error::operation\u中止
。如中所述,
async\u write()
操作预计会失败

…由于PartyA的SSL流的写入端已关闭,
async_write()
操作将失败,并出现SSL错误,表明协议已关闭

if((error.category()==boost::asio::error::get\u ssl\u category())
&&(SSL_R_协议_IS_SHUTDOWN==ERR_GET_REASON(error.value()))
{
ssl_stream.lower_layer().close();
}
失败的
async\u write()
操作将显式关闭底层传输,导致等待PartyB的
close\u notify
取消的
async\u shutdown()
操作


视情况而定。如果您收到了
close\u notify
,您没有义务发送通知。是的,但您不需要在发送通知后等待收到
close\u notify
。谢谢@Tanner,我完全同意,一旦客户发送了
close notify
,就不必等待响应,我使用了
async_shutdown
之后是
async_write
,正如您在此处和您的(优秀)文档中所述不幸的是,使用boost 1.59,对
异步写入
的调用现在失败了,因为
引擎崩溃了。ipp
而不是用
SSL\u R\u协议调用回调是关闭的
!那么,如何最好地断开SSL套接字而不崩溃呢?@kenba I将设法找时间进行调查。应用程序是否保证了这一点所有异步操作都是在同一隐式或显式链中执行的?通常情况下,Boost会崩溃。Asio SSL是违反并发要求的结果。谢谢@Tanner,如果您能找到原因,那就太好了。所讨论的应用程序是单线程的,因此没有并发问题。@Vinnie启动
async\u write()
并执行一次未完成的
async\u关机()
用于检测流的本地写入端何时关闭,允许用户释放资源,而无需等待远程对等方关闭其ssl流。如果用户等待
async_shutdown
完成,则不再需要
async_write
。我遇到了kenba提到的问题engine.ipp中发生崩溃的地方,只有当多个线程运行时才会发生。
ioservice::run
。它还需要32个线程才能命中。正如Tanner Sansbury指出的那样,这是由于违反了SSL并发问题。修复方法是串接关机和写入:
SSL\u socket.async\u关机(串接);const char buffer[]=”;async_write(ssl_socket,boost::asio::buffer(buffer),strand_u.wrap(..);
-希望这对其他人有所帮助
boost::system::error_code ec;
ssl_socket.cancel(ec);
ssl_socket.async_shutdown([](...) { ssl_socket.close(); };