由《HTTPS權威指南》-協議學習筆記知道了握手協議中身份驗證流程,這裏再摘出一遍:
一、Client向Server say hello
二、Server將明文信息(包含publicKey_server)用協商的散列算法散列、編碼而後用privateKey_server加密製做成了簽名。將簽名以及明文信息發送給Client。
三、Client用協商的散列算法計算明文的散列,使用publicKey_server解密服務器的簽名,對比本身計算出的散列是否和服務器給的散列一致。從而實現服務器的身份驗證。html
這樣作的危險:
危險1:
一、若是Attacker截獲了Client的say hello,能夠把publicKey_attacker返回給Client,取得Client的信任,至此Attacker與Client創建了安全鏈接。
二、Attacker冒充Client向Server發送say hello,至此Attacker與Server創建了安全鏈接。
三、這樣,Client對Server發送的信息都被Attacker截獲並解密了。
危險2:
一、服務器能夠否定本身發送過的消息。算法
如何避免?
Client信任一些第三方權威機構(CA),而後由這些CA對Server的證書(包含了publicKey_Server)進行簽名,Server提供這個被CA簽名的證書給Client驗證。
這樣就造成了信任流:Client 信任 CA, CA信任Server,So Client信任Server。從而達到Server的身份驗證。
PKI(public key infrastructure公鑰基礎設施)就是用來解決如何使用和驗證證書的。當前使用的是基於可信的第三方機構,也就是證書頒發機構CA簽發證書。vim
實現流程圖:瀏覽器
所涉及到的新名詞:安全
證書:包含公鑰,訂閱人相關信息,以及證書頒發者數字簽名的數字文件。證書讓咱們能夠交換,存儲和使用公鑰,是整個PKI體系的基礎組成元素。服務器
中間CA證書:根CA是很是重要的,若是根CA的密鑰被泄漏了,那麼就能夠簽發任意虛假證書,這時若是把根CA吊銷掉,全部使用過這個CA簽發的證書的網站都將沒法訪問。因此直接由根證書籤發最終實體證書是不容許的。證書發行商們爲了安全,一般會將這些根證書對應的私鑰保存在絕對斷網的金庫裏。在金庫裏用這些根私鑰,簽發一些「中級」證書,這些中級證書的私鑰擁有簽發再下一級證書的權限。這些中級私鑰被安裝到在線服務器上,經過簽發網站證書來賺錢。一旦這些服務器被黑,發行商就能夠利用金庫裏物理隔離的根證書私鑰,能夠簽發吊銷令,消滅這些中級證書的信任,而沒必要讓各家瀏覽器完全不信任這家發行商的根證書。再籤一條新的中級發行證書,又是一條能賺錢的好漢。引自:SSL證書鏈不完整問題:中間證書果真是個坑。app
根證書:根證書是CA給本身頒發的證書,是信任鏈的起始點。安裝根證書意味着對這個CA認證中心的信任。post
證書鏈:CA在驗證成功以後就會簽發證書。除了證書自己,CA還會提供全部的中間證書,從而構成了證書鏈到對應的根證書上。由於信賴方只保存着根證書,因此要經過證書鏈找到根證書來驗證。學習
身份驗證流程:
一、信賴方添加可信任根證書庫,根證書庫中保存着可信任的CA的根證書
例如Apple:
Apple維護的根證書庫主要是給iOS和OSX平臺使用,若是某個CA但願加入到Apple的根證書庫裏面的話,就須要經過權威機構審計而且對Apple的客戶有商業價值。
二、證書訂閱人找到信賴方所信賴的CA的登記機構,發送CSR,申請簽名。
三、登記機構經過CA頒發給證書訂閱人證書。
四、信賴方要求服務器進行身份驗證。
五、服務器發送證書鏈給信賴方。
六、信賴方經過本身的根證書庫對證書鏈進行驗證(驗證簽名是否正確,檢查證書是否已經吊銷)。
七、握手流程中的身份驗證結束,開始使用證書中的公鑰進行密鑰交換流程。網站
示例場景:
對於Client:
一、根CA有一個金庫,保存着本身的私鑰:privateKey_CA
二、根CA把本身的根證書(使用本身的私鑰自簽名證書)植入到Client中,根證書包含着:publicKey_CA
三、基於上面兩個步驟,Client就能夠驗證根CA的簽名了。
對於中間CA:
一、中間CA擁有根CA中的金庫的私鑰的簽名(獲取了根CA的信任),有派發子證書的權利。
對於Server:
一、Server將本身的CSR(包含publicKey_Server,但不包含privateKey_Server)給RA,RA審覈後給中間CA,請求中間CA簽名(至關於獲取中間CA的信任)。
二、中間CA使用本身的私鑰給Server的證書籤名。
對於Client驗證Server:
一、在Client要求驗證Server身份時,Server將由中間CA簽名的證書鏈發給Client。
二、Client能夠從證書鏈尋找到根證書
三、Client從本身信任的根證書庫中尋找對應的根證書來驗證。
四、驗證經過後,使用publicKey_Server來開始握手流程中的密鑰交換。
參考文章:
ATS配置官方說明
蘋果強制使用HTTPS傳輸後APP開發者必須知道的事
SSL證書鏈不完整問題:中間證書果真是個坑。
關於iOS9中的App Transport Security相關說明及適配(更新於2016.7.1)
騰訊雲申請SSL證書
iOS使用自簽名證書實現HTTPS請求
iOS 升級HTTPS經過ATS你所要知道的
AFNetworking之於https認證
個人簡書主頁:www.jianshu.com/users/b92ab…