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ù)。

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 的安全性所在。

于是,為了實(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.
改為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