2012-11-23 3 views
6

私はCFStream/NSStreamを使ってHTTP接続を行っています。 私はSSLハンドシェイクが3例のために失敗したことを検出することができるようにしたい:SSLハンドシェイクのためのCFStream(またはNSStream)の設定方法は?

  • ケースA:サーバは
  • ケースB信頼されていない:サーバーが信頼されているのが、クライアント証明書
  • ケースCを求められます。サーバが信頼されていないと、それは私のCFStreamのSSLプロパティにanithingを行わず

今日のクライアント証明書を要求し、私が取得:

  • ケースA:エラー-9807
  • ケースB:エラーが、サーバーが接続を拒否(エラー500)
  • ケースC:エラー9807

が正しくこれらを区別するためにCFStreamを設定する方法はありません3例?あるいは、SSLハンドシェイク中に何らかのコールバックを持つことができますか?

ありがとうございました。

答えて

4

私はSSLを使ってCFSocketと同じことをやっていました。 CFStreamはすべてのハンドシェイクを処理します。私はNSStreamのための少しクラスの追加を書いた(ベースコードはAppleから来て、私がそれを追加する場合は、もはやリンクを持っていない)それが私のために働いたのです。あなたはこのようなサーバーに接続することができ、それはありません

インタフェース

@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が参照するAppleドキュメントへのリンクがあります。https://developer.apple.com/library/ios/qa/qa1652/_index.html – Fletch

関連する問題