2012-11-23 34 views
6

http bağlantıları yapmak için CFStream/NSStream kullanıyorum.SSL el sıkışması için CFStream (veya NSStream) nasıl yapılandırılır?

  • durum A:: Sunucu
  • durumda B güvenilmiyor: Bir SSL anlaşması üç durum için başarısız olduğunu tespit edebilmek için istediğiniz sunucu güvenilen ancak bir istemci sertifikası
  • vaka C sorar: sunucu güvenilmiyor ve bu benim CFStream SSL Özelliklerine anithing yapmadan

Bugün bir istemci sertifikası sorar, alıyorum:

  • durum A: Hata -9807
  • durumda B: hiçbir hata ancak sunucu bağlantısını reddediyor (hata 500)
  • vaka C: Hata 9807

doğru bu ayırt etmek CFStream yapılandırmak için bir yolu var mı 3 olgu? Veya SSL el sıkışma sırasında bazı geri dönüşler var mı? Yardımlarınız için

teşekkürler.

cevap

4

Bir süre önce SSL kullanarak CFSockets ile aynı şeyi içinde kaçtılar. CFStream tüm el sıkışması işlerini halleder. NSStream için küçük bir sınıf ek yazdım (Base kodu Apple'dan geliyor, artık bağlantı yok, eğer bulursam onu ​​ekleyeceğim). Bu benim için çalıştı.

Arayüz

@interface NSStream (FSNetworkAdditions) 

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

@end 

Ve Uygulama Böyle bir sunucuya bağlanabilir değil bu kadar

#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 

: "öz" NSStreamDelegate Protokolüne uygun

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

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

.

Bunları parçacıkları yardımcı olur.

+1

İşte Arndt başvurduğu Elma docs bağlantısı şudur: https://developer.apple.com/library/ios/qa/qa1652/_index.html – Fletch