【问题标题】:How can I implement STARTTLS on iOS?如何在 iOS 上实现 STARTTLS?
【发布时间】: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 ];

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

You must set the property before you open the stream.

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

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

【问题讨论】:

  • 只是出于好奇,它是用于您自己的协议,还是一些成熟的协议,如 SMTP、IMAP、...?
  • @Bruno,它用于 IMAP。

标签: ios objective-c ssl starttls


【解决方案1】:

我找不到使用高级CFStream API 实现STARTTLS 的任何方法。 CFStreamCreatePairWithSocket 允许您连接自己的套接字,然后对其应用 TLS,但无法让库根据证书主机名验证远程主机名。

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

【讨论】:

    猜你喜欢
    • 2016-01-03
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多