iOS 5:https(ASIHTTPRequest)停止工作

时间:2011-10-17 11:15:42

标签: objective-c ios5 https asihttprequest ssl

我有一个使用 ASIHTTPRequest 的应用。

使用iOS 5重新编译我的应用(sdk:5.0 / xcode:4.2 Build 4D199)并且 https连接失败并显示错误消息(同时禁用https的呼叫)工作正常):

Error Domain=ASIHTTPRequestErrorDomain Code=1 "A connection failure occurred" UserInfo=0xa8e66e0 {NSUnderlyingError=0xa8ac6c0 "The operation couldn’t be completed. (OSStatus error -9844.)", NSLocalizedDescription=A connection failure occurred}

启用调试日志:

[STATUS] Starting asynchronous request <ASIFormDataRequest: 0xd96fc00>

[CONNECTION] Request <ASIFormDataRequest: 0xd96fc00> will not use a persistent connection

[STATUS] Request <ASIFormDataRequest: 0xd96fc00>: Failed

[CONNECTION] Request #(null) failed and will invalidate connection #(null)

我找到了这个相关的帖子: https://devforums.apple.com/message/537440#537440 这可以解释我的问题。

基于iOS 5更喜欢TLS 1.2的想法,我尝试在AIHTTPRequest.m中更改设置kCFStreamSocketSecurityLevelTLSv1  

  NSDictionary *sslProperties = [[NSDictionary alloc] initWithObjectsAndKeys:
                                     [NSNumber numberWithBool:YES],
kCFStreamSSLAllowsExpiredCertificates,
                                     [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
                                     [NSNumber numberWithBool:NO],  kCFStreamSSLValidatesCertificateChain,
                                     kCFNull,kCFStreamSSLPeerName,
                                      kCFStreamSocketSecurityLevelTLSv1, kCFStreamSSLLevel,// my modif
                                     nil];

没有成功。也许我的修改不正确?

详细说明:

  • 我禁用了ARC
  • 我使用libz.1.2.5.dylib
  • 我在一周前更新了ASIHTTPRequest。

我不知道问题是证书故事(如TLS版本)还是别的。

欢迎任何帮助/想法!

5 个答案:

答案 0 :(得分:6)

在我们的设置中,插入

解决了问题
[sslProperties setObject:(NSString *)kCFStreamSocketSecurityLevelSSLv3 forKey:(NSString *)kCFStreamSSLLevel];

正好在

之上
CFReadStreamSetProperty((CFReadStreamRef)[self readStream], kCFStreamPropertySSLSettings, sslProperties);
处理SSL证书设置部分中的

修改 根据{{​​3}},以下内容应该更加健全

[sslProperties setObject:@"kCFStreamSocketSecurityLevelTLSv1_0SSLv3" forKey:(NSString *)kCFStreamSSLLevel];

答案 1 :(得分:6)

以下是最终解决方案:

https://developer.apple.com/library/ios/#technotes/tn2287/_index.html#//apple_ref/doc/uid/DTS40011309

        NSDictionary *sslProperties = [[NSDictionary alloc] initWithObjectsAndKeys:
                                       [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
                                       [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
                                       [NSNumber numberWithBool:NO],  kCFStreamSSLValidatesCertificateChain,
                                       kCFNull,kCFStreamSSLPeerName,
                                       @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel,
                                       nil];

添加此参数:

                                       @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel,

答案 2 :(得分:5)

看起来ASIHTTPRequest被放弃了。 并且当前版本在iOS 5中出现问题。

http://groups.google.com/group/asihttprequest/browse_thread/thread/7731197dbe71c260

他们建议搬到NSURLConnection。

答案 3 :(得分:1)

这些是我会尝试的事情:

  1. 下载asihttprequest的全新副本,将其放入一个新创建的非常简单的应用程序中,该应用程序只生成单个http并查看其行为是否相同
  2. 尝试对抗其他https服务器,看看你是否有同样的行为(尝试使用一些大名鼎鼎的行为,例如https://twitter.com - linkedin,google等,所有这些都有https版本)
  3. 在Safari中尝试使用相同的服务器(仍在iOS设备上)
  4. 对于它的价值,我在iOS5上的ASIHTTPRequest与我的客户的https服务器一起工作正常 - 我没有必要对iOS5进行任何更改。

答案 4 :(得分:1)

尝试使用kCFStreamSocketSecurityLevelSSLv3而不是TLSv1。当我遇到类似情况时,这对我有用。我不确定为什么自动协商没有回到正确的协议,但至少在某些服务器上,它似乎在ASIHttpRequest下失败,它可以与NSURLConnection一起使用。