iOS-網(wǎng)絡-HTTPS協(xié)議

上文介紹了HTTP協(xié)議篮奄,本文介紹一下HTTPS協(xié)議悴能。

1. 什么是HTTPS

HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer)景馁,是以安全為目標的HTTP通道,簡單講是HTTP的安全版刑巧,即HTTP下加入SSL層顽照。HTTPS的安全基礎是SSL,因此加密的詳細內(nèi)容就需要SSL辽装,它是一個URI scheme(抽象標識符體系)帮碰,句法類同http:體系,用于安全的HTTP數(shù)據(jù)傳輸拾积。

https:URL表明它使用了HTTP殉挽,但HTTPS存在不同于HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)。

HTTPS = HTTP + 加密 + 認證 + 完整性保護拓巧,其實HTTPS是身披SSL外殼的HTTP斯碌。

2. HTTPS和HTTP的區(qū)別主要為以下四點:

  1. https協(xié)議需要到ca申請證書,一般免費證書很少玲销,需要交費输拇。
  2. http是超文本傳輸協(xié)議摘符,信息是明文傳輸贤斜,https 則是具有安全性的ssl加密傳輸協(xié)議。
  3. http和https使用的是完全不同的連接方式逛裤,用的端口也不一樣瘩绒,前者是80,后者是443带族。
  4. http的連接很簡單锁荔,是無狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構建的可進行加密傳輸蝙砌、身份認證的網(wǎng)絡協(xié)議阳堕,比http協(xié)議安全跋理。

3. HTTPS的通信過程

當客戶端發(fā)送數(shù)據(jù)請求的時候客戶端不會馬上返回響應數(shù)據(jù),而是創(chuàng)建一個安全證書恬总,然后把安全證書給客戶端安裝前普,安裝之后,客戶端和服務端就創(chuàng)建了一個受保護的空間通道壹堰,服務器端有公鑰和私鑰拭卿,公鑰發(fā)給客戶端,留著客戶端加密數(shù)據(jù)用贱纠,私鑰服務端留著峻厚,用來解密客戶端發(fā)來的信息,然后響應完成谆焊。

HTTPS = HTTP + SSL(Secure socket layer惠桃,安全套接字層)

HTTPS響應過程.png

4. HTTPS工作原理詳細過程

HTTPS工作在客戶端和服務器端之間“枚桑客戶端和服務器本身都會自帶一些加密的算法刽射,用于雙方協(xié)商加密的選擇項。

  1. 客戶端首先會將自己版本號剃执,支持的加密算法等誓禁,打個包告訴服務器端。
  2. 服務器端從客戶端發(fā)來的加密算法中肾档,選出一組加密算法和HASH算法(注:HASH也屬于加密)摹恰,并將自己的身份信息以證書的形式發(fā)回給客戶端,證書中包含了網(wǎng)站的地址怒见,加密用的公鑰俗慈,以及證書的頒發(fā)機構等。
    這里遣耍,服務器就將自己用來加密用的公鑰一同發(fā)給客戶端闺阱,而私鑰則服務器保存著,用戶解密客戶端加密過后的內(nèi)容舵变。
  3. 客戶端收到了服務器發(fā)來的數(shù)據(jù)包后酣溃,會做這么幾件事情:
    ① 驗證一下證書是否合法。一般來說纪隙,證書是用來標示一個站點是否合法的標志赊豌,如果說該證書由權威的第三方頒發(fā)和簽名的,則說明證書合法绵咱。
    ② 如果證書合法碘饼,或者客戶端接受和信任了不合法的證書,則客戶端就會隨機產(chǎn)生一串序列號,使用服務器發(fā)來的公鑰進行加密艾恼。這時候住涉,一條返回的消息就基本就緒。
    ③ 最后使用服務器挑選的HASH算法钠绍,將剛才的消息使用剛才的隨機數(shù)進行加密秆吵,生成相應的消息校驗值,與剛才的消息一同發(fā)還給服務器五慈。
  4. 服務器接受到客戶端發(fā)來的消息后纳寂,會做這么幾件事情:
    ① 使用私鑰解密上面第3-②中公鑰加密的消息,得到客戶端產(chǎn)生的隨機序列號泻拦。
    ② 使用該隨機序列號毙芜,對該消息進行加密,驗證的到的校驗值是否與客戶端發(fā)來的一致争拐,如果一致則說明消息未被篡改腋粥,可以信任。
    ③ 最后架曹,使用該隨機序列號隘冲,加上之前第2步中選擇的加密算法,加密一段握手消息绑雄,發(fā)還給客戶端展辞,同時HASH值也帶上。
  5. 客戶端收到服務器端的消息后万牺,接著做這么幾件事情:
    ① 計算HASH值是否與發(fā)的消息一致
    ② 檢查消息是否為握手消息
  6. 握手結束后罗珍,客戶端和服務器端使用握手階段產(chǎn)生的隨機數(shù)以及挑選出來的算法進行對稱加解密的傳輸。

詳細過程如下圖:
HTTPS原理.png

為什么不直接全程使用非對稱加密算法進行數(shù)據(jù)傳輸脚粟?這個問題的答案是因為非對稱算法的效率對比起對稱算法來說覆旱,要低得多得多,因此往往只用在HTTPS的握手階段核无。

5. 其他說明

  1. HTTPS的主要思想是在不安全的網(wǎng)絡上創(chuàng)建一安全信道扣唱,并可在使用適當?shù)募用馨头掌髯C書可被驗證且可被信任時,對竊聽和中間人攻擊提供合理的保護团南。
  2. HTTPS的信任繼承基于預先安裝在瀏覽器中的證書頒發(fā)機構(如VeriSign噪沙、Microsoft等)(意即“我信任證書頒發(fā)機構告訴我應該信任的”)。
  3. 因此已慢,一個到某網(wǎng)站的HTTPS連接可被信任曲聂,如果服務器搭建自己的https 也就是說采用自認證的方式來建立https信道霹购,這樣一般在客戶端是不被信任的佑惠。
  4. 所以我們一般在瀏覽器訪問一些https站點的時候會有一個提示,問你是否繼續(xù)。

6. 對iOS開發(fā)的影響

#import "ViewController.h"
#import "AFNetworking.h"
 
@interface ViewController ()<NSURLSessionDataDelegate>
 
@end
 
@implementation ViewController
 
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self afn];
}
 
-(void)afn
{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    //更改解析方式
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
    //設置對證書的處理方式
    manager.securityPolicy.allowInvalidCertificates = YES;
    manager.securityPolicy.validatesDomainName = NO;
    
    [manager GET:@"https://kyfw.12306.cn/otn" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"success---%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"error---%@",error);
    }];
}
 
-(void)session
{
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
    
    NSURL *url = [NSURL URLWithString:HttpsURL];
    
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    
    request.HTTPMethod = @"POST";
    
    NSString *bodyStr = @"clientversion=6.0&clienttype=2";
    
    request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
    
    NSURLSessionTask *task = [session dataTaskWithRequest:request];
    
    [task resume];
}
 
#pragma mark NSURLSessionDataDelegate
//如果發(fā)送的請求是https的,那么才會調(diào)用該方法
-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler
{
    if(![challenge.protectionSpace.authenticationMethod isEqualToString:@"NSURLAuthenticationMethodServerTrust"])
    {
        return;
    }
    NSLog(@"%@",challenge.protectionSpace);
    //NSURLSessionAuthChallengeDisposition枚舉   如何處理證書
    /*
     NSURLSessionAuthChallengeUseCredential = 0, 使用該證書 安裝該證書
     NSURLSessionAuthChallengePerformDefaultHandling = 1, 默認采用的方式,該證書被忽略
     NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2, 取消請求,證書忽略
     NSURLSessionAuthChallengeRejectProtectionSpace = 3,          拒絕
     */
    //生成一個無條件信任的credential
    NSURLCredential *credential = [[NSURLCredential alloc]initWithTrust:challenge.protectionSpace.serverTrust];
    
    //NSURLCredential 授權信息
    completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
}
@end

如果使用了系統(tǒng)的NSURLSession進行數(shù)據(jù)請求膜楷,只要請求的地址是HTTPS的旭咽,就會調(diào)用didReceiveChallenge:這個代理方法,我們需要在該方法中告訴系統(tǒng)赌厅,是否信任服務器返回的證書穷绵,上面的方法直接使用無條件信任了。

如果是使用AFN框架特愿,那么我們不需要做任何額外的操作仲墨,因為AFN內(nèi)部已經(jīng)做了處理。

AFN驗證的源碼如下:

/*
 兩種方式: 本地證書驗證 (需要驗證本地證書)
            1 驗證服務器
            2 本地證書生成NSURLCredential對象揍障,代理回調(diào)block來處理相關事務
 
          無本地證書驗證NSURLAuthenticationMethodServerTrust(直接信任服務器)
            1 驗證服務器
            2 直接通過服務器傳過來的challenge 生成NSURLCredential對象(這個對象關聯(lián)了客戶端https相關信息)目养,代理回調(diào)block來處理相關事務
 */
// 驗證來源是否有效
- (void)URLSession:(NSURLSession *)session
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
 completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
    NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling;
    __block NSURLCredential *credential = nil;
    // 兩種方式 1 外部處理NSURLSessionAuthChallengeDisposition 2 AF內(nèi)部默認處理它
    if (self.sessionDidReceiveAuthenticationChallenge) {// 1外部(你自己處理)
        disposition = self.sessionDidReceiveAuthenticationChallenge(session, challenge, &credential);
    } else {// 2內(nèi)部(AF處理)
        // challenge 服務器過來的,方式(NSURLAuthenticationMethodServerTrust)毒嫡,是否要本地驗證
        if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
            //內(nèi)部三種驗證方式 1 無條件信任  2 證書驗證  3 公約驗證
            if ([self.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) { // 驗證邏輯
                // 返回YES癌蚁,server是沒問題的
                credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];// 生成一個信任的NSURLCredential對象
                if (credential) {
                    //Use the specified credential
                    disposition = NSURLSessionAuthChallengeUseCredential;
                } else {
                    disposition = NSURLSessionAuthChallengePerformDefaultHandling;
                }
            } else {
                disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;
            }
        } else {
            disposition = NSURLSessionAuthChallengePerformDefaultHandling;
        }
    }

    if (completionHandler) {
        completionHandler(disposition, credential);
    }
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市兜畸,隨后出現(xiàn)的幾起案子努释,更是在濱河造成了極大的恐慌,老刑警劉巖咬摇,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伐蒂,死亡現(xiàn)場離奇詭異,居然都是意外死亡肛鹏,警方通過查閱死者的電腦和手機饿自,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來龄坪,“玉大人昭雌,你說我怎么就攤上這事〗√铮” “怎么了烛卧?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妓局。 經(jīng)常有香客問我总放,道長,這世上最難降的妖魔是什么好爬? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任局雄,我火速辦了婚禮,結果婚禮上存炮,老公的妹妹穿的比我還像新娘炬搭。我一直安慰自己蜈漓,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布宫盔。 她就那樣靜靜地躺著融虽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪灼芭。 梳的紋絲不亂的頭發(fā)上有额,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音彼绷,去河邊找鬼巍佑。 笑死,一個胖子當著我的面吹牛寄悯,可吹牛的內(nèi)容都是我干的句狼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼热某,長吁一口氣:“原來是場噩夢啊……” “哼腻菇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起昔馋,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤筹吐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后秘遏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丘薛,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年邦危,在試婚紗的時候發(fā)現(xiàn)自己被綠了洋侨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡倦蚪,死狀恐怖希坚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陵且,我是刑警寧澤裁僧,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站慕购,受9級特大地震影響聊疲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沪悲,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一获洲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧殿如,春花似錦贡珊、人聲如沸最爬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谨胞,卻和暖如春固歪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胯努。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工牢裳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叶沛。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓蒲讯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灰署。 傳聞我的和親對象是個殘疾皇子判帮,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355