今天總結一下糾結了我近一個星期的問題,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];