HTTPS

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ū)別
  1. https 協(xié)議需要到 ca 申請(qǐng)證書,一般免費(fèi)證書很少(我們使用的是沃通SSL),需要交費(fèi)
  2. http 是超文本傳輸協(xié)議,信息是明文傳輸,https 則是具有安全性的 ssl 加密傳輸協(xié)議
  3. http 和 https 使用的是完全不同的連接方式,用的端口也不一樣,前者是 80,后者是 443
  4. 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);
    }];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容