如何在 iOS 上实施 STARTTLS?

How can I implement STARTTLS on iOS?

我想在 iOS 应用程序中实现 STARTTLS,但我无法从文档中找出如何实现它。

到目前为止我有:

现在是时候将套接字形式的明文升级到 TLS 了。 接下来我该做什么?

我想我应该按照 Apple's documentation:

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

但这似乎没有任何作用。我对它不起作用并不感到惊讶,因为文档说得很清楚:

You must set the property before you open the stream.

当然,在这种情况下流必须已经打开,因为它用于进行明文 STARTTLS 协商!

我找不到任何关于如何将套接字从纯文本升级到 SSL 或者如何在一组输入和输出纯文本流之上分层一组新的 SSL 加密流的文档。

我找不到任何使用高级 CFStream API. There is CFStreamCreatePairWithSocket 实现 STARTTLS 的方法,它允许您连接自己的套接字,然后将 TLS 应用到它,但是没有办法让库到根据证书主机名验证远程主机名。

唯一的方法似乎是使用这个低得多的库:Secure Transport Reference