8

iphoneでNSStreamのSSL機能を利用するアプリケーションを書いています。SSLを使用してサーバーに直接接続できるため、SSLが機能していることはわかっています。
starttls を使用するプロトコルでは、セキュアでないソケットで通信し、starttls コマンドを送信してから、SSL 用に同じソケットを再利用する必要があるという問題が発生しました。私が知る限り、nsstream 接続は再利用できず、接続を開いた後にそれらで SSL を開始できません。

独自のソケットを作成し、手動で通信し、既存のソケットを使用して NSstream をセットアップし、その方法で SSL を開始することを考えました。ただし、ソケットでの通信により、SSLを開始できない状態になっているようです。nsstream にソケットを使用しようとすると、エラーが発生します。

何かご意見は?

4

1 に答える 1

7

これが正しい方法です。これを行う(ソケット接続後にプロパティを設定する)ことは文書化されていませんが、これはMonal xmppクライアントから直接コードであり、Appleはアプリストアで問題を与えたことはありません.

 NSInputStream *iStream;
NSOutputStream *oStream;


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


[iStream open];
    [oStream open];

接続が開かれ、NSStreamEventOpenCompleted が取得され、startTLS コマンドがクライアントからホストに送信されると、次のようになります。

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);
于 2011-06-06T04:34:31.503 に答える