5

类似的问题

我的情况不同。我已经编写了一个 SSL 客户端,boost::asio::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 等效函数)应该足够了。它有什么缺点吗?或者这会影响<1>吗?

  3. 这是一个微不足道的问题,但只是为了确保它不会引起问题:通常 boost 中的示例表明 ssl 上下文对象在 ctor of 中提供之前已设置ssl::stream<tcp::socket>。但是,我在之前(在上面的 ctor 中)给出它,然后在connect(). 这些是否会反映在构造的 ssl::stream 的行为中(因为它通过引用获取,我希望它不会复制)?

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

4

1 回答 1

1

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

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

于 2013-03-12T21:50:07.703 回答