公司之前的請求都是HTTP的,現(xiàn)在要把HTTP改成HTTPS,如果我們只是單單的把http改成https,在進(jìn)行網(wǎng)絡(luò)請求的時候,會報(bào)下面的一大堆錯誤,大概意思也就是說證書無效,影響請求的安全性:
Domain=NSURLErrorDomain Code=-1202 "此服務(wù)器的證書無效。您可能正在連接到一個偽裝成“m.dks.com”的服務(wù)器,這會威脅到您的機(jī)密信息的安全。" UserInfo=0x1741abb40 {NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x1740cdd60>, NSLocalizedRecoverySuggestion=您仍要連接此服務(wù)器嗎?, _kCFStreamErrorCodeKey=-9813, NSUnderlyingError=0x1740520f0 "未能完成操作。(“kCFErrorDomainCFNetwork”錯誤 -1202。)", NSLocalizedDescription=此服務(wù)器的證書無效。您可能正在連接到一個偽裝成“m.dks.com”的服務(wù)器,這會威脅到您的機(jī)密信息的安全。, NSErrorFailingURLKey=https://m.dks.com//user/login!login.do, NSErrorFailingURLStringKey=https://m.dks.com//user/login!login.do, _kCFStreamErrorDomainKey=3}
我們要做的就是,從后臺那里拿到一個.crt后綴的證書文件,把這個文件變成.cer后綴的文件,我此處使用的是命令行;當(dāng)然你也可以使用Mac上面的鑰匙串去訪問,讓后從政府頒發(fā)機(jī)構(gòu)導(dǎo)出.cer的文件;打開你的終端,寫下面的命令:
openssl x509 -in 后臺給的.crt -out 想要的名字.cer -outform der
然后把生成的:想要的名字.cer文件導(dǎo)入到工程中,在自己封裝AFNetworking的類中,寫如下代碼:
+ (AFSecurityPolicy *)customSecurityPolicy
{
//先導(dǎo)入證書,找到證書的路徑
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"Admin" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
//AFSSLPinningModeCertificate 使用證書驗(yàn)證模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
//allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認(rèn)為NO
//如果是需要驗(yàn)證自建證書,需要設(shè)置為YES
securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要驗(yàn)證域名,默認(rèn)為YES;
//假如證書的域名與你請求的域名不一致,需把該項(xiàng)設(shè)置為NO;如設(shè)成NO的話,即服務(wù)器使用其他可信任機(jī)構(gòu)頒發(fā)的證書,也可以建立連接,這個非常危險(xiǎn),建議打開。
//置為NO,主要用于這種情況:客戶端請求的是子域名,而證書上的是另外一個域名。因?yàn)镾SL證書上的域名是獨(dú)立的,假如證書上注冊的域名是www.google.com,那么mail.google.com是無法驗(yàn)證通過的;當(dāng)然,有錢可以注冊通配符的域名*.google.com,但這個還是比較貴的。
//如置為NO,建議自己添加對應(yīng)域名的校驗(yàn)邏輯。
securityPolicy.validatesDomainName = NO;
NSSet *set = [[NSSet alloc] initWithObjects:certData, nil];
securityPolicy.pinnedCertificates = set;
return securityPolicy;
}
然后在封裝的get請求或者是是post請求的地方,調(diào)用上面的這段代碼:
+ (void)postWithURLString:(NSString *)urlString
parameters:(id)parameters
success:(SuccessBlock)successBlock
failure:(FailureBlock)failureBlock
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.requestSerializer.timeoutInterval = outTime;
//HTTPS SSL的驗(yàn)證,在此處調(diào)用上面的代碼,給這個證書驗(yàn)證;
[manager setSecurityPolicy:[SYNetworkingManager customSecurityPolicy]];
[manager POST:urlString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (successBlock) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];
successBlock(dic);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failureBlock) {
failureBlock(error);
NSLog(@"網(wǎng)絡(luò)異常 - T_T%@", error);
}
}];
}
當(dāng)我們的工程中有SDWebimage這個第三放庫的時候,加載HTTPS的圖片時,在iOS8上面沒有問題,但是在iOS9上面,控制臺就會報(bào)這樣的錯誤:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
大概意思也是說網(wǎng)絡(luò)請求證書的問題,不過我還沒有解決這個問題,在網(wǎng)上找了好多,沒有找到一個好的方法,如果有哪位朋友遇到這樣的問題了,還希望可以在此處給解答一下,千恩萬謝?。?!
如果想要了解對AFNetworking的封裝,請猛戳下面的鏈接:http://www.itdecent.cn/p/bf4e62fe9474