2013-03-12 28 views
5

similar questionBoost Asio SSL anlaşması asla

Davam farklıdır döndürür. Bir SSL istemcisini boost::asio::ssl kullanarak yazdım ancak şu anda diğer grup tarafından geliştirilmekte olan sınanacak sunucunuz yok. Bu yüzden mevcut sunucu sadece düz TCP (güvensiz) bağlantıları kabul eder. Ssl istemcisini sunucuya karşı kullandığımda, handshake() engellemesi kilitleniyor/hiç geri dönüyor. Ağ üzerinden arama yaptım ve Mozilla'nın da benzer sorunları olduğunu anladım - SSL bağlantısı olmayan bir sunucuya SSL bağlantısı kurulurken takıldı, ancak hataları sabit duruyor.

ctor yılında:

sonra
SecuredConnectionPolicy<ThreadPolicy>::SecuredConnectionPolicy() : 
    m_sslContext(boost::asio::ssl::context::sslv23), 
    m_socket(m_ioService, m_sslContext) //ssl::stream<tcp::socket> 
{ 

} 

benim "connect (...)" denir:

Ben sadece hayır kodlama hatası olmadığından emin olmak için benim kod bölümlerine açıklamalar koyacağım
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. Sebep ne olabilir? Yanlış bir şey yapıyorum?

  2. Herhangi bir veri doğrulama işleyicisi sağlamadığım için, OpenSSL tarafından yapılan ön düzeltmenin yapıldığını varsayıyorum (çünkü her yerde destek, OpenSSL eşdeğer işlevini çağırdığını söylüyor). Bunun bir dezavantajı var mı yoksa bu < 1> 'i etkileyebilir mi?

  3. Bu, önemsiz bir şeydir, ancak sorunlara neden olmadığından emin olmak için: Genellikle, destekleme örneklerinde, ssl context nesnesinin, ssl::stream<tcp::socket> kretine vermeden önce ayarlandığını gösterir. Ancak ben daha önce (yukarıdaki ctor) ve daha sonra connect()'daki özellikleri değiştiriyorum. Bunlar inşa edilmiş ssl :: akışının davranışına yansıyacak mıdır (çünkü bu referansa dayanır ve umarım kopya çıkarmaz). (Fayda varsa) Yan not

, bir CA ROOTKEY, CA kendi imzasını PEM belgesi, CA sertifikası tarafından imzalanmış Sunucu sertifikası yarattı. CA sertifikası, load_verify_file(...)'a verdiğim şeydir.

cevap

0

Tamamlanana veya başarısız olana kadar engellemeye çalışan bir işlemi çağırmayı seçtiniz, bu da öyle, dolayısıyla sonsuza dek engelleniyor. İşlemin kesinlikle başarılı olması veya başarısız olması gerektiği sürece engellemek istemiyorsanız, yalnızca bunu yapmak için özel olarak belgelenen bir işlem çağırma.

Diğer ucun yazılmadığı bir bağlantıyı okurken engelleme yaptıysanız, ne olmasını beklersiniz? Sonsuza dek engel olur. Burada, diğer ucun sizinle asla bir el sıkışma yapmayacağı bir bağlantı üzerinde engelleyici bir el sıkışma yaptınız. Kodunuz istediğin kadar bekler, istediğin gibi.

İlgili konular