在iOS開發中,是如何處理好網路加密這塊的?[個人詳細分析],ios開發
公司的介面一般會兩種協議的,一種HTTP,一種HTTPS的,HTTP 只要請求,伺服器就會響應,如果我們不對請求和響應做出加密處理,所有資訊都是會被檢測劫持到的,是很不安全的,用戶端加密可以使用本文這套工具類進行處理。
導言
公司的介面一般會兩種協議的,一種HTTP,一種HTTPS的,HTTP 只要請求,伺服器就會響應,如果我們不對請求和響應做出加密處理,所有資訊都是會被檢測劫持到的,是很不安全的,用戶端加密可以使用本文這套工具類進行處理。
但是不論在任何時候,都應該將服務置於HTTPS上,因為它可以避免中間人攻擊的問題,還內建了基於非對稱金鑰的加密通道。
HTTPS互動原理
簡答說,HTTPS 就是 HTTP協議加了一層SSL協議的加密處理,SSL 憑證就是遵守 SSL協議,由受信任的數位憑證頒發機構CA(如GlobalSign,wosign),在驗證伺服器身份後頒發,這是需要花錢滴,簽發後的認證作為公開金鑰一般放在伺服器的根目錄下,便於用戶端請求返回給用戶端,私密金鑰在伺服器的內部中心儲存,用於解密公開金鑰。
HTTPS 用戶端與伺服器互動過程:
1)用戶端發送請求,伺服器返回公開金鑰給用戶端;
2)用戶端產生對稱式加密秘鑰,用公開金鑰對其進行加密後,返回給伺服器;
3)伺服器收到後,利用私密金鑰解開得到對稱式加密秘鑰,儲存;
4)之後的互動都使用對稱式加密後的資料進行互動。
認證
簡單說,認證有兩種,一種是正經的:
CA頒發的認證
一種是不正經的:
自己產生簽發的認證
我們需要做什麼
如果遇到正經的認證,我們直接用AFNetworking 直接請求就好了,AFNetworking 內部幫我們封裝了HTTPS的請求方式,但是大部分公司介面都是不正經的認證,這時需要我們做以下幾步:
1)將伺服器的密鑰憑證拖到Xcode中
2)修改驗證模式
manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
原理
簡單來說,就是你本可以修改AFN這個設定來允許用戶端接收伺服器的任何認證,但是這麼做有個問題,就是你無法驗證認證是否是你的伺服器後端的認證,給中間人攻擊,即通過重新導向路由來分析偽造你的伺服器端開啟了大門。
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy];
securityPolicy.allowInvalidCertificates = YES;
解決方案
AFNetworking是允許內嵌認證的,通過內嵌認證,AFNetworking就通過比對伺服器端認證、內嵌的認證、網站網域名稱是否一致來驗證已連線的服務器是否正確。由於CA認證驗證是通過網站網域名稱進行驗證的,如果你的伺服器後端有綁定的網域名稱,這是最方便的。將你的伺服器端認證,如果是pem格式的,用下面的命令轉成cer格式
openssl x509 -in <你的伺服器憑證>.pem -outform der -out server.cer
然後將產生的server.cer檔案,如果有自建ca,再加上ca的cer格式認證,引入到app的bundle裡,AFNetworking在
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy AFSSLPinningModeCertificate];
或者
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy AFSSLPinningModePublicKey];
情況下,會自動掃描bundle中。cer的檔案,並引入,這樣就可以通過自簽認證來驗證伺服器唯一性了。
AFSecurityPolicy三種驗證模式
AFSSLPinningModeNone
這個模式表示不做SSL pinning,
只跟瀏覽器一樣在系統的信任機構列表裡驗證服務端返回的認證。若認證是信任機構簽發的就會通過,若是自己伺服器產生的認證就不會通過。
AFSSLPinningModeCertificate這個模式表示用認證綁定方式驗證認證,需要用戶端儲存有服務端的認證拷貝,這裡驗證分兩步,第一步驗證認證的網域名稱有效期間等資訊,第二步是對比服務端返回的認證跟用戶端返回的是否一致。
AFSSLPinningModePublicKey
這個模式同樣是用認證綁定方式驗證,用戶端要有服務端的認證拷貝,
只是驗證時只驗證認證裡的公開金鑰,不驗證認證的有效期間等資訊。只要公開金鑰是正確的,就能保證通訊不會被竊聽,因為中間人沒有私密金鑰,無法解開通過公開金鑰加密的資料。