HTTPS概念
- HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標(biāo)的HTTP通道,簡(jiǎn)單講是 HTTP 的安全版
- 在 iOS 開發(fā)中,如果服務(wù)器使用的是 HTTPS 1.2,則客戶端不需要設(shè)置 ATS
HTTPS與 HTTP 的區(qū)別
- https 協(xié)議需要到 ca 申請(qǐng)證書,一般免費(fèi)證書很少(我們使用的是沃通SSL),需要交費(fèi)
- http 是超文本傳輸協(xié)議,信息是明文傳輸,https 則是具有安全性的 ssl 加密傳輸協(xié)議
- http 和 https 使用的是完全不同的連接方式,用的端口也不一樣,前者是 80,后者是 443
- http 的連接很簡(jiǎn)單,是無(wú)狀態(tài)的;HTTPS協(xié)議是由 SSL+HTTP 協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比 http 協(xié)議安全
HTTPS 工作原理示意圖

12.jpg
1, 客戶端根據(jù)一個(gè)網(wǎng)絡(luò)請(qǐng)求發(fā)送給服務(wù)器
2, 服務(wù)器將公鑰返回給客戶端 (服務(wù)器上有公鑰和私鑰)
3, 客戶端將公鑰放在一個(gè)受保護(hù)空間內(nèi),并且判斷證書是否有效, 如果有效或是用戶已經(jīng)信任此證書
4, 生成一個(gè)隨機(jī)密鑰(對(duì)稱加密) 并用剛才服務(wù)器端的公鑰進(jìn)行加密
5, 客戶端傳輸公鑰加密后的隨機(jī)密鑰
6, 服務(wù)器用私鑰進(jìn)行解密, 獲取這個(gè)隨機(jī)密鑰
7, 服務(wù)器用這個(gè)隨機(jī)密鑰對(duì)傳輸?shù)膬?nèi)容(如 “我愛你”) 進(jìn)行加密
8, 客戶端用隨機(jī)的密鑰對(duì)內(nèi)容進(jìn)行
使用原生代碼需要的配置信息
#pragma mark - NSURLSessionTaskDelegate
/**
* 接收到服務(wù)器的`挑戰(zhàn)/風(fēng)險(xiǎn)` Challenge -> https:包含公鑰的證書/輸入用戶名和密碼
*
* @param session 會(huì)話
* @param challenge 挑戰(zhàn)
* @param completionHandler 完成回調(diào) - 提示:如果蘋果提供的代理方法的參數(shù)就包含完成回調(diào)!
* 需要主動(dòng)執(zhí)行回調(diào)方法,通知系統(tǒng)做一些動(dòng)作!
*/
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler {
// 公鑰是保存在受保護(hù)空間中的
// Auth-Scheme: 授權(quán)機(jī)制 - 要`信任`服務(wù)器返回的公鑰證書
// NSURL Authentication(授權(quán)) Method(方法) Server(服務(wù)器) Trust(信任)
// HTTPS 端口 443 / HTTP 的端口是 80
NSLog(@"%@", challenge.protectionSpace);
// 1. 判斷受保護(hù)空間中的授權(quán)機(jī)制是否是信任證書
if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
// 2. 指定完成回調(diào)
// 1> NSURLSessionAuthChallenge Disposition 對(duì)證書的處置
// 2> 創(chuàng)建一個(gè)憑據(jù)/憑證返回給服務(wù)器,后續(xù)的對(duì)稱秘鑰等等操作,都會(huì)自動(dòng)實(shí)現(xiàn)
NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
completionHandler(0, credential);
}
}
使用AFN配置
1. 管理器
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 允許無(wú)效的證書
manager.securityPolicy.allowInvalidCertificates = YES;
// 不驗(yàn)證域名
manager.securityPolicy.validatesDomainName = NO;
// 設(shè)置響應(yīng)的數(shù)據(jù)格式 - 二進(jìn)制格式 - HTML
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
2. GET - html [manager GET:@"https://www.cctv.com" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 將返回的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成 html 字符串
NSString *html = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"%@", html);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@", error);
}];