C++ Boost Asio SSL握手永不返回

C++ Boost Asio SSL握手永不返回,c++,boost,ssl,c++11,boost-asio,C++,Boost,Ssl,C++11,Boost Asio,我的情况不同。我已经使用boost::asio::SSL编写了一个SSL客户机,但目前还没有服务器可供测试,因为其他团队正在开发它。因此,当前服务器只接受普通TCP(不安全)连接。当我对服务器使用ssl客户端时,阻塞handshake()挂起/永远不会返回。我在网上搜索过,发现Mozilla也有类似的问题——它在启动到非SSL支持服务器的SSL连接时挂起,但它们的错误是固定的。我只对部分代码进行解释,以确保没有编码错误: 在ctor中: SecuredConnectionPolicy<Th

我的情况不同。我已经使用
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>
{

}
  • 原因可能是什么?我做错什么了吗

  • 我没有提供任何verify_回调处理程序,因为我假设OpenSSL所做的预验证(因为boost中到处都说它调用的是OpenSSL等效函数)应该足够了。这有什么负面影响吗?或者这会影响到你的健康吗

  • 这是一个很小的问题,但只是为了确保它不会引起问题:boost中的示例通常显示,在
    ssl::stream
    的ctor中给出ssl上下文对象之前,已经设置了它。但是,我之前(在上面的ctor中)给出了它,之后在
    connect()
    中更改了属性。这些会反映在构造的ssl::stream的行为中吗(因为它是通过引用获取的,我希望它不会复制任何副本)


  • 顺便说一句(如果有用的话),我创建了一个CA根密钥、CA自签名PEM证书、由CA证书签名的服务器证书。CA证书是我提供给加载验证文件(…)

    的内容。如果您选择调用一个阻止操作,直到它完成或失败,那么这两个操作都不会,所以它将永远阻止。如果您不想阻止操作的成功或失败,请不要调用专门记录的操作

    如果您在另一端从未进行过写入的连接上执行了阻塞读取,您希望发生什么?它会永远阻塞。在这里,您在一个连接上进行了阻塞握手,而另一端永远不会与您握手。您的代码会等待,直到它按照您的要求执行为止

       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;
       }