23.HTTP&HTTPS(四)

1.HTTPS

背景:

超文本傳輸協(xié)議HTTP協(xié)議被用于在Web瀏覽器和網(wǎng)站服務(wù)器之間傳遞信息,HTTP協(xié)議以明文方式發(fā)送內(nèi)容,不提供任何方式的數(shù)據(jù)加密,如果攻擊者截取了Web瀏覽器和網(wǎng)站服務(wù)器之間的傳輸報(bào)文,就可以直接讀懂其中的信息,因此,HTTP協(xié)議不適合傳輸一些敏感信息,比如:信用卡號(hào)、密碼等支付信息。

解決辦法

為了解決HTTP協(xié)議的這一缺陷,需要使用另一種協(xié)議:安全套接字層超文本傳輸協(xié)議HTTPS,為了數(shù)據(jù)傳輸?shù)陌踩?,HTTPS在HTTP的基礎(chǔ)上加入了SSL協(xié)議,SSL依靠證書來(lái)驗(yàn)證服務(wù)器的身份,并為瀏覽器和服務(wù)器之間的通信加密。

一、HTTP和HTTPS的基本概念

HTTP:是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,是一個(gè)客戶端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)(TCP),用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議,它可以使瀏覽器更加高效,使網(wǎng)絡(luò)傳輸減少。

HTTPS:是以安全為目標(biāo)的HTTP通道,簡(jiǎn)單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL。

HTTPS協(xié)議的主要作用可以分為兩種:一種是建立一個(gè)信息安全通道,來(lái)保證數(shù)據(jù)傳輸?shù)陌踩?;另一種就是確認(rèn)網(wǎng)站的真實(shí)性。

二、HTTP與HTTPS有什么區(qū)別?

HTTP協(xié)議傳輸?shù)臄?shù)據(jù)都是未加密的,也就是明文的,因此使用HTTP協(xié)議傳輸隱私信息非常不安全,為了保證這些隱私數(shù)據(jù)能加密傳輸,于是網(wǎng)景公司設(shè)計(jì)了SSL(Secure Sockets Layer)協(xié)議用于對(duì)HTTP協(xié)議傳輸?shù)臄?shù)據(jù)進(jìn)行加密,從而就誕生了HTTPS。簡(jiǎn)單來(lái)說(shuō),HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,要比http協(xié)議安全。

HTTPS和HTTP的區(qū)別主要如下:

1、https協(xié)議需要到ca申請(qǐng)證書,一般免費(fèi)證書較少,因而需要一定費(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é)議安全。

三、HTTP&HTTPS工作原理

HTTP:當(dāng)客戶端發(fā)送請(qǐng)求,那么服務(wù)器會(huì)直接返回?cái)?shù)據(jù)。


屏幕快照 2017-10-31 15.54.54.png

HTTPS:當(dāng)客戶端第一次發(fā)送請(qǐng)求的時(shí)候,服務(wù)器會(huì)返回一個(gè)包含公鑰的受保護(hù)空間(也成為證書),當(dāng)我們發(fā)送請(qǐng)求的時(shí)候,公鑰會(huì)將請(qǐng)求加密再發(fā)送給服務(wù)器,服務(wù)器接到請(qǐng)求之后,用自帶的私鑰進(jìn)行解密,如果正確再返回?cái)?shù)據(jù)。這就是 HTTPS 的安全性所在。


屏幕快照 2017-10-31 15.55.03.png

于是,為了實(shí)現(xiàn)通信的安全,SSL/TLS協(xié)議采用公鑰加密法,其運(yùn)行的基本流程是:
客戶端向服務(wù)器端索要并驗(yàn)證公鑰;
雙方協(xié)商生成"對(duì)話密鑰";
雙方采用"對(duì)話密鑰"進(jìn)行加密通信。

其中,第1和2步被稱為握手階段。握手階段的細(xì)節(jié)這里就不贅述,我們只需要知道,通過(guò)握手階段,客戶端和服務(wù)器端主要交換了3個(gè)信息:數(shù)字證書。該信息是我們進(jìn)行開發(fā)需要關(guān)注的!數(shù)字證書包含了公鑰等信息,一般由服務(wù)器發(fā)給客戶端,接收方通過(guò)驗(yàn)證這個(gè)證書是不是由信賴的CA簽發(fā),或者與本地的證書相對(duì)比,來(lái)判斷證書是否可信;假如需要雙向驗(yàn)證,則服務(wù)器和客戶端都需要發(fā)送數(shù)字證書給對(duì)方驗(yàn)證;
3個(gè)隨機(jī)數(shù)。3個(gè)隨機(jī)數(shù)是用于生成對(duì)話密鑰的,我們不需要關(guān)心這細(xì)節(jié)
加密通信協(xié)議??蛻舳撕头?wù)器端通信需要采取同樣的加密通信協(xié)議,我們也不需要太關(guān)注。

四、HTTPS的優(yōu)點(diǎn)

盡管HTTPS并非絕對(duì)安全,掌握根證書的機(jī)構(gòu)、掌握加密算法的組織同樣可以進(jìn)行中間人形式的攻擊,但HTTPS仍是現(xiàn)行架構(gòu)下最安全的解決方案,主要有以下幾個(gè)好處:

(1)使用HTTPS協(xié)議可認(rèn)證用戶和服務(wù)器,確保數(shù)據(jù)發(fā)送到正確的客戶機(jī)和服務(wù)器;

(2)HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,要比http協(xié)議安全,可防止數(shù)據(jù)在傳輸過(guò)程中不被竊取、改變,確保數(shù)據(jù)的完整性。

(3)HTTPS是現(xiàn)行架構(gòu)下最安全的解決方案,雖然不是絕對(duì)安全,但它大幅增加了中間人攻擊的成本。

(4)谷歌曾在2014年8月份調(diào)整搜索引擎算法,并稱“比起同等HTTP網(wǎng)站,采用HTTPS加密的網(wǎng)站在搜索結(jié)果中的排名將會(huì)更高”。

五、HTTPS的缺點(diǎn)

雖然說(shuō)HTTPS有很大的優(yōu)勢(shì),但其相對(duì)來(lái)說(shuō),還是存在不足之處的:

(1)HTTPS協(xié)議握手階段比較費(fèi)時(shí),會(huì)使頁(yè)面的加載時(shí)間延長(zhǎng)近50%,增加10%到20%的耗電;

(2)HTTPS連接緩存不如HTTP高效,會(huì)增加數(shù)據(jù)開銷和功耗,甚至已有的安全措施也會(huì)因此而受到影響;

(3)SSL證書需要錢,功能越強(qiáng)大的證書費(fèi)用越高,個(gè)人網(wǎng)站、小網(wǎng)站沒(méi)有必要一般不會(huì)用。

(4)SSL證書通常需要綁定IP,不能在同一IP上綁定多個(gè)域名,IPv4資源不可能支撐這個(gè)消耗。

(5)HTTPS協(xié)議的加密范圍也比較有限,在黑客攻擊、拒絕服務(wù)攻擊、服務(wù)器劫持等方面幾乎起不到什么作用。最關(guān)鍵的,SSL證書的信用鏈體系并不安全,特別是在某些國(guó)家可以控制CA根證書的情況下,中間人攻擊一樣可行。

六、對(duì)開發(fā)的影響。

6.1 如果是自己使用NSURLSession來(lái)封裝網(wǎng)絡(luò)請(qǐng)求,涉及代碼如下。

#import "ViewController.h"
@interface ViewController ()<NSURLSessionDataDelegate>
@end
@implementation ViewController
 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSURL *url = [NSURL URLWithString:@"https://kyfw.12306.cn/otn/leftTicket/init"];
//    NSURL *url = [NSURL URLWithString:@"https://www.apple.com/"];
//    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
    [task resume];
}
#pragma mark - NSURLSessionDataDelegate
/*
// 只要訪問(wèn)的是HTTPS的路徑就會(huì)調(diào)用
// 該方法的作用就是處理服務(wù)器返回的證書, 需要在該方法中告訴系統(tǒng)是否需要安裝服務(wù)器返回的證書
// NSURLAuthenticationChallenge : 授權(quán)質(zhì)問(wèn)
//+ 受保護(hù)空間
//+ 服務(wù)器返回的證書類型
 - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler
{
//    NSLog(@"didReceiveChallenge");
//    NSLog(@"%@", challenge.protectionSpace.authenticationMethod);

    // 1.從服務(wù)器返回的受保護(hù)空間中拿到證書的類型
    // 2.判斷服務(wù)器返回的證書是否是服務(wù)器信任的
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
        NSLog(@"是服務(wù)器信任的證書");
        // 3.根據(jù)服務(wù)器返回的受保護(hù)空間創(chuàng)建一個(gè)證書
//         void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *)
//         代理方法的completionHandler block接收兩個(gè)參數(shù):
//         第一個(gè)參數(shù): 代表如何處理證書
//         第二個(gè)參數(shù): 代表需要處理哪個(gè)證書
        //創(chuàng)建證書
        NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
        // 4.安裝證書   completionHandler(NSURLSessionAuthChallengeUseCredential , credential);    
    }
}
*/
 - (void)URLSession:(NSURLSession *)session
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
 completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
   //AFNetworking中的處理方式
    NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling;
    __block NSURLCredential *credential = nil;  
    //判斷服務(wù)器返回的證書是否是服務(wù)器信任的
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
        credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
        /*disposition:如何處理證書
     NSURLSessionAuthChallengePerformDefaultHandling:默認(rèn)方式處理
         NSURLSessionAuthChallengeUseCredential:使用指定的證書    NSURLSessionAuthChallengeCancelAuthenticationChallenge:取消請(qǐng)求
         */
        if (credential) {
            disposition = NSURLSessionAuthChallengeUseCredential;
        } else {
            disposition = NSURLSessionAuthChallengePerformDefaultHandling;
        }
    } else {
        disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;
    }
    //安裝證書
    if (completionHandler) {
        completionHandler(disposition, credential);
    }
}
// 接收到服務(wù)器的響應(yīng)
 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
    NSLog(@"didReceiveResponse");
    completionHandler(NSURLSessionResponseAllow);
}
// 接收到服務(wù)器返回的數(shù)據(jù)
 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
    NSLog(@"didReceiveData");
}
// 請(qǐng)求完畢
 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    NSLog(@"didCompleteWithError");
}
@end

1.
2AAF671EDE470AD806DC9AF0C3BF8A19.png

改為NO
2.需要http的地方需要添加白名單
3.需要注意的是如果網(wǎng)頁(yè)中包含鏈接資源比如視頻啥的,需要把視頻鏈接的地址添加到白名單,否則播不出來(lái)
4.轉(zhuǎn)https 主要是后臺(tái)改,要把網(wǎng)站轉(zhuǎn)成https頁(yè)面

iOS開發(fā)中的HTTPS:https://zhuanlan.zhihu.com/p/22749689
鏈接:http://www.itdecent.cn/p/4a8b95e33347
http://www.cnblogs.com/wqhwe/p/5407468.html
http://www.itdecent.cn/p/4b5d2d47833d

最后編輯于
?著作權(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)容