Boost Asio SSL握手永远不会返回

ust*_*ion 5 c++ ssl boost boost-asio c++11

类似的问题

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

ctor:

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

}
Run Code Online (Sandbox Code Playgroud)

然后当我的" 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;
   }
Run Code Online (Sandbox Code Playgroud)
  1. 可能是什么原因?我做错了吗?

  2. 我没有提供任何verify_callback处理程序,因为我假设OpenSSL完成了预验证(因为在boost中它说它调用OpenSSL等效函数)应该足够了.它是否有任何缺点或者这会影响<1>?

  3. 这是一个微不足道的,但只是为了确保它不会导致问题:通常在boost中的示例显示ssl上下文对象已经设置在ctor之前ssl::stream<tcp::socket>.然而,我之前(在上面的ctor中)以及之后更改属性connect().这些是否会反映在构造的ssl :: stream的行为中(因为它是通过引用获取的,我希望它不会制作任何副本)?

在旁注(如果它有用),我创建了CA rootKey,CA自签名PEM证书,由CA证书签名的服务器证书.CA证书是我给予的load_verify_file(...).

Dav*_*rtz 1

您选择调用一个操作,该操作会阻塞直到完成或失败,但它既不会完成也不会失败,因此它会永远阻塞。如果您不想在操作确定成功或失败之前一直阻塞,请不要调用专门记录来执行此操作的操作。

如果您在连接上进行了阻塞读取,而另一端从未进行过写入操作,您会期望发生什么?它会永远阻塞。在这里,您已经在连接上进行了阻塞握手,而另一端永远不会与您进行握手。您的代码会等待,直到它完成,就像您要求的那样。