如何在 iOS 上实施 STARTTLS?
How can I implement STARTTLS on iOS?
我想在 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 加密流的文档。
我找不到任何使用高级 CFStream API. There is CFStreamCreatePairWithSocket 实现 STARTTLS 的方法,它允许您连接自己的套接字,然后将 TLS 应用到它,但是没有办法让库到根据证书主机名验证远程主机名。
唯一的方法似乎是使用这个低得多的库:Secure Transport Reference。
我想在 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 加密流的文档。
我找不到任何使用高级 CFStream API. There is CFStreamCreatePairWithSocket 实现 STARTTLS 的方法,它允许您连接自己的套接字,然后将 TLS 应用到它,但是没有办法让库到根据证书主机名验证远程主机名。
唯一的方法似乎是使用这个低得多的库:Secure Transport Reference。