官术网_书友最值得收藏!

1.4 HTTPS簡介

HTTP最初是一個純文本協議。HTTP消息以未加密的方式通過互聯網發送,因此在消息被路由到目的地的過程中,任何一方都可以讀取到消息。顧名思義,互聯網是一個計算機網絡,而不是一個點對點系統。互聯網無法控制消息的路由方式,作為互聯網用戶,你不知道有多少第三方會看到你的消息。HTTP消息的傳播路徑很廣泛,消息被從ISP(Internet Service Provider,網絡服務提供商)發送到電信公司和其他組織。由于HTTP消息是純文本的,因此可以在途中被攔截、讀取甚至更改。

HTTPS是HTTP的安全版本,它使用TLS(Transport Layer Security,傳輸層加密)協議對傳輸中的消息進行加密,TLS的前身是我們熟知的SSL(Secure Sockets Layer,安全套接字層),如下面的引文所述。

HTTPS對HTTP消息添加了三個重要概念:

? 加密——傳輸過程中第三方無法讀取消息。

? 完整性校驗——消息在傳輸過程中未被更改,因為整個加密消息已經過數字簽名,并且該簽名在解密之前已通過加密驗證。

? 身份驗證——服務器不是偽裝的。

SSL、TLS、HTTPS和HTTP

HTTPS使用SSL或TLS加密。SSL是由Netscape發明的。SSLv1從未在Netscape之外發布,因此第一個生產版本是1995年發布的SSLv2。1996年發布的SSLv3解決了一些安全漏洞。

由于SSL由Netscape擁有,因此它不是正式的互聯網標準,盡管它隨后由IETF作為歷史文檔發布[24]。SSL被標準化為TLS(傳輸層加密)。TLSv1.0[25]與SSLv3類似,但它們不兼容。TLSv1.1[26]和TLSv1.2[27]分別于2006年和2008年推出,并且它們更加安全。TLSv1.3在2018年被批準為標準[28]。雖然還需要一些時間它才能普及,但它更安全,更高效[29]

盡管有這些標準化的、更新、更安全的版本可用,許多人還是認為SSLv3已經足夠了,所以在很長一段時間內它是事實上的標準,雖然許多客戶端已經支持TLSv1.0了。然而,在2014年,在SSLv3中發現了重大漏洞[30],SSLv3因此被要求停止使用[31],并且瀏覽器也停止對它的支持。從這時人們才開始大量向TLS遷移。在TLSv1.0中發現類似的漏洞后,安全專家強烈建議使用TLSv1.1或更高版本[32]

由于這段歷史所造成的影響,人們對這些縮寫的用法并不統一。許多人仍然將加密稱為SSL,因為它在那么長的一段時間里都是標準。其他人使用SSL/TLS或TLS。有些人試圖將其稱為HTTPS來避免爭論,即使這個術語從嚴格意義上來講并不正確。

在本書中,我們將加密稱為HTTPS(而不是SSL或SSL/TLS),除非我們專門討論TLS協議的特定部分。同時,將HTTP的核心語義稱為HTTP,無論討論未加密的HTTP連接,還是加密的HTTPS連接。

HTTPS使用公鑰加密,服務器在用戶首次連接時以數字證書的形式提供公鑰。你的瀏覽器使用此公鑰加密消息,只有服務器可以解密,因為只有它擁有配對的私鑰。該系統允許你安全地與網站進行通信,而無須事先知道共享密鑰。對于互聯網這樣的系統,這至關重要,因為每天都會有新的網站和用戶。

數字證書由瀏覽器信任的各種CA(Certificate Authorities,證書頒發機構)發布并進行數字簽名,這就是為什么可以驗證公鑰是否適用于你要連接的服務器。HTTPS的一個重大問題是,它只保證你正在連接到該服務器,而不能保證服務器值得信任。使用相似的域名(如exmplebank.com、examplebank.com),即使使用HTTPS,也可以輕松設置虛假釣魚站點。HTTPS站點通常在Web瀏覽器中顯示為綠色掛鎖,許多用戶認為這意味著安全,但其實它僅僅意味著加密

在發布證書并提供擴展驗證證書(稱為EV證書)時,一些CA會對網站進行一些額外的審查。該證書加密HTTP流量的方式和普通證書的相同,但在大多數Web瀏覽器中,該證書會顯示公司名稱,如圖1.4所示。

圖1.4 HTTPS瀏覽器標志

很多人對EV證書的優勢提出質疑[33],主要是因為絕大多數用戶不會注意到公司名稱,在使用EV和標準DV(Domain Validated域驗證)證書的站點上也沒有任何不同的行為。一部分OV(Organizational Validated,組織驗證)證書做了一些檢查,但沒有在瀏覽器中給出額外的提示,這使得它們在技術層面上基本沒有意義(盡管CA會提供額外的支持和擔保服務)。

在撰寫本書時,Google Chrome團隊正在研究和試驗這些安全提示[34],試圖刪除不必要的信息,包括協議名(httphttps)、www前綴,甚至掛鎖本身(假設HTTPS是標準情況,那么應該明確將HTTP標記為不安全的)。該團隊還在考慮是否要刪除EV。[35]

HTTPS是基于HTTP構建的,幾乎可以與HTTP協議無縫銜接。它默認在不同的端口上服務(使用443端口,而HTTP的默認端口是80)。它有一個不同的URL協議名(https://而不是http://),但除了加密和解密本身以外,它并沒有從根本上改變HTTP的語法或消息格式。

當客戶端連接到HTTPS服務器時,它將經歷協商階段(或者叫TLS握手)。在此過程中,服務器提供公鑰,客戶端和服務器協商所使用的加密方法,然后協商接下來要使用的共享密鑰。(公鑰加密很慢,因此公鑰僅用于協商共享密鑰。為了更好的性能,可用共享密鑰加密后續的消息。)第4章(4.2.1節)將詳細討論TLS握手。

建立HTTPS會話后,將交換標準HTTP消息。客戶端和服務器在發送消息之前加密消息,在接收之前解密消息。但是對于普通的Web開發者或服務器管理員來說,在配置完成后,HTTPS和HTTP沒有區別。除非你要查看通過網絡發送的原始信息,否則對你來講一切都是透明的。HTTPS封裝標準HTTP請求和響應,而不是用其他協議取代HTTP。

HTTPS是一個很大的主題,詳細討論超出了本書的范疇。在后面的章節中會再次對其做簡要介紹,因為HTTP/2給它帶來了一些變化。但就目前而言,重要的是要知道HTTPS的存在,并且在比HTTP更低的層面(TCP和HTTP之間)工作。除非你自己查看加密消息,否則你將看不到HTTP和HTTPS之間的真正區別。

對于使用HTTPS的Web服務器,你需要一個能夠支持HTTPS加密和解密的客戶端,因此你無法再使用Telnet將示例HTTP請求發送到這些服務器。OpenSSL提供了一個s_client命令,可使用該命令將HTTP命令發送到HTTPS服務器,和使用Telnet類似:

現在這些命令行工具已經完成了它們的歷史使命,在下一節中,我們將簡要介紹一些瀏覽器工具,它們提供了一種更好的方式來查看HTTP請求和響應。

主站蜘蛛池模板: 寻乌县| 买车| 古交市| 中卫市| 溧水县| 南投县| 福泉市| 隆化县| 铜鼓县| 天全县| 石柱| 平泉县| 双辽市| 漠河县| 老河口市| 平安县| 军事| 台中县| 蒲城县| 达日县| 蓬安县| 莱芜市| 怀来县| 论坛| 伊吾县| 上栗县| 安国市| 保亭| 镇宁| 慈利县| 西平县| 平和县| 翼城县| 古蔺县| 九台市| 凭祥市| 塔河县| 左贡县| 四子王旗| 边坝县| 昌平区|