我有一个使用 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];
没有成功。也许我的修改不正确?
详细说明:
我不知道问题是证书故事(如TLS版本)还是别的。
欢迎任何帮助/想法!
答案 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)
以下是最终解决方案:
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)
这些是我会尝试的事情:
对于它的价值,我在iOS5上的ASIHTTPRequest与我的客户的https服务器一起工作正常 - 我没有必要对iOS5进行任何更改。
答案 4 :(得分:1)
尝试使用kCFStreamSocketSecurityLevelSSLv3而不是TLSv1。当我遇到类似情况时,这对我有用。我不确定为什么自动协商没有回到正确的协议,但至少在某些服务器上,它似乎在ASIHttpRequest下失败,它可以与NSURLConnection一起使用。