爲什麼要有 HTTPS?
由於 HTTP 天生“明文”的特點,整個傳輸過程完全透明,任何人都能夠在鏈路中截獲、修改或者僞造請求 / 響應報文,數據不具有可信性。
什麼是安全?
通常認爲,如果通信過程具備了四個特性,就可以認爲是“安全”的,這四個特性是:機密性、完整性,身份認證和不可否認。
- 機密性(Secrecy/Confidentiality)是指對數據的“保密”,只能由可信的人訪問,對其他人是不可見的“祕密”,簡單來說就是不能讓不相關的人看到不該看的東西。
- 完整性(Integrity,也叫一致性)是指數據在傳輸過程中沒有被竄改,不多也不少,“完完整整”地保持着原狀。機密性雖然可以讓數據成爲“祕密”,但不能防止黑客對數據的修改,黑客可以替換數據,調整數據的順序,或者增加、刪除部分數據,破壞通信過程。
- 身份認證(Authentication)是指確認對方的真實身份,也就是“證明你真的是你”,保證消息只能發送給可信的人。
- 不可否認(Non-repudiation/Undeniable),也叫不可抵賴,意思是不能否認已經發生過的行爲,不能“說話不算數”“耍賴皮”。
什麼是 HTTPS?
HTTPS 其實是一個“非常簡單”的協議,RFC 文檔很小,只有短短的 7 頁,裏面規定了新的協議名“https”,默認端口號 443,至於其他的什麼請求 - 應答模式、報文結構、請求方法、URI、頭字段、連接管理等等都完全沿用 HTTP,沒有任何新的東西。
你可能要問了,既然沒有新東西,HTTPS 憑什麼就能做到機密性、完整性這些安全特性呢?
祕密就在於 HTTPS 名字裏的“S”,它把 HTTP 下層的傳輸協議由 TCP/IP 換成了SSL/TLS,由“HTTP over TCP/IP”變成了“HTTP over SSL/TLS”,讓 HTTP 運行在了安全的 SSL/TLS 協議上(可參考第 4 講和第 5 講),收發報文不再使用 Socket API,而是調用專門的安全接口。
所以說,HTTPS 本身並沒有什麼“驚世駭俗”的本事,全是靠着後面的 SSL/TLS“撐腰”。只要學會了 SSL/TLS,HTTPS 自然就“手到擒來”。
SSL/TLS
SSL 即安全套接層(Secure Sockets Layer),在 OSI 模型中處於第 5 層(會話層),由網景公司於 1994 年發明,有 v2 和 v3 兩個版本,而 v1 因爲有嚴重的缺陷從未公開過。
SSL 發展到 v3 時已經證明了它自身是一個非常好的安全通信協議,於是互聯網工程組 IETF在 1999 年把它改名爲 TLS(傳輸層安全,Transport Layer Security),正式標準化,版本號從 1.0 重新算起,所以 TLS1.0 實際上就是 SSLv3.1。
到今天 TLS 已經發展出了三個版本,分別是 2006 年的 1.1、2008 年的 1.2 和去年(2018)的 1.3,每個新版本都緊跟密碼學的發展和互聯網的現狀,持續強化安全和性能,已經成爲了信息安全領域中的權威標準。
目前應用的最廣泛的 TLS 是 1.2,而之前的協議(TLS1.1/1.0、SSLv3/v2)都已經被認爲是不安全的,各大瀏覽器即將在 2020 年左右停止支持,所以接下來的講解都針對的是TLS1.2。
TLS 由記錄協議、握手協議、警告協議、變更密碼規範協議、擴展協議等幾個子協議組成,綜合使用了對稱加密、非對稱加密、身份認證等許多密碼學前沿技術。
瀏覽器和服務器在使用 TLS 建立連接時需要選擇一組恰當的加密算法來實現安全通信,這些算法的組合被稱爲“密碼套件”(cipher suite,也叫加密套件)。
ECDHE-RSA-AES256-GCM-SHA384
這麼長的名字看着有點暈吧,不用怕,其實 TLS 的密碼套件命名非常規範,格式很固定。基本的形式是“密鑰交換算法 + 簽名算法 + 對稱加密算法 + 摘要算法”,比如剛纔的密碼套件的意思就是:
“握手時使用 ECDHE 算法進行密鑰交換,用 RSA 簽名和身份認證,握手後的通信使用AES 對稱算法,密鑰長度 256 位,分組模式是 GCM,摘要算法 SHA384 用於消息認證和產生隨機數。”
OpenSSL
說到 TLS,就不能不談到 OpenSSL,它是一個著名的開源密碼學程序庫和工具包,幾乎支持所有公開的加密算法和協議,已經成爲了事實上的標準,許多應用軟件都會使用它作爲底層庫來實現 TLS 功能,包括常用的 Web 服務器 Apache、Nginx 等。
OpenSSL 是從另一個開源庫 SSLeay 發展出來的,曾經考慮命名爲“OpenTLS”,但當時(1998 年)TLS 還未正式確立,而 SSL 早已廣爲人知,所以最終使用了“OpenSSL”的名字。
OpenSSL 目前有三個主要的分支,1.0.2 和 1.1.0 都將在今年(2019)年底不再維護,最新的長期支持版本是 1.1.1,我們的實驗環境使用的 OpenSSL 是“1.1.0j”。
由於 OpenSSL 是開源的,所以它還有一些代碼分支,比如 Google 的 BoringSSL、OpenBSD 的 LibreSSL,這些分支在 OpenSSL 的基礎上刪除了一些老舊代碼,也增加了一些新特性,雖然背後有“大金主”,但離取代 OpenSSL 還差得很遠。
小結
- 因爲 HTTP 是明文傳輸,所以不安全,容易被黑客竊聽或竄改;
- 通信安全必須同時具備機密性、完整性,身份認證和不可否認這四個特性;
- HTTPS 的語法、語義仍然是 HTTP,但把下層的協議由 TCP/IP 換成了 SSL/TLS;
- SSL/TLS 是信息安全領域中的權威標準,採用多種先進的加密技術保證通信安全;
- OpenSSL 是著名的開源密碼學工具包,是 SSL/TLS 的具體實現。