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 暗号化ストリームの新しいセットを一連の入出力プレーンテキスト ストリームの上に重ねる方法に関するドキュメントが見つかりません。