1. 對稱加密與非對稱加密
在介紹https加密過程前,需要先簡單瞭解下其中用到的加密演算法。
對稱加密演算法:用該金鑰加密的資料,可以再用該金鑰解密。效能高,速度快。常見的對稱加密演算法有DES,AES。
非對稱加密演算法:生成一對金鑰對,分別稱為公鑰、私鑰。用公鑰加密的資料只能由私鑰解密。用私鑰加密的資料只能由公鑰解密。公鑰資訊是公開的,私鑰由自己保管。效能低,速度慢,安全性高。常見的非對稱加密演算法有RSA。
2. https與加密
https與http相比,最大的不同就是保證了資料加密傳輸,保證資訊不被洩露,不被篡改(中間人攻擊)。這就涉及到加密演算法的選型。
對稱加密:
- 瀏覽器與網站伺服器雙方都需要共同持有金鑰。這就需要金鑰由任意一端生成,再傳輸給另一端。由於金鑰的傳輸過程沒有加密策略,就會產生洩露風險。該方案不可取。
非對稱加密:
- 由網站伺服器生成一對公私鑰,在處理請求時,對請求資料用私鑰加密。瀏覽器接受資料時用公鑰解密。由於公鑰是公開的,任意一方都能夠獲取。所以除了瀏覽器,其他人也可以破戒該資料。該方案不可取。
- 網站伺服器生成公鑰A,私鑰A'。瀏覽器生成公鑰B,私鑰B'。伺服器處理請求時候,用瀏覽器的公鑰B加密。瀏覽器接受請求時,用私鑰B'解密。同理,瀏覽器發起請求時用公鑰A加密,伺服器用A'解密。這種方案理論上是可行的,但由於非對稱加密速度很慢,這會導致每一個請求響應時間都變長。該方案不可取。
對稱加密 + 非對稱加密:
- 利用對稱加密的高效能,與非對稱加密的安全性,完成https加密過程。網站伺服器生成公鑰A,私鑰A'。將公鑰A明文傳輸給瀏覽器。瀏覽器生成金鑰X,並用公鑰A對金鑰X加密,傳輸給網站伺服器。網站伺服器用私鑰A'解密。這樣瀏覽器與網站伺服器就都擁有了金鑰X,接下來用金鑰X做對稱加密,處理請求即可。這種方案是可行的,但是存在中間人攻擊風險。
- 中間人會在網站伺服器明文傳輸公鑰A的過程中,篡改請求,將公鑰A替換為自己生成的公鑰F。瀏覽器拿到公鑰F後對金鑰X加密,傳輸給網站伺服器。中間人在該傳輸過程中再用自己的私鑰F'對資料解密,拿到金鑰X。再用網站的公鑰A加密該資料,傳輸給網站伺服器。這樣在瀏覽器和網站伺服器毫不知情的情況下,金鑰X就被中間人獲取。
對稱加密 + 非對稱加密 + 站點證書:
- 上述方案最大的問題在於,瀏覽器無法得知公鑰A是由該網站伺服器傳送而來,還是由中間人發來的。為了證明公鑰A確實屬於該網站,就需要一份“數字證書”,來證明該公鑰確實屬於該網站。該種方案就是現在的https加密過程。
3. ca機構與數字證書
頒發數字證書的機構稱作ca機構。ca機構與數字證書的關係,就像政府與身份證。政府是可信的,政府頒發出的身份證也是可信的。
摘要演算法(又稱雜湊演算法、雜湊演算法):
- 摘要演算法的目的,是將不同長度的原文(資料),整理計算成長度相同的資料。長度相同的好處在於,後續對其簽名的效率提升。摘要演算法還用於防原文篡改的場景中。即使只對原文新增了一個空格,都會導致重新摘要後的值發生很大不同。
- 常見的摘要演算法有:md5,sha1,sha256。md5計算出的資料長度為128,sha1為160,sha256為256位。長度越短,越容易產生資料碰撞(不同的原文計算出了相同的雜湊值)。由於md5與sha1已被技術破解,2015年12月31號後,瀏覽器已不再信任非sha256摘要頒發出的證書。
數字證書:
-
申請數字證書需要csr檔案。目前主流的csr檔案資料結構為PKCS10(簡稱P10)。P10結構體為:
certificationRequestInfo // 證書請求體,包括使用人名稱、主體公鑰 signatureAlgorithm // 簽名演算法 signature // 用主體私鑰對證書請求體做的簽名,加密演算法為上一個值
-
每個ca機構都有自己的一對公私鑰。當ca機構接收到csr請求後,將csr與證書有效期、證書序列號等資訊一起,包裝為證書體,最後用自己的私鑰對其進行簽名,完成證書頒發。最後的證書結構體為(X509結構體):
tbsCertificate // to be signed 證書體,包括證書有效期、序列號、申請人資訊、申請人公鑰等資料 signatureAlgorithm // 簽名演算法 signatureValue // 用ca私鑰對to be signed資料做的簽名,加密演算法為上一個值
-
瀏覽器(或adobe reader等pdf閱讀器)都安裝了全球可信的ca機構根節點。當網站伺服器未用可信根機構的ca證書時,瀏覽器會有警告提示。國內常見的ca機構有:上海ca、cfca、廣東ca。
4. https加密全過程
-
網站伺服器生成一對公鑰A,私鑰A'。用公鑰A製作成csr請求,向ca機構申請一份站點證書。ca機構用自己的私鑰,對證書體簽名,完成證書製作,頒發給該網站。
-
瀏覽器嘗試與伺服器構建SSL連線。伺服器將自己的站點證書傳送給瀏覽器。伺服器對證書進行驗證:
- 用頒發該證書的ca機構公鑰,對證書籤名進行解密,得到解密原文S'。
- 用證書中提到的雜湊演算法,對證書體進行摘要演算法,得到摘要H'。
- 判斷S' == H'。若相等,證明證書確實由該ca機構頒發。
- 站點證書中包含了域名等資訊,即使中間人也有該ca機構頒發的證書,也無法進行調包。證明證書確實是該網站伺服器的。
-
驗證完畢,拿到證書中的網站公鑰A。瀏覽器再生成金鑰X,用公鑰A對金鑰X加密,傳輸給網站伺服器。伺服器用私鑰A'對其解密,拿到金鑰X。
-
伺服器為每一個瀏覽器維護一個session id。當獲取金鑰X後,將其儲存在session中。瀏覽器後續請求都會攜帶session id,伺服器直接從session中拿到金鑰X即可,不需要每次都做上述傳輸工作。
-
後續所有請求傳輸都用金鑰X進行對稱加密。
5. 是否存在他人偽造瀏覽器,與服務端互動的情況
中間人可以拿到伺服器的證書公鑰,自己包裝一個對稱金鑰X,直接與伺服器互動。但這並沒有意義,因為伺服器總是會校驗請求的異常情況,所以不需要考慮這種場景。