我正在尝试禁用一些密码(弱),例如单个 DES、单个 DES 40 位等。
我试过使用 How does one set SSL ciphers when using CFSocket/CFStream in Cocoa? 中的这段代码并来自邮件列表消息 CFNetwork SSL and long blocking delays但我需要访问套接字数据才能获取 CFDataRef
。
这是我尝试在 AFURLConnectionOperation
类的握手方法中插入的代码:
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge (NSURLAuthenticationChallenge *)challenge{
CFReadStreamRef stream = [sock getCFReadStream];
CFDataRef data = CFReadStreamCopyProperty(stream, kCFStreamPropertySocketSSLContext);
// Extract the SSLContextRef from the CFData
SSLContextRef sslContext;
CFDataGetBytes(data, CFRangeMake(0, sizeof(SSLContextRef)), &sslContext);
// Get all enabled ciphers
size_t numCiphers;
SSLGetNumberEnabledCiphers(sslContext,&numCiphers);
SSLCipherSuite ciphers[numCiphers];
SSLGetEnabledCiphers(sslContext,ciphers,&numCiphers);
// Create a new cipher array with only non-DH ciphers, and set it
SSLCipherSuite finalCiphers[numCiphers];
int numFinalCiphers = 0;
for(int i=0; i<numCiphers; i++) {
SSLCipherSuite suite = ciphers[i];
if(!cipherSuiteUsesDH(suite)) {
finalCiphers[numFinalCiphers] = suite;
numFinalCiphers++;
}
}
SSLSetEnabledCiphers(sslContext,finalCiphers,numFinalCiphers);
}
任何和所有帮助将不胜感激。
编辑:不幸的是,这是一个现有项目,它仍然使用 AFNetworking 的版本 1。
最佳答案
Using SSLSetEnabledCiphers with AFNetworking to disable weak ciphers
好吧,这个引起了我的兴趣,因为它是我用其他语言做的事情,但不是 Cocoa/CocoaTouch。它在我的 TODO 列表中已经有一段时间了。答案是在使用像 NSURLConnection
这样的高级对象时你不能这样做。
我无法找到一种方法来弥合 NSURLConnection
和 friend 之间的差距以及设置密码套装所需的低级内容。如果您有兴趣,低级别的“最高”是 CFSocketStream
。因此,工作是让 NSURLConnection
与 CFSocketStream
一起工作(或访问 NSURLConnection
中的 CFSocketStream
)。
我也在 Apple 的 Network Programming 上反射(reflect)了你的问题。邮件列表,Jens 和 Quinn 都证实了这一点(Quinn 在 CFSocketStream
上提供了信息)。参见 Configure socket used by NSURLConnection? .
此外,如果您没有意识到,尝试修改 -connection:didReceiveAuthenticationChallenge:
中的属性为时已晚。当您收到身份验证质询时,握手已经在进行中(即 ClientHello
已经发送)。
如果您确实找到了破解方法,请发布。
关于ios - 将 SSLSetEnabledCiphers 与 AFNetworking 结合使用以禁用弱密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25002556/