HTTPS 和 加密 和 AFNetworking 證書驗證

weixin_34087301發表於2017-07-25

一、在做加密的時候突然想到一個問題,就是我們都已經用 HTTPS 傳輸了,為什麼還要加密呢?

既然有了這個疑惑,就抽空自己解惑了,翻閱資料,沒想到零零散散看了許多方面。今天總結下。

首先來解決自己的疑惑為什麼我們還要加密。

第一步來了解下 HTTPS 傳輸協議:

HTTPS 是兩部分組成:HTTP + SSL/TSL,就是在 HTTPS 加了一層加密處理。HTTPS 的作用是對在客戶端和伺服器端之間的傳輸進行加密處理。(這句話很關鍵,就解答了為什麼我們還要加密,因為HTTPS僅僅保護的是傳輸過程中的安全)。HTTPS是資料加密,對於一些埠,網址等並不進行加密處理。(對於抓包軟體抓到的包是明文,因為你客戶端直接通訊的是抓包軟體)。具體過程怎麼加密和解密,如下圖:

4640138-ed91d56480d7bfcd.png

1、第一步向伺服器端發出請求,連線到伺服器端的 443 埠。

2、採用 HTTPS 協議的伺服器必須有一套數字證書,可以自己製作,也可以向組織申請。區別就是自己頒發的證書需要客戶端驗證通過,才可以繼續方法,而使用信任的公司申請的證書則不會彈出信任彈框。這套證書分別分為公鑰和私鑰。公鑰就是用來加密,私鑰用來解密。

3、伺服器將公鑰放在response中傳給客戶端。

4、客戶端就行解析(當然不需要我們操作)。由客戶端的 TLS 來完成。驗證公鑰是否有效,頒發機構,過期時間等等。證書驗證通過產生隨機數,用公鑰將隨機數進行加密。

5、將用公鑰加密過的key傳給伺服器。以後可以通過該key進行加密。

6、伺服器通過使用私鑰將用公鑰加密過的key進行解密,獲取客戶端和伺服器端都擁有的key。

7、通過用私鑰解密過後的key對資料進行加密,返回給客戶端。

8、客戶端使用 key 將返回的資料進行解密。


二、AFSecurityPolicy

對於自制證書,在AFNetworking 請求時最好加上 SSL Pinning。

NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"12306" ofType:@"cer"];//證書的路徑

NSData *certData = [NSData dataWithContentsOfFile:cerPath];

NSSet *set = [NSSet setWithObject:certData];

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey withPinnedCertificates:set;

securityPolicy.allowInvalidCertificates=YES; // 允許自建證書

securityPolicy.validatesDomainName=NO; // 是否開啟域名驗證

Mode::AFSSLPinningModePublicKey 防止證書過期此時要重新打包上線。

即在請求特定伺服器時,AFNetworking 會對伺服器傳來的證書就行驗證。通過則就繼續請求,失敗則取消請求。

對於組織申請的也可以通過 SSL Pinning 來驗證,來提高被攻擊的成本。

參考連結

http://nelson.logdown.com/posts/2015/04/29/how-to-properly-setup-afnetworking-security-connection/

http://io.diveinedu.com/2016/01/09/iOS%E5%BA%94%E7%94%A8%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E4%B9%8BHTTPS.html

https://huang303513.github.io/2017/04/26/AFNetWorking%E6%BA%90%E7%A0%81%E4%B9%8BAFSecurityPolicy.html

http://blog.csdn.net/clh604/article/details/22179907

相關文章