iOS 5:https(ASIHTTPRequest)停止工作

Lod*_*oda 9 ssl https objective-c asihttprequest ios5

我有一个使用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}
Run Code Online (Sandbox Code Playgroud)

启用调试日志:

[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)
Run Code Online (Sandbox Code Playgroud)

我找到了这个相关的帖子: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];
Run Code Online (Sandbox Code Playgroud)

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

细节:

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

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

欢迎任何帮助/想法!

wei*_*bel 6

在我们的设置上,问题是通过插入修复

[sslProperties setObject:(NSString *)kCFStreamSocketSecurityLevelSSLv3 forKey:(NSString *)kCFStreamSSLLevel];
Run Code Online (Sandbox Code Playgroud)

就在上面

CFReadStreamSetProperty((CFReadStreamRef)[self readStream], kCFStreamPropertySSLSettings, sslProperties);
Run Code Online (Sandbox Code Playgroud)

在Handle SSL证书设置部分.

编辑: 根据http://developer.apple.com/library/ios/#technotes/tn2287/_index.html#//apple_ref/doc/uid/DTS40011309,以下内容应该更加健壮

[sslProperties setObject:@"kCFStreamSocketSecurityLevelTLSv1_0SSLv3" forKey:(NSString *)kCFStreamSSLLevel];
Run Code Online (Sandbox Code Playgroud)


Val*_*imb 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];
Run Code Online (Sandbox Code Playgroud)

添加此参数:

                                       @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel,
Run Code Online (Sandbox Code Playgroud)


Chr*_*ist 5

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

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

他们建议搬到NSURLConnection.