在WWDC 2016開(kāi)發(fā)者大會(huì)上黔姜,蘋(píng)果宣布了一個(gè)最后期限:到2017年1月1日 App Store中的所有應(yīng)用都必須啟用 App Transport Security安全功能。也就是說(shuō)管怠,自2017年起葡缰,網(wǎng)絡(luò)請(qǐng)求必須由http改成https亏掀。
今天后臺(tái)自己配置了一個(gè)免費(fèi)https證書(shū),我直接將項(xiàng)目中的域名的http 改成https 結(jié)果報(bào)錯(cuò):
failure................failure ....... error: Error Domain=NSURLErrorDomain Code=-1202 "****此服務(wù)器的證書(shū)無(wú)效。您可能正在連接到一個(gè)偽裝成****“.com”****的服務(wù)器泛释,這會(huì)威脅到您的機(jī)密信息的安全滤愕。****" UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=, NSLocalizedRecoverySuggestion=****您仍要連接此服務(wù)器嗎?****, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9807, NSErrorPeerCertificateChainKey=(**
**"",**
**""**
**),
NSUnderlyingError=0x608000242340 {Error Domain=kCFErrorDomainCFNetwork Code=-1202 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=, _kCFNetworkCFStreamSSLErrorOriginalValue=-9807, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9807, kCFStreamPropertySSLPeerCertificates=(**
**"",**
**""**
**)}}, NSLocalizedDescription=****此服務(wù)器的證書(shū)無(wú)效怜校。您可能正在連接到一個(gè)偽裝成****“”****的服務(wù)器间影,這會(huì)威脅到您的機(jī)密信息的安全。****, NSErrorFailingURLKey=..,**
**NSErrorFailingURLStringKey=.., NSErrorClientCertificateStateKey=0}**
在網(wǎng)上查了一些資料 做一點(diǎn)筆記
參考:iOS開(kāi)發(fā):對(duì)于AFNetworking HTTP轉(zhuǎn)HTTPS請(qǐng)求證書(shū)問(wèn)題
詳細(xì)的證書(shū)介紹:iOS開(kāi)發(fā):對(duì)于AFNetworking HTTP轉(zhuǎn)HTTPS請(qǐng)求證書(shū)問(wèn)題
HTTPS服務(wù)器滿(mǎn)足ATS默認(rèn)的條件茄茁,而且SSL證書(shū)是通過(guò)權(quán)威的CA機(jī)構(gòu)認(rèn)證過(guò)的魂贬,那么我們?cè)谑褂肵code開(kāi)發(fā)的時(shí)候,對(duì)網(wǎng)絡(luò)的適配什么都不用做裙顽,我們也能正常與服務(wù)器通信付燥。但是,當(dāng)我們對(duì)安全性有更高的要求時(shí)或者我們自建證書(shū)時(shí)愈犹,我們需要本地導(dǎo)入證書(shū)來(lái)進(jìn)行驗(yàn)證键科。
使用AFNetworking來(lái)支持https
步驟:
1.從后臺(tái)那里拿到一個(gè).crt后綴的證書(shū)文件,把這個(gè)文件變成.cer后綴的文件漩怎,打開(kāi)你的終端勋颖,寫(xiě)下面的命令:
openssl x509 -in 后臺(tái)給的名字.cet -out 你想要的名字.cer -outform der
2.將生成的cer文件導(dǎo)入到工程中 在封裝的AFN請(qǐng)求基類(lèi)中介入以下代碼:
//https證書(shū)
+ (AFSecurityPolicy *)customSecurityPolicy
{
//先導(dǎo)入證書(shū),找到證書(shū)的路徑
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"www.mxingm.com" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
//AFSSLPinningModeCertificate 使用證書(shū)驗(yàn)證模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
//allowInvalidCertificates 是否允許無(wú)效證書(shū)(也就是自建的證書(shū))扬卷,默認(rèn)為NO
//如果是需要驗(yàn)證自建證書(shū)牙言,需要設(shè)置為YES
securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要驗(yàn)證域名,默認(rèn)為YES怪得;
//假如證書(shū)的域名與你請(qǐng)求的域名不一致,需把該項(xiàng)設(shè)置為NO卑硫;如設(shè)成NO的話(huà)徒恋,即服務(wù)器使用其他可信任機(jī)構(gòu)頒發(fā)的證書(shū),也可以建立連接欢伏,這個(gè)非常危險(xiǎn)入挣,建議打開(kāi)。
//置為NO硝拧,主要用于這種情況:客戶(hù)端請(qǐng)求的是子域名径筏,而證書(shū)上的是另外一個(gè)域名葛假。因?yàn)镾SL證書(shū)上的域名是獨(dú)立的,假如證書(shū)上注冊(cè)的域名是www.google.com滋恬,那么mail.google.com是無(wú)法驗(yàn)證通過(guò)的聊训;當(dāng)然,有錢(qián)可以注冊(cè)通配符的域名*.google.com恢氯,但這個(gè)還是比較貴的带斑。
//如置為NO,建議自己添加對(duì)應(yīng)域名的校驗(yàn)邏輯勋拟。
securityPolicy.validatesDomainName = NO;
NSSet *set = [[NSSet alloc] initWithObjects:certData, nil];
securityPolicy.pinnedCertificates = set;
return securityPolicy;
}
然后在AFN請(qǐng)求的方法中加上:
+ (void)executeRequestAndIsPost:(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)用上面的代碼,給這個(gè)證書(shū)驗(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);
}
}];
}
加完以后再次請(qǐng)求 發(fā)現(xiàn)可以建立連接了挂滓。
當(dāng)我們的工程中有SDWebImage框架的請(qǐng)求HTTPS的圖片時(shí),大家可以繞過(guò)證書(shū)驗(yàn)證去加載圖片
[imageView sd_setImageWithURL:[NSURL URLWithString:urlString] placeholderImage:self.placeholder options:SDWebImageAllowInvalidSSLCertificates];
這就是AFN升級(jí)HTTPS的一些總結(jié) 覺(jué)得有幫助的參考和總結(jié).希望幫到你:-D