【问题标题】:How does one set SSL ciphers when using CFSocket/CFStream in Cocoa?在 Cocoa 中使用 CFSocket/CFStream 时如何设置 SSL 密码?
【发布时间】:2010-12-29 14:59:20
【问题描述】:

我最近需要配置CocoaHttpServer,我们在我们的应用程序中成功使用了它,以处理来自客户端应用程序(在 Android 设备上运行)的 HTTPS 连接。这很好 - 有大量的示例代码可以做到这一点,而且我们能够毫无问题地启用安全服务器。

在实践中,当客户端与我们的服务器进行握手时,我们发现 SSL 协商阶段非常长 - 超过 70 秒。

通过一连串的搜索,我发现延迟是因为在CFSocket中启用SSL时默认使用的Diffie-Hellman参数的计算。 thread 是我第一次开始寻找问题答案的地方。

为了匹配我们的 Windows 服务器正在执行的操作(使用安全性较低的 SSL 密码),我需要在 Mac 上明确设置密码,这在使用 AsyncSocket 作为套接字通信的包装器时并不容易。

我们的 Windows 服务器正在使用: TLS_RSA_WITH_RC4_128_MD5 )(0x04) RC4 128 位 MD5 RSA

我们的 Macintosh 服务器正在使用: TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x039) 使用 RSA 证书的 AES 256 位 SHA-1 临时 Diffie-Hellman 密钥交换

“安全性”差异很大,但可能不值得我们看到的努力/计算/延迟。安全剧院?

【问题讨论】:

  • 为您的努力以及“安全剧院?”这个短语的工作而加一分。进入你的帖子:-)
  • 这很有用,但您应该拆分答案并将其作为该问题的答案发布,因此这不会永远存在于“未回答”页面上。 (回答您自己的问题完全符合犹太教规。)

标签: objective-c sockets ssl encryption https


【解决方案1】:

请注意,可以选择不同的密码 - 为了保持一致性,我选择使用与我们的 Windows 实现相同的密码。

根据上面提到的another question 的信息,我想出了如何设置 CFSocket 的密码以使用与 Windows 相同的密码,并且代码现在看起来好多了——就像它真的有效一样! CFSocket 没有直接公开 SecureTransport 支持,这使得这种方式变得困难,但定义一个特定的密钥可以让它很好地工作。

为了后代,这是我在 HTTPConnection 类中添加到 -onSocketWillConnect: 的代码:

// define this value; it isn't exposed by CFSocketStream.h
const extern CFStringRef kCFStreamPropertySocketSSLContext;

...

CFReadStreamRef stream = [sock getCFReadStream];
CFDataRef data = (CFDataRef) CFReadStreamCopyProperty(stream, kCFStreamPropertySocketSSLContext);

// Extract the SSLContextRef from the CFData
SSLContextRef sslContext;
CFDataGetBytes(data, CFRangeMake(0, sizeof(SSLContextRef)), (UInt8*)&sslContext);
SSLCipherSuite *ciphers = (SSLCipherSuite *)malloc(1 * sizeof(SSLCipherSuite));
ciphers[0] = SSL_RSA_WITH_RC4_128_MD5; // Basic cipher - not Diffie-Hellman
SSLSetEnabledCiphers(sslContext, ciphers, 1);

我希望这可以帮助任何与我解决相同问题的人 - 如果需要,我很乐意分享更多代码和建议。

【讨论】:

  • 我想联系 Brian Criscuolo,但从 StackOverflow 看不到这样做的方法。我有一个关于为我的服务器启用此功能的问题。问题是,我使用的是带有 runloop 的 CFSocketRef,而不是 CFReadStreamRefs,所以不知道如何让我的服务器支持 HTTPS……你提到了示例代码,但我找不到那个?
【解决方案2】:

对于它的价值,我在您遇到此问题前一周向 CocoaAsyncSocket 贡献了 patch。对不起,我当时没有注意到你的问题。 :-)

【讨论】:

    猜你喜欢
    • 2018-09-21
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2018-08-24
    • 2020-05-13
    • 2023-03-19
    相关资源
    最近更新 更多