作者:盛曠
HTTPS 是指結合 HTTP 和 SSL 來實作網絡浏覽器和伺服器之間的安全通信。HTTPS 被融合到當今網絡作業系統和網絡浏覽器中,它依賴于網絡伺服器是否支援 HTTPS 協定。本文重點是闡述 HTTPS 和 SSL 證書的原理,不涉及具體實作。在開始叙述原理之前,先明确幾個網絡安全方面的基礎概念。
一個對稱加密算法由五個部分組成:
明文:原始消息或資料
加密算法
密鑰
密文:使用密鑰通過加密算法對明文計算後的結果
解密算法:使用密文和相同密鑰通過解密算法産生原文

與對稱加密算法不同的是,非對稱加密算法使用的加密密鑰和解密密鑰是不同的。

公鑰密碼屬于對稱加密算法中的一種,公鑰密碼體系中有一個公鑰和一個密鑰,公鑰是公開給所有人使用的,密鑰隻有自己知道,通常公鑰根據一個密鑰進行加密,根據另一個密鑰進行解密。
RSA公鑰密碼算法是公鑰密碼算法中的一種,RSA中的加密和解密都可以使用公鑰或者私鑰,但是用公鑰加密的密文隻能使用私鑰解密,用私鑰加密的密文智能使用公鑰解密。
這裡隻叙述SSL證書的原理,至于如何申請證書,如何生成證書,如何部署證書可以Google得到。在介紹SSL證書前,需要先知道證書的指紋和指紋算法。
指紋是在證書資訊(證書機構,公司名,證書有效期等)後面加上一段内容,保證資訊沒有被修改過。具體操作是将将原來的資訊通過指紋算法算法(一個hash算法)計算得到指紋與原資訊一起發出去。使用者收到這份資料後,首先将原資訊用同樣的指紋算法計算結果,将得到的結果與指紋對比,如果一緻,則說明資訊沒有被修改過。當然這個過程是有危險的,黑客完全可以修改内容并重新通過指紋算法生成指紋。這裡需要使用加密算法來解決這個隐患。
假設一個公司B company向證書機構xxx CA申請SSL證書,他會得到一張類似下面這張圖的證書
B company得到這張證書後,會在與使用者通信的過程中将證書發送給使用者,使用者首先會檢測辦法證書的機構,如果是大家都公認的證書機構,作業系統在出廠時會内置這個機構的機構資訊和公鑰,例如xxx CA,如果是一個不受信任的證書機構,應用程式(比如浏覽器)會發出警告,如果是受信任的證書機構,應用程式會使用預置的xxx CA的公鑰去解密最後的指紋内容和指紋算法,然後再把前面的證書内容用指紋算法計算後與指紋内容比對,由于指紋内容是由證書機構唯一的私鑰加密的,是以隻要比對成功說明證書是沒有人被人修改過的。接下來使用者就可以放心使用該公司的公鑰了。
HTTPS的出現是為了解決網絡通信中資料傳輸不安全的問題,下面我們以登陸為例,先看一個網絡通信最簡單的過程,再一步步分析這個過程中不安全的因素以及解決辦法。
這個通信過程槽點太多,這樣一個網絡通信過程屬于國小生水準,首先最明顯一個錯誤是作為用戶端如何知道給予回應一定是目标伺服器,黑客可以有一百種辦法來僞裝這個伺服器,輕輕松松就拿到使用者的使用者名和密碼,是以圖中也隻能無奈的使用“某個位址”來辨別伺服器。為了解決這個問題,首先需要讓浏覽器确認對方的身份,于是有了下面的通信過程。
确認伺服器身份就需要用到前面說過的RSA算法了,由于RSA算法有下面這幾個特性,是以是可以用來唯一确認伺服器身份的:
私鑰的唯一性
私鑰的保密性(隻有伺服器知道這個私鑰)
隻能用公鑰解密用私鑰加密過的密文(對稱加密算法的特點)
其中“()”裡的内容是伺服器用私鑰加密後的内容,一般伺服器會将明文加密,浏覽器在收到消息後首先會用公鑰解密密文,由前面特性3可以知道,公鑰和解密算法是可以解出明文的,如果解不出來說明對方不是目标伺服器,浏覽器解密後會與明文做比對,如果比對成功,由私鑰的唯一性和保密性就可以确認對方是目标伺服器。然而确認伺服器身份後,在向伺服器發送資料的過程中,如果資料被黑客截獲,我們的使用者名和密碼也會落入黑客之手,于是下一步我們需要對發送的資料進行加密。
浏覽器對使用者名和密碼用公鑰進行加密,由于
隻能用私鑰解密用公鑰加密過的密文
于是密文隻能由伺服器用私鑰解密,黑客即使拿到密文,也是無法解密的。但是在伺服器向客戶傳回資訊的過程中就出現問題了,由于公鑰是公有的,任何人都可以拿到這份資料并使用公鑰解密,是以這裡還是存在不安全因素。于是客戶和浏覽器的通信過程多了一個步驟。
為了使浏覽器和伺服器發出的資訊都無法被别人解密,這裡使用了一個對稱加密算法,而算法和密鑰的加密是在浏覽器用公鑰來加密的,這樣可以保證隻有伺服器才能用私鑰來解密這個内容,也就是保證對稱加密算法和密鑰隻能被伺服器拿到。當伺服器拿到對稱加密算法和密鑰後,後面的通信都能使用這個對稱加密算法來完成,由于對稱加密算法和密鑰隻有客戶和伺服器知道,後面的通信加密過程都是無法被破解的。
到這裡,基本就是HTTPS通信的整個過程了,似乎整個過程都很難被黑客破解,但是注意到前面的所有過程都預設了一個前提,那就是客戶手裡已經擁有公鑰。公鑰的擷取如果隻是在客戶和伺服器之間進行的話,是存在很大的安全隐患的,最直接的問題就是使用者怎麼确定拿到的公鑰就是目标伺服器的公鑰,類似“證明‘能證明你身份’的憑證是你的”這樣的命題,最好的解決辦法是引入一個大家都信任的第三方來“證明這個憑證”是伺服器的,于是這裡就使用了SSL證書。前面提到,通過發送SSL證書伺服器可以将公鑰安全的交給使用者,而這裡的第三方就是證書機構。于是我們得到了一個完整的HTTPS通信過程。
到這裡已經基本講完了SSL證書與HTTPS的原理,當然實際通信過程中還有很多細節沒有說到,但是不妨礙了解原理。實際開發和生産過程中很多資訊敏感的操作都可以參照這種思想來實作,文中有不合理的和錯誤的地方歡迎指正。
傳輸層安全協定
數字證書原理
SSL/TLS協定運作機制的概述
最後,歡迎申請使用騰訊雲的SSL證書 具體SSL證書使用方法參考