2013-01-22 39 views
7

हमारे पास एक बहु थ्रेडेड नेटवर्क एप्लिकेशन है जो 10 वर्षों तक सॉकेट का उपयोग कर रहा है और अब हम ओपनएसएसएल 0.9.8 एल के साथ एप्लिकेशन को सुरक्षित करने की कोशिश कर रहे हैं। पिछले कुछ वर्षों में, एप्लिकेशन के नेटवर्क प्रोटोकॉल को एकल सॉकेट कनेक्शन की डुप्लेक्स प्रकृति का लाभ उठाने के लिए डिज़ाइन किया गया है; आवेदन एक ही सॉकेट पर समवर्ती रूप से पढ़ता है और लिखता है। एप्लिकेशन अंतर्निहित सॉकेट का प्रबंधन करता है और एसएसएल_सेट_एफडी के माध्यम से ओपनएसएसएल को सॉकेट डिस्क्रिप्टर पास करता है।क्लियरिंग ओपनएसएसएल 0.9.8 एल Concurrency समर्थन - एसएसएल उदाहरण एकाधिक थ्रेड द्वारा उपयोग किया जा सकता है यदि गैर-समवर्ती हो गया?

हमने मल्टीथ्रेड समर्थन के लिए ओपनएसएसएल को कॉन्फ़िगर किया, स्थिर और गतिशील लॉकिंग कॉलबैक दोनों को स्थापित किया। CRYPTO_set_id_callback(), CRYPTO_set_locking_callback(), आदि। अधिकांश भाग के लिए, एप्लिकेशन अच्छी तरह से काम करता है लेकिन हम कुछ विसंगतियों को देख रहे हैं। कारण निर्धारित करने में हमारी सहायता के लिए, कुछ प्रश्नों के निश्चित उत्तर मदद करेंगे।

ओपनएसएसएल अक्सर पूछे जाने वाले प्रश्न पृष्ठ बताते हैं कि ओपनएसएसएल थ्रेड सुरक्षित है, लेकिन यह सुनिश्चित करता है कि एक एकल "एसएसएल कनेक्शन समसामयिक रूप से एकाधिक धागे द्वारा उपयोग नहीं किया जा सकता है।"

http://www.openssl.org/support/faq.html#PROG1

  1. सही है या गलत। ओपनएसएसएल कनेक्शन एपीआई कॉल (एसएसएल_रेड, एसएसएल_वाइट, इत्यादि) एक ही एसएसएल इंस्टेंस पर एक साथ निष्पादित कर सकते हैं (पॉइंटर-टू-एसएसएल एसएसएल_न्यू कॉल द्वारा लौटाया गया है)?
  2. सही या गलत। एसएसएल_MODE_AUTO_RETRY को सक्षम करने वाले सॉकेट को अवरुद्ध करने के लिए, थ्रेड ए एसएसएल इंस्टेंस एक्स पर SSL_Read() को कॉल कर सकता है जबकि थ्रेड बी एसएसएल उदाहरण के साथ SSL_Write() को कॉल करता है?
  3. सही या गलत। ओपनएसएसएल त्रुटि मुक्त करता है जब कोई एप्लिकेशन गैर-अवरुद्ध सॉकेट का उपयोग करता है और उसी SSL इंस्टेंस पर SSL_Read और SSL_Write (साथ ही साथ अन्य कनेक्शन API कॉल) के समवर्ती निष्पादन को रोकता है?
  4. सही या गलत। SSL_new द्वारा ओपनएसएसएल एसएसएल इंस्टेंस वापस लौटाया गया है जो एकल थ्रेड से जुड़ा हुआ है जिसे SSL_new कहा जाता है; बाध्य अर्थ है कि एसएसएल उदाहरण किसी अन्य थ्रेड के साथ साझा नहीं किया जा सकता है, एसएसएल इंस्टेंस केवल थ्रेड पर उपयोग के लिए मान्य है जिसे SSL_new कहा जाता है?
  5. सही या गलत। अगर थ्रेड ए i) एसएसएल_न्यू को कॉल करता है, तो एसएसएल इंस्टेंस एक्स प्राप्त करता है और ii) SSL इंस्टेंस एक्स का उपयोग करके SSL_Read को कॉल करता है। अंततः विफलता तब होती है जब थ्रेड बी गैर-समवर्ती रूप से SSL_Read/SSL_Write को उसी SSL इंस्टेंस एक्स का उपयोग करके कॉल करता है?
+0

एक स्मृति रिसाव विसंगति जो हम सामना कर रहे थे, थ्रेड समाप्ति से पहले ERR_remove_state (3) को कॉल करने में असफल होने के कारण - https://www.openssl.org/docs/crypto/err.html – buzz3791

उत्तर

13

1. ट्राउ या गलत। ओपनएसएसएल कनेक्शन एपीआई कॉल (एसएसएल_रेड, एसएसएल_वाइट, इत्यादि) एक ही एसएसएल इंस्टेंस पर एक साथ निष्पादित कर सकते हैं (पॉइंटर-टू-एसएसएल एसएसएल_न्यू कॉल द्वारा लौटाया गया है)?

* झूठा। नहीं, आप एक ही SSL इंस्टेंस पर समवर्ती रूप से SSL_read/SSL_write का उपयोग नहीं कर सकते हैं। *

2. ट्राउ या गलत। एसएसएल_MODE_AUTO_RETRY को सक्षम करने वाले सॉकेट को अवरुद्ध करने के लिए, थ्रेड ए एसएसएल इंस्टेंस एक्स पर SSL_Read() को कॉल कर सकता है जबकि थ्रेड बी एसएसएल उदाहरण के साथ SSL_Write() को कॉल करता है?

* उपरोक्त के समान उत्तर। SSL_MODE_AUTO_RETRY के साथ या उसके बिना, आप एक ही SSL इंस्टेंस एक्स का उपयोग समकक्ष रूप से SSL_read और SSL_write समानांतर *

3. ट्राउ या गलत से करने के लिए नहीं कर सकते हैं। ओपनएसएसएल त्रुटि मुक्त करता है जब कोई एप्लिकेशन गैर-अवरुद्ध सॉकेट का उपयोग करता है और उसी SSL इंस्टेंस पर SSL_Read और SSL_Write (साथ ही साथ अन्य कनेक्शन API कॉल) के समवर्ती निष्पादन को रोकता है?

सच।यदि कोई समवर्ती निष्पादन नहीं है, तो ओपनएसएसएल ब्लॉकिंग के साथ-साथ गैर-अवरुद्ध सॉकेट के लिए ठीक काम करता है।

4. ट्राउ या गलत। SSL_new द्वारा ओपनएसएसएल एसएसएल इंस्टेंस वापस लौटाया गया है जो एकल थ्रेड से जुड़ा हुआ है जिसे SSL_new कहा जाता है; बाध्य अर्थ है कि एसएसएल उदाहरण किसी अन्य थ्रेड के साथ साझा नहीं किया जा सकता है, एसएसएल इंस्टेंस केवल थ्रेड पर उपयोग के लिए मान्य है जिसे SSL_new कहा जाता है?

झूठा। एसएसएल इंस्टेंस ओपनएसएसएल द्वारा किसी भी धागे से जुड़ा नहीं है। आप एक थ्रेड में बनाए गए एसएसएल इंस्टेंस का उपयोग किसी अन्य थ्रेड में तब तक कर सकते हैं जब तक कि केवल एक थ्रेड किसी भी समय एक एसएसएल इंस्टेंस का उपयोग नहीं कर रहा हो।

5. ट्राउ या गलत। अगर थ्रेड ए i) एसएसएल_न्यू को कॉल करता है, तो एसएसएल इंस्टेंस एक्स प्राप्त करता है और ii) SSL इंस्टेंस एक्स का उपयोग करके SSL_Read को कॉल करता है। अंततः विफलता तब होती है जब थ्रेड बी गैर-समवर्ती रूप से SSL_Read/SSL_Write को उसी SSL इंस्टेंस एक्स का उपयोग करके कॉल करता है?

झूठा। दोनों धागा एक और धागा बी एक ही एसएसएल उदाहरण एक्स का उपयोग कर सकते हैं, जब तक दोनों

0

प्रयोगात्मक रूप से, अगर SSL कनेक्शन बातचीत के चरण बीत चुका है, और कोई एसएसएल उदाहरण एक्स पर समवर्ती संचालन नहीं करते बाद में पुनर्विचार, फिर SSL_read और SSL_write के उपयोग ने समसामयिक रूप से कोई नुकसान नहीं पहुंचाया। यह मेरे परीक्षणों के अनुसार है जहां मैंने पुश फ्रेमवर्क, एक बहु थ्रेडेड नेटवर्क लाइब्रेरी के साथ ओपनएसएसएल एकीकृत किया। हालांकि, हर जगह हम पढ़ते हैं, ओपनएसएसएल पेशेवर जोर देते हैं कि एक ही संदर्भ में एक ही संदर्भ में एकाधिक धागे द्वारा उपयोग नहीं किया जा सकता है।

+0

"तब उपयोग SSL_read और SSL_write के समवर्ती रूप से कोई नुकसान नहीं हुआ "- यदि यह सच है, तो आप किसी भी तरह भाग्यशाली हो गए हैं। आप बस एसएसएल * के उदाहरण पर आईओ ऑपरेशंस कर रहे कई थ्रेड नहीं कर सकते हैं। यह बिल्कुल भ्रष्ट होगा। यही कारण है कि boost :: asio :: ssl पर प्रलेखन की मांग है कि आप उन परिचालनों को एक स्ट्रैंड में लपेटें। –