【发布时间】:2015-07-07 05:53:26
【问题描述】:
我想在 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's documentation 执行此操作:
[ reader setProperty:NSStreamSocketSecurityLevelNegotiatedSSL forKey:NSStreamSocketSecurityLevelKey ];
[ writer setProperty:NSStreamSocketSecurityLevelNegotiatedSSL forKey:NSStreamSocketSecurityLevelKey ];
但这似乎没有任何作用。我对它不起作用并不感到惊讶,因为文档说得很清楚:
当然,在这种情况下,流必须已经打开,因为它用于进行明文 STARTTLS 协商!
我找不到任何文档说明如何将套接字从纯文本升级到 SSL,或者如何在一组输入和输出纯文本流之上分层一组新的 SSL 加密流。
【问题讨论】:
-
只是出于好奇,它是用于您自己的协议,还是一些成熟的协议,如 SMTP、IMAP、...?
-
@Bruno,它用于 IMAP。
标签: ios objective-c ssl starttls