2010-02-10 14 views
8

पर एनएसएसटीम एसएसएल मैं एक एप्लीकेशन लिख रहा हूं जो आईएसएस पर एनएसएसटीम के एसएसएल कार्यों का उपयोग करता है। मुझे पता है कि एसएसएल काम कर रहा है क्योंकि मैं सीधे एसएसएल का उपयोग कर सर्वर कनेक्ट कर सकता हूं।
मुझे एक समस्या आई है जहां स्टार्ट्स का उपयोग करने वाले प्रोटोकॉल मुझे असुरक्षित के साथ सॉकेट पर संवाद करने की आवश्यकता है, starttls कमांड भेजें और फिर SSL के लिए उसी सॉकेट का पुन: उपयोग करें। जहां तक ​​मुझे पता है कि एनएसस्ट्रीम कनेक्शन का पुन: उपयोग नहीं किया जा सकता है और कनेक्शन खोलने के बाद मैं उन पर एसएसएल शुरू नहीं कर सकता।प्रयुक्त सॉकेट

मैंने अपनी खुद की सॉकेट बनाने, मैन्युअल रूप से संचार करने और फिर मौजूदा सॉकेट का उपयोग करके एनएसस्ट्रीम स्थापित करने और इस तरह से एसएसएल शुरू करने के बारे में सोचा। हालांकि, ऐसा लगता है कि सॉकेट पर संचार करने से यह उस स्थिति में रहता है जहां मैं एसएसएल शुरू नहीं कर सकता। त्रुटि में nsstream परिणामों के लिए सॉकेट का उपयोग करने का कोई भी प्रयास।

कोई विचार?

+0

आप setProperty कॉल करने की कोशिश है उचित सुरक्षा स्थिरांक साथ पहले से ही खुले NSSocket पर? मेरा मानना ​​है कि अंतर्निहित सिक्योर ट्रांसपोर्ट कोड एक अनएन्क्रिप्टेड प्रारंभिक कनेक्शन से टीएलएस/एसएसएल में स्विच करने का समर्थन करता है। –

+0

तो मैंने इसे समझ लिया। आपको सीएफएसकेट्स का उपयोग करना चाहिए, न कि एनएसस्केट्स और फिर कनेक्शन के बाद एसएसएल लागू करें, भले ही प्रलेखन कहता है कि आप ऐसा नहीं कर सकते हैं, यह सही ढंग से एक सुरक्षित कनेक्शन पर बातचीत करेगा। – anurodhp

+0

"NSsockets" जैसी कोई चीज़ नहीं है – user102008

उत्तर

7

ऐसा करने का यह सही तरीका है। ऐसा करने के दौरान (सॉकेट कनेक्शन के बाद संपत्ति को सेट करना) अनियंत्रित है, यह सीधे मेरे मोनल xmpp क्लाइंट से कोड है और सेब ने मुझे ऐप स्टोर में कभी भी कोई समस्या नहीं दी है।

NSInputStream *iStream; 
NSOutputStream *oStream; 


CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)server, port, &iStream, &oStream); 


[iStream open]; 
    [oStream open]; 

कनेक्शन खोल दिया गया है और आप NSStreamEventOpenCompleted हो और STARTTLS ग्राहक से की मेजबानी के लिए भेज दिया गया है आदेश: forKey:

NSDictionary *settings = [ [NSDictionary alloc ] 
            initWithObjectsAndKeys: 
            [NSNumber numberWithBool:YES], @"kCFStreamSSLAllowsExpiredCertificates", 
            [NSNumber numberWithBool:YES], @"kCFStreamSSLAllowsExpiredRoots", 
            [NSNumber numberWithBool:YES], @"kCFStreamSSLAllowsAnyRoot", 
            [NSNumber numberWithBool:NO], @"kCFStreamSSLValidatesCertificateChain", 
            [NSNull null],@"kCFStreamSSLPeerName", 
            @"kCFStreamSocketSecurityLevelNegotiatedSSL", 
            @"kCFStreamSSLLevel", 
            nil ]; 
     CFReadStreamSetProperty((CFReadStreamRef)iStream, 
           @"kCFStreamPropertySSLSettings", (CFTypeRef)settings); 
     CFWriteStreamSetProperty((CFWriteStreamRef)oStream, 
           @"kCFStreamPropertySSLSettings", (CFTypeRef)settings); 
+2

शायद तारों में लपेटने के बजाय स्थिरांक का उपयोग करना बेहतर विचार है; स्थिरांक और तार इस मामले में एक ही परिणाम के लिए मूल्यांकन कर सकते हैं लेकिन यह हमेशा ऐसा नहीं होता है। तो, @ "केसीएफस्ट्रीमएसएसएलएलवेल" के बजाय केसीएफस्ट्रीमएसएसएलएलवेल। –

+0

मैं अपने आईओएस 7 ऐप में CFReadStreamSetProperty का उपयोग करने की कोशिश कर रहा हूं, लेकिन एक्सकोड 5.1.1 एमआईटी को बताता है कि "CFReadStreamSetProperty 'पर कॉल के लिए कोई मिलान करने वाला फ़ंक्शन नहीं है, हालांकि मेरे पास # आयात <कोरफाउंडेशन/कोरफाउंडेशन.h> # आयात < CoreFoundation/CFStream.h> और मैंने CFNetwork.framework और CoreFoundation.framework भी जोड़ा। किसी भी हिट को कैसे ठीक किया जाए? –

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