gpt4 book ai didi

ios - 如何在 iOS 上实现 STARTTLS?

转载 作者:行者123 更新时间:2023-11-29 12:18:52 26 4
gpt4 key购买 nike

我想实现 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 ];

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

You must set the property before you open the stream.

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

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

最佳答案

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

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

关于ios - 如何在 iOS 上实现 STARTTLS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31260769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com