2012-11-23 8 views
6

मैं http कनेक्शन बनाने के लिए CFStream/NSStream का उपयोग कर रहा हूं।SSL हैंडशेक के लिए CFStream (या NSStream) को कॉन्फ़िगर कैसे करें?

  • मामले एक:: सर्वर विश्वसनीय नहीं है
  • मामले बी: मैं पता लगाने के लिए कि एक एसएसएल हाथ मिलाना तीन मामलों के लिए विफल रहता है सक्षम होना चाहते हैं सर्वर पर भरोसा किया है, लेकिन एक क्लाइंट प्रमाणपत्र
  • मामले सी पूछते हैं: सर्वर विश्वसनीय नहीं है और उस पर मेरी CFStream की एसएसएल गुण anithing कर बिना

आज क्लाइंट प्रमाणपत्र पूछता है, मैं:

  • मामले एक: त्रुटि -9807
  • मामले बी: कोई त्रुटि लेकिन सर्वर ने कनेक्शन मना कर दिया (त्रुटि 500)
  • मामले सी: त्रुटि 9807

वहाँ CFStream कॉन्फ़िगर करने के लिए सही ढंग से इन भेद करने के लिए एक रास्ता है 3 मामले? या एसएसएल हैंडशेक के दौरान कुछ कॉलबैक करने के लिए?

आपकी मदद के लिए धन्यवाद।

उत्तर

4

कुछ समय पहले मैं एसएसएल का उपयोग कर सीएफएसकेकेट के साथ एक ही चीज़ में भाग गया था। सीएफस्ट्रीम सभी हैंडशेक सामान संभालती है। मैंने एनएसएसटीम के लिए एक छोटे से वर्ग के अलावा लिखा (बेस कोड ऐप्पल से आता है, अब लिंक नहीं है, अगर मुझे लगता है कि मैं इसे जोड़ दूंगा)। यही मेरे लिए काम किया है।

इंटरफ़ेस

@interface NSStream (FSNetworkAdditions) 

+ (void)qNetworkAdditions_getStreamsToHostNamed:(NSString *)hostName 
              port:(NSInteger)port 
            inputStream:(out NSInputStream **)inputStreamPtr 
            outputStream:(out NSOutputStream **)outputStreamPtr; 

@end 

और कार्यान्वयन

#import "FSNetworkAdditions.h" 

@implementation NSStream (FSNetworkAdditions) 

+ (void)qNetworkAdditions_getStreamsToHostNamed:(NSString *)hostName 
              port:(NSInteger)port 
            inputStream:(out NSInputStream **)inputStreamPtr 
            outputStream:(out NSOutputStream **)outputStreamPtr 
{ 
    CFReadStreamRef  readStream; 
    CFWriteStreamRef writeStream; 

    assert(hostName != nil); 
    assert((port > 0) && (port < 65536)); 
    assert((inputStreamPtr != NULL) || (outputStreamPtr != NULL)); 

    readStream = NULL; 
    writeStream = NULL; 

    CFStreamCreatePairWithSocketToHost(
             NULL, 
             (CFStringRef) hostName, 
             port, 
             ((inputStreamPtr != NULL) ? &readStream : NULL), 
             ((outputStreamPtr != NULL) ? &writeStream : NULL) 
             ); 

    NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys: 
           [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates, 
           [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot, 
           [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredRoots, 
           [NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain, 
           //kCFNull,kCFStreamSSLPeerName, 
           kCFStreamSocketSecurityLevelSSLv3, kCFStreamSSLLevel, 
           [NSNumber numberWithBool:YES], kCFStreamPropertyShouldCloseNativeSocket, 
           nil]; 

    if (readStream) { 
     CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings); 
    } 

    if (writeStream) { 
     CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings); 
    } 

    if (inputStreamPtr != NULL) { 
     *inputStreamPtr = CFBridgingRelease(readStream); 
    } 
    if (outputStreamPtr != NULL) { 
     *outputStreamPtr = CFBridgingRelease(writeStream); 
    } 


} 

@end 

आप इस तरह एक सर्वर से कनेक्ट नहीं कर सकते यह है कि:

NSInputStream *inputStream; 
NSOutputStream *outputStream; 
[NSStream qNetworkAdditions_getStreamsToHostNamed:host 
              port:port 
             inputStream:&inputStream 
            outputStream:&outputStream]; 

     inputStream.delegate = self; 
     outputStream.delegate = self; 

कहाँ "स्व" NSStreamDelegate प्रोटोकॉल के अनुरूप है।

मुझे आशा है कि ये स्निपेट मदद करता है।

+1

यहां ऐप्पल दस्तावेज़ों का लिंक दिया गया है, जिसमें Arndt संदर्भित करता है: https://developer.apple.com/library/ios/qa/qa1652/_index.html – Fletch

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