作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想实现 STARTTLS在 iOS 应用程序中,但我无法从文档中弄清楚如何去做。
到目前为止我有:
我使用 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 来实现 STARTTLS应用程序接口(interface)。有 CFStreamCreatePairWithSocket这允许您连接自己的套接字,然后将 TLS 应用到它,但是没有办法让库根据证书主机名验证远程主机名。
唯一的方法似乎是使用这个低得多的库:Secure Transport Reference .
关于ios - 如何在 iOS 上实现 STARTTLS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31260769/
我是一名优秀的程序员,十分优秀!