gpt4 book ai didi

objective-c - 在 Cocoa 中使用 CFSocket/CFStream 时如何设置 SSL 密码?

转载 作者:太空狗 更新时间:2023-10-30 03:33:34 26 4
gpt4 key购买 nike

我最近需要配置 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 key 交换

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

最佳答案

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

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

为了后代,这里是我在我们的 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);

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

关于objective-c - 在 Cocoa 中使用 CFSocket/CFStream 时如何设置 SSL 密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1954971/

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