我已尝试使用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和朋友之间的差距以及设置密码套装所需的低级别内容.如果您感兴趣,那么低级别的“最高级”是CFSocketStream.因此,工作是让NSURLConnection与CFSocketStream一起工作(或访问NSURLConnection中的CFSocketStream).
我还在Apple的Network Programming邮件列表上反映了你的问题,Jens和Quinn都证实了这一点(Quinn提供了有关CFSocketStream的信息).见Configure socket used by NSURLConnection?.
此外,如果您没有意识到,尝试修改-connection中的属性:didReceiveAuthenticationChallenge:为时已晚.当您获得身份验证质询时,握手已在进行中(即已发送ClientHello).
如果您确实设法找到了黑客,那么请发布它.