以前看了一些網上關於https的文章,感受都講的不夠完善,整篇看下來仍是以爲有幾個疑問點,最近學習了極客時間《透視HTTP協議》,稍微能摸清楚https的工做,寫一寫增強印象。算法
一般認爲,通訊過程具有了如下4個特性,能夠認爲安全:機密性,完整性,身份認證,不能否認。瀏覽器
HTTPS是運行在SSL/TLS上的HTTP,只要弄懂了SSL/TSL就弄懂了HTTPS,而SSL/TLS是在OSI模型中處於第5層會話層中,目前運用最普遍的TLS是v1.2版本,最新的v1.3兼容了v1.2,且強大了不少。
TLS由記錄協議,握手協議,警告協議,變動密碼協議,擴展協議等幾個子協議組成,綜合使用了對稱加密,非對稱加密,身份驗證等多個前沿密碼學技術。安全
安全的第1個特性是機密性,那麼實現機密性最經常使用的手段就是對數據進行「加密」,把數據經過某種形式轉化爲誰都看不懂的亂碼,只有特定的「鑰匙」的人才能解密數據。加密能夠分爲兩大類:對稱加密和非對稱加密。服務器
對稱加密的加密和解密的密鑰都是同一個,因此是「對稱」的,只要保證了密鑰只有通訊雙方持有,那麼整個通訊過程就具備了機密性。
目前最經常使用的對稱加密算法是AES(advanced encryption standard),安全強度高,性能也很好,因此最流行。dom
對稱加密還有個分組模式的概念,他可讓加密算法用固定長度的密鑰加密任意長度的明文,即小祕密轉化爲大祕密,將明文按照必定的規則切分,而後分別對明文片斷進行加密,再整合成一塊兒。如今最多見的分組模式是GCM/CCM/Poly1305,tcp
對稱加密最大的問題就是如何讓通訊兩方都知道一個密鑰,總不能爲了傳輸這個密鑰再用另外一個密鑰進行加密吧,那就是「雞生蛋,蛋生雞」的問題沒完沒了了。
因此非對稱加密就出來了。它有兩個密鑰,一個是「公鑰」,一個是「私鑰」,兩個密鑰不一樣,因此「不對稱」,私鑰必須嚴格保密,公鑰能夠公開給任何人使用。
這裏有個特別的「單向性」,公鑰加密的數據只能夠用私鑰解密,反之私鑰加密的數據只能夠用公鑰解密,常見算法有RSA/ECC。性能
在TLS1.2版本里最經常使用的非對稱加密算法,因爲不具備「向前安全」,因此在1.3版本中被棄用了。學習
是非對稱加密算法的後起之秀,他基於「橢圓曲線離散對數」的數學難題,用特定的曲線方程和基點生成一個公鑰和一個私鑰。子算法ECDHE用於密鑰交換,ECDSA用於數字簽名。加密
爲何TLS不直接使用非對稱加密呢spa
因此TLS只是用非對稱加密算法讓雙方得到一個對稱加密算法的密鑰,後續的通訊使用該密鑰進行。
雖然有了機密性,可是離安全還差很遠
黑客雖然拿不到密鑰,可是能夠經過竊聽收集足夠多的密文,嘗試修改/重組後發給服務器,由於沒有完整性檢查,服務器正常返回,黑客能夠經過服務器的響應獲取進一步線索,最終破解密鑰。
另外,黑客也能夠僞造公鑰發佈,若是客戶端拿到了假的公鑰匙,那麼再怎麼加密都沒有用了,被黑客直接攔截,直接裸奔。。
實現完整性的手段主要是摘要算法,摘要意思就是原文的總結,歸納,一個原文經過一種摘要算法只有一個摘要,因此摘要能夠認爲是原文的「指紋」,MD5和SHA-1是以前常見的摘要算法,可是因爲安全性不足,被棄用了,如今經常使用的是SHA-2。
現實生活中解決身份認證的常見的有蓋章,簽名。一樣的,在通訊中要想實現身份認證,首先得有個惟一的東西只要你擁有——那就是非對稱加密中的私鑰。使用私鑰加密摘要,就可以實現數字簽名,實現了身份認證的同時也實現了不能否認。
綜合上述,咱們已經實現了安全的4大特性,是否是ok了?
不是。
這樣還有公鑰的信任,由於誰均可以發佈公鑰,咱們怎麼證實這個公鑰就是通訊對方的公鑰呢?
只能引入「可信的第三方」,這個第三方就是咱們常說的CA,由他來給各個公鑰簽名,用自身的信譽作擔保,構建起公鑰的信任鏈。
CA對公鑰的簽名認證也是由必定格式的,包括序列號,用途,頒發者,有效時間,公鑰等等,再打一個包再簽名,造成一個數字證書。
圖上的每個直線表明的是一個記錄協議,多個記錄協議會在一個tcp包中一同送出。
客戶端發送一個change cipher spec和finished。再將以前發送的全部數據作個摘要,再用密鑰加密一下,讓服務器驗證一下。
大致流程跟上述一致,只是pre-master再也不經過算法生成,而是客戶端直接生成隨機數,而後用服務器的公鑰加密,經過發送一個client key exchange發送給服務器,那此時雙方也實現了共享3個隨機參數。