本文借鑒于: http://www.cnblogs.com/oc-bowen/p/5896041.html
最近研究一些關于https的使用汤徽,看了下一些相關資料,主要分為三個部分
1. HTTPS 簡要原理
2. 數學證書的內容讨便,生產以及驗證
3.iOS上對證書鏈的驗證
HTTPS 概要
HTTPS 是運行在 TLS/SSL 之上的 HTTP,與普通的 HTTP 相比啦撮,在數據傳輸的安全性上有很大的提升苟呐。
要了解它安全性的巧妙之處,需要先簡單地了解對稱加密和非對稱加密的區(qū)別:
對稱加密只有一個密鑰坝撑,加密和解密都用這個密鑰静秆;
非對稱加密有公鑰和私鑰,私鑰加密后的內容只有公鑰才能解密巡李,公鑰加密的內容只有私鑰才能解密抚笔。
為了提高安全性,我們常用的做法是使用對稱加密的手段加密數據侨拦∈獬龋可是只使用對稱加密的話,雙方通信的開始總會以明文的方式傳輸密鑰。那么從一開始這個密鑰就泄露了膨蛮,談不上什么安全叠纹。所以
TLS/SSL 在握手的階段,結合非對稱加密的手段敞葛,保證只有通信雙方才知道對稱加密的密鑰誉察。大概的流程如下:
https是運行在TLS/SSL之上的HTTP,與普通的HTTP相比制肮,在數據傳輸的安全性上有很大的提升冒窍。要了解它的安全性的巧妙之處递沪,
HTTPS
就是HTTP協(xié)議添加了一層SSL協(xié)議加密的處理豺鼻,SSL證書就是遵守SSL協(xié)議,由受信任的數字證書頒發(fā)機構CA,在驗證服務器身份后頒發(fā)款慨,這是需要花錢滴儒飒,簽發(fā)后的證書作為公鑰一般放在服務器的根目錄下的,便于客戶端請求返回給客戶端檩奠,私鑰在服務器的內部中心保存桩了,用于解密公鑰。
HTTPS客戶端和服務器交互過程:
1.客戶端發(fā)送請求埠戳,服務器返回公鑰給客戶端井誉;
2.客戶端生產對稱加密秘鑰,用公鑰對其進行加密后整胃,返回給服務器
3.服務器收到后颗圣,利用私鑰解開后得帶對稱加密秘鑰,保存
4.之后的交互都使用對稱加密后的數據進行交互
遇到是CA機構頒發(fā)的正經證書屁使,我們直接可以用AFNetworking 直接請求就OK在岂,它內部幫我們封裝好了https的請求方式,
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,
只跟瀏覽器一樣在系統(tǒng)的信任機構列表里驗證服務端返回的證書皆的。若證書是信任機構簽發(fā)的就會通過覆履,若是自己服務器生成的證書就不會通過。
AFSSLPinningModeCertificate
這個模式表示用證書綁定方式驗證證書费薄,需要客戶端保存有服務端的證書拷貝硝全,這里驗證分兩步,第一步驗證證書的域名有效期等信息楞抡,第二步是對比服務端返回的證書跟客戶端返回的是否一致述召。
AFSSLPinningModePublicKey
這個模式同樣是用證書綁定方式驗證秽浇,客戶端要有服務端的證書拷貝阿纤,
只是驗證時只驗證證書里的公鑰涯穷,不驗證證書的有效期等信息。只要公鑰是正確的柱恤,就能保證通信不會被竊聽数初,因為中間人沒有私鑰,無法解開通過公鑰加密的數據梗顺。