本文主要是自己糾結(jié)https時遇到的配置問題疆股。
iOS配置HTTPS
正規(guī)證書
如果是正規(guī)的數(shù)字證書認(rèn)證機(jī)構(gòu)頒發(fā)的證書牺六,就不需要進(jìn)行任何配置丝蹭,記得將url前面加上https即可正常訪問秤掌,達(dá)到加密以及通過審核的目的汉操。但是缺點(diǎn)是要錢再来,而且費(fèi)用不低。
但是磷瘤!好消息芒篷!好消息!好消息2筛俊U肼!
阿里云和騰訊云現(xiàn)在提供免費(fèi)的正規(guī)證書使用了扳抽!
騰訊云提供的沒用不清楚篡帕,但是阿里云提供的免費(fèi)證書有效期為一年,一年后能不能重新免費(fèi)再配一個就不清楚了贸呢。但是這個證書是正規(guī)的赂苗,親測有效,用了再說贮尉,省了一大筆麻煩拌滋。
下面提供一些傳送門:
阿里云服務(wù)器配置證書教程:阿里云的文檔簡直是業(yè)界楷模
阿里云證書購買(選擇免費(fèi)的那個):選擇免費(fèi)的那個,看看其余的價格就是費(fèi)用確實(shí)不低了
阿里云配置蘋果ATS幫助文檔:很貼心地針對蘋果的要求專門寫了個服務(wù)器端的配置注意事項猜谚,其實(shí)從阿里云和騰訊云都退出了免費(fèi)的證書來看败砂,很好奇蘋果的強(qiáng)力要求是不是對https的普及和平民化起到了一定的推動作用
騰訊云檢測ATS支持度:騰訊貼心地推出了一個供大家檢測自家服務(wù)器配置后是否符合蘋果要求的服務(wù)赌渣,哪里不足哪里滿足都很詳細(xì)。
自生成證書
但如果在如此大好的環(huán)境下還想用自生成的證書昌犹,那么除了服務(wù)器的配置要滿足蘋果的要求外(要求見上方阿里云的文檔)坚芜,工程內(nèi)也需要做一些配置。
首先斜姥,需要把證書放到工程內(nèi)鸿竖,必須是cer格式的,證書有多重格式铸敏,不同格式的轉(zhuǎn)換見這個網(wǎng)站缚忧。是可以在mac的終端中直接輸入命令行轉(zhuǎn)換的。
放到工程內(nèi)后杈笔,去 info.plist 中增加如下圖的配置:
NSURLConnection
其實(shí)這個在iOS 9中已經(jīng)廢棄被NSURLSession取代了禁筏,不過還是說一下持钉,直接添加下面的代理方法就可以了:
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust)
{ // 告訴服務(wù)器,客戶端信任證書
// 創(chuàng)建憑據(jù)對象
NSURLCredential *credntial = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
// 告訴服務(wù)器信任證書
[challenge.sender useCredential:credntial forAuthenticationChallenge:challenge];
}
}
NSURLSession
系統(tǒng)自帶的類中現(xiàn)在就是推薦使用這個類篱昔,參考如下代碼設(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ù)對象
NSURLCredential *credntial = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; // 通過completionHandler告訴服務(wù)器信任證書 completionHandler(NSURLSessionAuthChallengeUseCredential,credntial);
}
NSLog(@"protectionSpace = %@",challenge.protectionSpace);
}
AFNetworking 2.x版本
隨著iOS 9中對NSURLConnection的廢棄, AFNetworking 3.0也做出了修改旱爆,不過還是有用2.新版本的舀射,我們只用在原來使用AFHTTPRequestOperationManager類進(jìn)行網(wǎng)絡(luò)請求的基礎(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等請求操作
// ...
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等請求操作
// ...
以上,就是常用的網(wǎng)絡(luò)請求方式下對自生成證書的配置了驼抹,如果用的是正規(guī)證書桑孩,配置了這些也不影響,不過其實(shí)已經(jīng)可以自動識別了框冀,強(qiáng)行配置了以后證書失效后還需要更改工程中的證書流椒,到時候可能老版本就有問題了。