今天总结一下纠结了我近一个星期的问题,asihttprequest连接https,正常是有2种思路。
1、忽略证书验证连接https;
2、带着证书请求https。(但是鉴于具有有效期,证书失效就得重新设置,前后端都得改代码,对于一个企业级的内部应用来说,个人觉得不太适合。)
具体说说第1种思路,网上找了很多,大多数都是直接来了2句代码:
[request setAuthenticationScheme:@"https"];
[request setValidatesSecureCertificate:NO];
也许有的asihttprequest框架是可以行得通的,可是我没成功过。说说我的解决方(ASIHTTPRequest.m必须是开发的)
1)在ASIHTTPRequest.m中找到NSMutableDictionary*类型的sslProperties变量,添加一个键值对到该变量。
将if (![self validatesSecureCertificate]) {
[sslProperties setObject:(NSString *)kCFBooleanFalse forKey:(NSString *)kCFStreamSSLValidatesCertificateChain];
}改成
if (![self validatesSecureCertificate]) {
[sslProperties setObject:(NSString *)kCFBooleanFalse forKey:(NSString *)kCFStreamSSLValidatesCertificateChain];
[sslProperties setObject:(NSString *)(CFStringRef *)kCFStreamSocketSecurityLevelSSLv3 forKey:(NSString *)kCFStreamSSLLevel];
}
然后我们在使用的时候直接设置[request setValidatesSecureCertificate:NO]即可。
2)其实最好设置一个对外开发的属性变量,避免对其他代码造成影响,如下
ASIHTTPRequest.h中
@property (assign) CFStringRef *sslSecurityLevel;
ASIHTTPRequest.m中
@synthesize sslSecurityLevel;
然后在.m文件中找到if (![self validatesSecureCertificate]) {
[sslProperties setObject:(NSString *)kCFBooleanFalse forKey:(NSString *)kCFStreamSSLValidatesCertificateChain];
},在下面添加如下代码
if ([self sslSecurityLevel] != nil) {
[sslProperties setObject:(NSString *)[self sslSecurityLevel] forKey:(NSString *)kCFStreamSSLLevel];
}
最后在连接https的时候设置2个属性即可,
[request setValidatesSecureCertificate:NO];
[request setSslSecurityLevel:(CFStringRef *)kCFStreamSocketSecurityLevelSSLv3];