我正在尝试禁用某些密码(弱),例如单个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版。
答案 0 :(得分:3)
好的,这个引起了我的兴趣,因为它是我用其他语言做的,但不是Cocoa / CocoaTouch。它已经在我的TODO列表上了一段时间。答案是,在使用将SSLSetEnabledCiphers与AFNetworking一起使用以禁用弱密码
NSURLConnection
等高级对象时,你无法做到这一点。
我可以不找到一种方法来弥合NSURLConnection
和朋友之间的差距以及设置密码套装所需的低级别内容。如果您感兴趣,那么低级别内容的“最高”是CFSocketStream
。因此,我们的工作是NSURLConnection
使用CFSocketStream
(或访问CFSocketStream
中的NSURLConnection
)。
我还在Apple的Network Programming邮件列表上反映了您的问题,Jens和Quinn都证实了这一点(Quinn在CFSocketStream
提供了信息)。请参阅Configure socket used by NSURLConnection?。
另外,如果您没有意识到这一点,尝试修改-connection:didReceiveAuthenticationChallenge:
中的属性为时已晚。当您收到身份验证质询时,握手已在进行中(即ClientHello
已经发送)。
如果您确实设法找到了黑客,那么请发布它。