首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Boost Asio SSL握手永不返回

Boost Asio SSL握手永不返回
EN

Stack Overflow用户
提问于 2013-03-12 06:27:30
回答 1查看 1.6K关注 0票数 5

similar question

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

ctor

代码语言:javascript
运行
复制
SecuredConnectionPolicy<ThreadPolicy>::SecuredConnectionPolicy() :
   m_sslContext(boost::asio::ssl::context::sslv23),
   m_socket(m_ioService, m_sslContext) //ssl::stream<tcp::socket>
{

}

然后当我的“connect(.)”称为:

代码语言:javascript
运行
复制
   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::stream<tcp::socket>的ctor中给出它之前,已经设置了ssl上下文对象。不过,我将在此之前(在上面的ctor中)提供它,然后在connect()中更改属性。这些是否反映在构建的ssl::stream的行为中(因为它是引用的,我希望它不会复制任何副本)?

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

EN

Stack Overflow用户

回答已采纳

发布于 2013-03-12 21:50:07

您选择调用一个操作,直到它完成或失败为止,它都不会,所以它会永远阻塞。如果您不想阻塞操作,只要操作确实成功或失败,就不要调用专门记录下来的操作。

如果在另一端从未写过的连接上执行阻塞读取,那么您会期望发生什么呢?就会被永远封死。在这里,您已经在另一端永远不会与您握手的连接上进行了阻塞握手。正如您所要求的那样,您的代码一直等到它运行。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15354737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档