2013-03-12 8 views
5

similar questionबूस्ट एएसओ एसएसएल हैंडशेक कभी भी

मेरा मामला अलग है। मैंने boost::asio::ssl का उपयोग कर एक एसएसएल क्लाइंट लिखा है लेकिन वर्तमान में अन्य समूह द्वारा विकसित किए जा रहे परीक्षण के लिए कोई सर्वर नहीं है। तो वर्तमान सर्वर केवल सादा टीसीपी (असुरक्षित) कनेक्शन स्वीकार करता है। जब मैंने सर्वर के खिलाफ अपने एसएसएल क्लाइंट का उपयोग किया, तो ब्लॉकिंग handshake() लटका/कभी वापस नहीं आती है। मैंने नेट पर खोज की है और यह पाया है कि मोज़िला में भी इसी तरह के मुद्दे थे - गैर-एसएसएल सहायक सर्वर से एसएसएल कनेक्शन शुरू करते समय यह लटका हुआ था, लेकिन उनकी बग तय है।

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. मैं कोई सत्यापन_callback हैंडलर प्रदान नहीं कर रहा हूं क्योंकि मुझे लगता है कि ओपनएसएसएल द्वारा किए गए प्रीविरिफिकेशन (क्योंकि हर जगह यह कहता है कि यह ओपनएसएसएल समकक्ष फ़ंक्शन को कॉल कर रहा है) पर्याप्त होना चाहिए। क्या इसका कोई नकारात्मक पक्ष है या क्या यह < 1> को प्रभावित कर सकता है?

  3. यह एक छोटा सा है लेकिन यह सुनिश्चित करने के लिए कि यह समस्याएं नहीं पैदा करता है: आम तौर पर बूस्ट शो में उदाहरण दिखाते हैं कि एसएसएल संदर्भ वस्तु ssl::stream<tcp::socket> के सीटीआर में देने से पहले सेट की गई है। हालांकि मैं इसे पहले (सीटीओ में) और बाद में connect() में गुणों को बदल रहा हूं। क्या इन्हें निर्मित एसएसएल :: स्ट्रीम के व्यवहार में प्रतिबिंबित किया जाएगा (क्योंकि यह संदर्भ में लेता है और मुझे उम्मीद है कि यह कोई प्रतिलिपि नहीं बनायेगा)?

एक तरफ ध्यान दें पर (यदि यह उपयोगी है), मैं एक सीए rootKey, सीए स्व-हस्ताक्षरित पीईएम प्रमाण पत्र, प्रमाण पत्र सर्वर CA प्रमाणपत्र द्वारा हस्ताक्षरित बनाया। सीए प्रमाणपत्र वह है जो मैं load_verify_file(...) पर दे रहा हूं।

उत्तर

0

आपने एक ऑपरेशन का आह्वान करना चुना है जो तब तक ब्लॉक करता है जब तक यह पूरा या विफल न हो जाए, यह न तो होता है, इसलिए यह हमेशा के लिए अवरुद्ध होता है। यदि आप ऑपरेशन के लिए निश्चित रूप से सफल होने या विफल होने तक ब्लॉक करना नहीं चाहते हैं, तो उस ऑपरेशन को कॉल न करें जो विशेष रूप से ऐसा करने के लिए प्रलेखित है।

यदि आपने किसी कनेक्शन पर अवरुद्ध किया है जहां दूसरे छोर ने कभी लिखा नहीं है, तो आप क्या होने की उम्मीद करेंगे? यह हमेशा के लिए ब्लॉक होगा। यहां, आपने एक कनेक्शन पर अवरुद्ध हैंडशेक किया है जहां दूसरा अंत कभी आपके साथ हैंडशेक नहीं करेगा। आपका कोड तब तक इंतजार करता है जब तक आप इसे नहीं पूछते।

संबंधित मुद्दे