質問

私はiphoneにNSStreamのSSL機能を使用するアプリケーションを書いています。私は私が直接SSLを使用してサーバーに接続することができますので、SSLが機能していることを知っている。
私はSTARTTLSを使用するプロトコルは、無担保でソケット上で通信STARTTLSコマンドを送信して、SSLのために同じソケットを再利用するために私を必要とする問題が発生しています。私の知る限りnsstream接続を知っているとして再利用することはできないと私は、接続を開いた後、私は彼らにSSLを起動することはできません。

私は、私自身のソケットを作成し、手動で上で通信して、既存のソケットを使用してNSstreamを設定し、そのようにSSLを開始について考えました。しかし、ソケット上の通信は、私はそれにSSLを開始カント状態でそれを配置表示されます。エラーでnsstream結果を得るためのソケットを使用しようとします。

任意の考え?

役に立ちましたか?

解決

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

 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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top