Boost Asio SSL握手永远不会返回

Boost Asio SSL handshake never returns

本文关键字:返回 永远 Asio SSL Boost      更新时间:2023-10-16

类似问题

我的情况不同。我已经使用boost::asio::ssl编写了一个SSL客户端,但目前没有服务器可以测试,因为它是由其他小组开发的。因此,当前服务器只接受普通TCP(不安全)连接。当我对服务器使用ssl客户端时,阻塞handshake()挂起/永远不会返回。我在网上搜索了一下,发现Mozilla也有类似的问题——当启动SSL连接到一个不支持SSL的服务器时,它会挂起,但是他们的错误已经修复了。我将对部分代码进行解释,以确保没有编码错误:

in ctor:

SecuredConnectionPolicy<ThreadPolicy>::SecuredConnectionPolicy() :
   m_sslContext(boost::asio::ssl::context::sslv23),
   m_socket(m_ioService, m_sslContext) //ssl::stream<tcp::socket>
{
}

然后当我的" connect(…)"被调用时:

   m_sslContext.set_options(boost::asio::ssl::context::default_workarounds);
   m_sslContext.set_verify_mode(
            boost::asio::ssl::context::verify_none,
            errorCode
            );
   if(!errorCode)
   {
      /*m_sslContext.set_verify_callback(
               [this](bool bIsPreverificationSuccessful, boost::asio::ssl::verify_context &context){return this->verificationHandler(bIsPreverificationSuccessful, context);},
               errorCode
               );*/
      if(!errorCode)
      {
         m_sslContext.load_verify_file("newcert.pem", errorCode);
         if(!errorCode)
         {
            m_socket.lowest_layer().connect(remoteEndpoint, errorCode);
            if(!errorCode)
            {  //    ########### Following NEVER RETURNS #############
               m_socket.handshake(boost::asio::ssl::stream_base::client, errorCode);
               if(errorCode)
               {
                  std::cerr << "Secured Connection Handshake Failed! " << errorCode.message() << std::endl;
               }
            }
            else
            {
               std::cerr << "Secured Connection Failed! " << errorCode.message() << std::endl;
            }
         }
         else
         {
            std::cerr << "Secured Connection loading certificate files from default paths Failed! " << errorCode.message() << std::endl;
         }
      }
      else
      {
         std::cerr << "Registering Verification callback failed! " << errorCode.message() << std::endl;
      }
   }
   else
   {
      std::cerr << "Secured Connection verify mode Failed! " << errorCode.message() << std::endl;
   }
  1. 原因是什么?我做错什么了吗?

  2. 我不提供任何verify_callback处理程序,因为我假设由OpenSSL完成的预验证(因为在boost中到处都说它正在调用OpenSSL等效函数)应该足够了。这有什么不利之处吗?或者这会影响到我们吗?

  3. 这是一个微不足道的,但只是为了确保它不会引起问题:通常在boost中的示例显示ssl上下文对象在ssl::stream<tcp::socket>的ctor中给出之前已经设置。然而,我在之前(在上面的角色中)给出它,然后在connect()中更改属性。这些会反映在构造ssl::流的行为(因为它需要引用,我希望它不做任何副本)?

在一个侧面说明(如果它是有用的),我创建了一个CA rootKey, CA自签名PEM证书,由CA证书签名的服务器证书。CA证书是我给load_verify_file(...)的。

您选择调用一个阻塞直到完成或失败的操作,它两者都不阻塞,因此它永远阻塞。如果你不想在操作确定成功或失败的时间内阻塞,那么就不要调用专门为此编写文档的操作。

如果你在一个连接上阻塞读,而另一端从来没有写过,你会期望发生什么?它会永远阻塞。在这里,你在一个连接上做了一个阻塞握手,另一端永远不会与你握手。您的代码等待,直到它完成,就像您要求的那样。