【问题标题】:Using SSLSetEnabledCiphers with AFNetworking to disable weak ciphers使用 SSLSetEnabledCiphers 和 AFNetworking 来禁用弱密码
【发布时间】:2014-07-28 19:12:08
【问题描述】:

我正在尝试禁用一些密码(弱),例如单 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。

【问题讨论】:

  • 另见Securing iOS Applications。看起来很有趣。
  • 您好,感谢您的回复,我认为它们是不同级别的 Api,希望在某处可能有一座桥梁。我已经浏览了视频,但我希望能找到示例代码。有没有其他方法可以禁用密码?
  • 我正在尝试做同样的事情。到目前为止,我已经找到了一种方法来做到这一点twitter.com/abelenko/status/437266477436002304gist.github.com/belenko/d9c29ffbf2dca8a3dd0c,但这是使用私有 API,正如 cmets 中所说的那样,它会导致 App Store 中的应用被拒绝。

标签: ios iphone ssl afnetworking cfnetwork


【解决方案1】:

使用 SSLSetEnabledCiphers 和 AFNetworking 来禁用弱密码

好的,这个引起了我的兴趣,因为它是我用其他语言做的,但不是 Cocoa/CocoaTouch。它在我的 TODO 清单上已经有一段时间了。答案是当使用像 NSURLConnection 这样的高级对象时你不能这样做。

我可以找到一种方法来弥合NSURLConnection 和朋友之间的差距以及设置密码套装所需的低级内容。如果您有兴趣,低级别的“最高”是CFSocketStream。所以工作是让NSURLConnectionCFSocketStream 一起工作(或访问NSURLConnection 中的CFSocketStream)。

我还在 Apple 的Network Programming 邮件列表中反映了您的问题,Jens 和 Quinn 都确认了这一点(Quinn 在CFSocketStream 上提供了信息)。见Configure socket used by NSURLConnection?

另外,如果您没有意识到,尝试修改-connection:didReceiveAuthenticationChallenge: 中的属性为时已晚。当您收到身份验证质询时,握手已经在进行中(即,ClientHello 已经发送)。

如果您确实设法找到了破解方法,请发布。

【讨论】:

  • 我在互联网上找到了一个 hack 来实现这一点。请参阅我对 OP 问题的评论。我还在邮件列表中阅读了您的问题。非常不幸的是,如果我们无法访问底层套接字,则没有 API 可以指示 NSURLConnection 使用特定的密码套件或至少最低 SSL/TLS 协议版本。 :(
猜你喜欢
  • 2017-04-02
  • 1970-01-01
  • 2016-04-22
  • 2012-12-05
  • 1970-01-01
  • 2020-06-30
  • 2018-08-24
  • 2022-01-03
  • 1970-01-01
相关资源
最近更新 更多