2013-03-12 155 views
5

similar questionBoost Asio SSL握手永不返回

我的情况是不同的。我已经使用boost::asio::ssl编写了一个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> 
{ 

} 

然后,当我的“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完成的预验证(因为无处不在,它说它调用OpenSSL等效函数)应该足够了。是否有任何缺点或可能影响< 1>?

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

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

回答

0

您选择调用阻塞的操作直到它完成或失败,它既不会,也不会阻塞,因此永远阻塞。如果您不想阻止操作确实成功或失败,请不要调用专门记录的操作来做到这一点。

如果您对另一端从未写过的连接执行了阻塞式读取,您希望发生什么?它会永远阻止。在这里,你已经在一个连接上进行了阻塞握手,而另一端永远不会与你握手。你的代码一直等到它完成,就像你问的那样。