【问题标题】:Boost Asio SSL handshake never returnsBoost Asio SSL 握手永远不会返回
【发布时间】:2013-03-12 06:27:30
【问题描述】:

similar question

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

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&lt;tcp::socket&gt; 的 ctor 之前已经设置了它。但是,我在之前(在上面的 ctor 中)给出它,然后在 connect() 中更改属性。这些是否会反映在构造的 ssl::stream 的行为中(因为它通过引用获取,我希望它不会复制)?

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

【问题讨论】:

    标签: c++ boost ssl c++11 boost-asio


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-26
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      相关资源
      最近更新 更多