2009-12-23 3 views
8

मुझे हाल ही में CocoaHttpServer को कॉन्फ़िगर करने की आवश्यकता है, जिसे हम क्लाइंट एप्लिकेशन (एंड्रॉइड डिवाइस पर चल रहे HTTPS कनेक्शन) से आने वाले HTTPS कनेक्शन को संभालने के लिए सफलतापूर्वक हमारे एप्लिकेशन में उपयोग कर रहे हैं। यह ठीक है - इसमें बहुत ही नमूना कोड है जो इसके लिए अनुमति देता है, और हम बिना किसी समस्या के सुरक्षित सर्वर को सक्षम करने में सक्षम थे।कोको में सीएफएसओकेट/सीएफस्ट्रीम का उपयोग करते समय एसएसएल सिफर कैसे सेट करता है?

व्यवहार में हम अविश्वसनीय रूप से लंबे समय से एसएसएल बातचीत चरणों को देख रहे थे, जबकि ग्राहक हमारे सर्वर के साथ अपने हेन्डशेकिंग कर रहा था - 70 सेकंड के ऊपर।

खोजों की एक लंबी श्रृंखला के माध्यम से, मैंने पाया कि देरी डिफ़ॉल्ट रूप से उपयोग Diffie-Hellman मापदंडों की गणना की वजह से था जब एसएसएल CFSocket में सक्षम है। यह thread वह जगह है जहां मैंने पहली बार अपनी समस्या का उत्तर खोजना शुरू कर दिया था।

हमारे विंडोज सर्वर क्या कर रहा था (एक कम सुरक्षित एसएसएल सिफर का उपयोग करके) मुझे मिलान करने के लिए मैक पर स्पष्ट रूप से सिफर सेट करने की आवश्यकता है, जो सॉकेट संचार के लिए एक रैपर के रूप में AsyncSocket का उपयोग करते समय आसान नहीं है।

हमारे विंडोज सर्वर का उपयोग किया गया था: TLS_RSA_WITH_RC4_128_MD5) (0x04) RC4 128 बिट MD5 आरएसए

हमारे Macintosh सर्वर उपयोग कर रहा था: TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x039) एईएस 256 बिट SHA-1 अल्पकालिक Diffie-Hellman कुंजी विनिमय आरएसए प्रमाणपत्र

"सुरक्षा" में अंतर बड़ा है, लेकिन संभवतः हम प्रयास/गणना/देरी के लायक नहीं हैं जो हम देख रहे थे। सुरक्षा रंगमंच?

+0

आपके प्रयासों के लिए एक +1, और "सुरक्षा रंगमंच" वाक्यांश का काम करने के लिए? आपकी पोस्ट में :-) –

+1

यह उपयोगी है, लेकिन आपको जवाब को विभाजित करना चाहिए और इसे इस प्रश्न के उत्तर के रूप में पोस्ट करना चाहिए, इसलिए यह अनुत्तरित पृष्ठ पर हमेशा के लिए नहीं रहता है। (यह आपके अपने प्रश्न का उत्तर देने के लिए पूरी तरह से कोशेर है।) – benzado

उत्तर

4

कृपया ध्यान दें विभिन्न सिफर कि चुना जा सकता है देखते हैं कि - मैं स्थिरता के लिए हमारे विंडोज कार्यान्वयन के रूप में ही उपयोग करने के लिए चुना है।

ऊपर उल्लेख किया another question से जानकारी के साथ

, मैं पता लगा CFSocket विंडोज के रूप में ही उपयोग करने के लिए के लिए सिफर सेट करने का तरीका है, और कोड अब काफ़ी बेहतर प्रतीत होता है - जैसे कि यह वास्तव में काम करता है! सीएफएसओकेट सीधे सिक्योरट्रांसपोर्ट समर्थन का खुलासा नहीं कर रहा है, जो इस तरह की कड़ी मेहनत करता है, लेकिन किसी विशेष कुंजी को परिभाषित करने से यह अच्छी तरह से काम करता है।

भावी पीढ़ी के लिए, यहाँ कोड मैं -onSocketWillConnect को जोड़ा गया है: हमारे HTTPConnection कक्षा में:

// define this value; it isn't exposed by CFSocketStream.h 
const extern CFStringRef kCFStreamPropertySocketSSLContext; 

...

CFReadStreamRef stream = [sock getCFReadStream]; 
CFDataRef data = (CFDataRef) CFReadStreamCopyProperty(stream, kCFStreamPropertySocketSSLContext); 

// Extract the SSLContextRef from the CFData 
SSLContextRef sslContext; 
CFDataGetBytes(data, CFRangeMake(0, sizeof(SSLContextRef)), (UInt8*)&sslContext); 
SSLCipherSuite *ciphers = (SSLCipherSuite *)malloc(1 * sizeof(SSLCipherSuite)); 
ciphers[0] = SSL_RSA_WITH_RC4_128_MD5; // Basic cipher - not Diffie-Hellman 
SSLSetEnabledCiphers(sslContext, ciphers, 1); 

मुझे आशा है कि यह एक ही मुद्दे के माध्यम से काम किसी को भी मदद करता है जैसा कि - यदि आवश्यक हो तो मुझे कुछ और कोड और सलाह साझा करने में खुशी होगी।

0

क्या इसके लायक है के लिए, मैं इससे पहले कि आप इस मुद्दे था एक सप्ताह के बारे में CocoaAsyncSocket करने के लिए एक patch योगदान दिया। क्षमा करें कि मैंने आपके प्रश्न को तब वापस नहीं देखा था। :-)

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

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