2012-11-23 8 views
6

Ich benutze CFStream/NStream, um HTTP-Verbindungen herzustellen. Ich möchte feststellen können, dass ein SSL-Handshake für drei Fälle fehlschlägt:Wie wird CFStream (oder NS Stream) für SSL-Handshake konfiguriert?

  • Fall A: Server nicht
  • Fall B vertraut: Server vertrauenswürdig ist, sondern fragt ein Client-Zertifikat
  • Fall C: Server nicht vertrauenswürdig ist und es fragt ein Client-Zertifikat

heute ohne anithing auf den SSL-Eigenschaften meiner CFStream zu tun, erhalte ich:

    Ein
  • Fall: Fehler -9807
  • Fall B: kein Fehler, sondern Server verweigert die Verbindung (Fehler 500)
  • Fall C: Fehler 9807

Gibt es eine Möglichkeit CFStream zu konfigurieren diese korrekt zu unterscheiden 3 Fälle? Oder einige Rückrufe während des SSL-Handshakes zu haben?

Danke für Ihre Hilfe.

Antwort

4

Vor einiger Zeit lief ich in einer Sache mit CFSockets mit SSL. CFStream kümmert sich um den gesamten Handshake-Kram. Ich habe einen kleinen Klassenzusatz für NStream geschrieben (Basiscode kommt von Apple, habe den Link nicht mehr, wenn ich ihn finde, füge ich ihn hinzu). Das hat bei mir funktioniert.

Schnittstelle

@interface NSStream (FSNetworkAdditions) 

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

@end 

und Umsetzung

#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 

, dass es nicht zu einem Server wie folgt verbinden:

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

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

Wo "Selbst" entspricht dem NSStreamDelegate Protokoll.

Ich hoffe, diese Schnipsel hilft.

+1

Hier ist der Link zu den Apple-Dokumenten, auf die sich Arndt bezieht: https://developer.apple.com/library/ios/qa/qa1652/_index.html – Fletch

Verwandte Themen