1

iOS アプリケーションにSTARTTLSを実装したいのですが、ドキュメントからその方法を理解するのに苦労しています。

これまでのところ、私は持っています:

  • でソケットを作成しCFStreamCreatePairWithSocketToHost、ストリームを開きます。

     CFStreamCreatePairWithSocketToHost(
             NULL, (__bridge CFStringRef)host, port,
             &read_stream, &write_stream
     );
    
     reader = objc_retainedObject(read_stream);
     [ reader setDelegate:self ];
     [ reader scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode ];
     [ reader open ];
    
     writer = objc_retainedObject(write_stream);
     [ writer setDelegate:self ];
     [ writer scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode ];
     [ writer open ];
    
  • ストリームでデータが利用可能になると、適切なコールバックが得られるため、接続が機能しています。

  • プレーン テキストでサーバーと正常にやり取りし、STARTTLS をネゴシエートします。

  • 最終的に、サーバーは STARTTLS のゴーアヘッドを送信します。

     . OK Begin TLS negotiation now.
    

ここで、ソケット形式の平文を TLS にアップグレードします。次に何をすればいいですか?

Appleのドキュメントに従ってこれを行うべきだと思いました:

[ reader setProperty:NSStreamSocketSecurityLevelNegotiatedSSL forKey:NSStreamSocketSecurityLevelKey ];
[ writer setProperty:NSStreamSocketSecurityLevelNegotiatedSSL forKey:NSStreamSocketSecurityLevelKey ];

しかし、それは何もしないようです。ドキュメントが非常に明確に述べているので、それが機能しないことに驚かない:

ストリームを開く前にプロパティを設定する必要があります。

もちろん、この場合、ストリームはプレーンテキストの STARTTLS ネゴシエーションを実行するために使用されるため、すでに開かれている必要があります。

ソケットをプレーンテキストから SSL にアップグレードする方法や、SSL 暗号化ストリームの新しいセットを一連の入出力プレーンテキスト ストリームの上に重ねる方法に関するドキュメントが見つかりません。

4

1 に答える 1