本文主要是自己糾結(jié)https時(shí)遇到的配置問題。
iOS配置HTTPS
正規(guī)證書
如果是正規(guī)的數(shù)字證書認(rèn)證機(jī)構(gòu)頒發(fā)的證書,就不需要進(jìn)行任何配置,記得將url前面加上https即可正常訪問,達(dá)到加密以及通過審核的目的。但是缺點(diǎn)是要錢,而且費(fèi)用不低。
但是!好消息!好消息!好消息?。?!
阿里云和騰訊云現(xiàn)在提供免費(fèi)的正規(guī)證書使用了!
騰訊云提供的沒用不清楚,但是阿里云提供的免費(fèi)證書有效期為一年,一年后能不能重新免費(fèi)再配一個(gè)就不清楚了。但是這個(gè)證書是正規(guī)的,親測(cè)有效,用了再說,省了一大筆麻煩。
下面提供一些傳送門:
阿里云服務(wù)器配置證書教程:阿里云的文檔簡(jiǎn)直是業(yè)界楷模
阿里云證書購買(選擇免費(fèi)的那個(gè)):選擇免費(fèi)的那個(gè),看看其余的價(jià)格就是費(fèi)用確實(shí)不低了
阿里云配置蘋果ATS幫助文檔:很貼心地針對(duì)蘋果的要求專門寫了個(gè)服務(wù)器端的配置注意事項(xiàng),其實(shí)從阿里云和騰訊云都退出了免費(fèi)的證書來看,很好奇蘋果的強(qiáng)力要求是不是對(duì)https的普及和平民化起到了一定的推動(dòng)作用
騰訊云檢測(cè)ATS支持度:騰訊貼心地推出了一個(gè)供大家檢測(cè)自家服務(wù)器配置后是否符合蘋果要求的服務(wù),哪里不足哪里滿足都很詳細(xì)。
自生成證書
但如果在如此大好的環(huán)境下還想用自生成的證書,那么除了服務(wù)器的配置要滿足蘋果的要求外(要求見上方阿里云的文檔),工程內(nèi)也需要做一些配置。
首先,需要把證書放到工程內(nèi),必須是cer格式的,證書有多重格式,不同格式的轉(zhuǎn)換見這個(gè)網(wǎng)站。是可以在mac的終端中直接輸入命令行轉(zhuǎn)換的。
放到工程內(nèi)后,去 info.plist 中增加如下圖的配置:
NSURLConnection
其實(shí)這個(gè)在iOS 9中已經(jīng)廢棄被NSURLSession取代了,不過還是說一下,直接添加下面的代理方法就可以了:
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust)
{ // 告訴服務(wù)器,客戶端信任證書
// 創(chuàng)建憑據(jù)對(duì)象
NSURLCredential *credntial = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
// 告訴服務(wù)器信任證書
[challenge.sender useCredential:credntial forAuthenticationChallenge:challenge];
}
}
NSURLSession
系統(tǒng)自帶的類中現(xiàn)在就是推薦使用這個(gè)類,參考如下代碼設(shè)置:
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * __nullable credential))completionHandler
{ // 判斷是否是信任服務(wù)器證書
if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust)
{ // 告訴服務(wù)器,客戶端信任證書
// 創(chuàng)建憑據(jù)對(duì)象
NSURLCredential *credntial = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; // 通過completionHandler告訴服務(wù)器信任證書 completionHandler(NSURLSessionAuthChallengeUseCredential,credntial);
}
NSLog(@"protectionSpace = %@",challenge.protectionSpace);
}
AFNetworking 2.x版本
隨著iOS 9中對(duì)NSURLConnection的廢棄, AFNetworking 3.0也做出了修改,不過還是有用2.新版本的,我們只用在原來使用AFHTTPRequestOperationManager類進(jìn)行網(wǎng)絡(luò)請(qǐng)求的基礎(chǔ)上,改變它的安全策略并配置證書:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// https ================
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// 證書模式
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"證書名字" ofType:@"cer"];
NSData *cerData = [NSData dataWithContentsOfFile:cerPath]; securityPolicy.pinnedCertificates = [[NSArray alloc] initWithObjects:cerData, nil];
// 配置證書
securityPolicy.allowInvalidCertificates = YES;
// 客戶端是否信任非法證書
[securityPolicy setValidatesDomainName:NO];
// 是否在證書域字段中驗(yàn)證域名
manager.securityPolicy = securityPolicy;
// ======================
// 常規(guī)的進(jìn)行POST、GET等請(qǐng)求操作
// ...
AFNetworking 3.x版本
新的版本的里廢棄了基于NSURLConnection封裝的AFHTTPRequestOperationManager,轉(zhuǎn)而使用基于NSURLSession封裝的AFHTTPSessionManager了。
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// https ================
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// 證書模式
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"證書名字" ofType:@"cer"];
NSData *cerData = [NSData dataWithContentsOfFile:cerPath]; securityPolicy.pinnedCertificates = [[NSArray alloc] initWithObjects:cerData, nil];
// 配置證書
securityPolicy.allowInvalidCertificates = YES;
// 客戶端是否信任非法證書
[securityPolicy setValidatesDomainName:NO];
// 是否在證書域字段中驗(yàn)證域名
manager.securityPolicy = securityPolicy;
// ======================
// 常規(guī)的進(jìn)行POST、GET等請(qǐng)求操作
// ...
以上,就是常用的網(wǎng)絡(luò)請(qǐng)求方式下對(duì)自生成證書的配置了,如果用的是正規(guī)證書,配置了這些也不影響,不過其實(shí)已經(jīng)可以自動(dòng)識(shí)別了,強(qiáng)行配置了以后證書失效后還需要更改工程中的證書,到時(shí)候可能老版本就有問題了。