重庆幸运农场中奖金额|重庆幸运农场官网
MyException - 我的異常網
當前位置:我的異常網» 綜合 » 聊聊HTTPS和SSL/TLS協議

聊聊HTTPS和SSL/TLS協議

www.h0f1.com  網友分享于:2015-02-04  瀏覽:0次

要說清楚 HTTPS 協議的實現原理,至少需要如下幾個背景知識。
1. 大致了解幾個基本術語(HTTPS、SSL、TLS)的含義
2. 大致了解 HTTP 和 TCP 的關系(尤其是“短連接”VS“長連接”)
3. 大致了解加密算法的概念(尤其是“對稱加密與非對稱加密”的區別)
4. 大致了解 CA 證書的用途

考慮到很多技術菜鳥可能不了解上述背景,俺先用最簡短的文字描述一下。如果你自認為不是菜鳥,請略過本章節,直接去看“HTTPS 協議的需求”。
先澄清幾個術語——HTTPS、SSL、TLS


1. “HTTP”是干嘛用滴?

首先,HTTP 是一個網絡協議,是專門用來幫你傳輸 Web 內容滴。關于這個協議,就算你不了解,至少也聽說過吧?比如你訪問俺的博客的主頁,瀏覽器地址欄會出現如下的網址
http://www.techug.com/

俺加了粗體的部分就是指 HTTP 協議。大部分網站都是通過 HTTP 協議來傳輸 Web 頁面、以及 Web 頁面上包含的各種東東(圖片、CSS 樣式、JS 腳本)。


2. “SSL/TLS”是干嘛用滴?

SSL 是洋文“Secure Sockets Layer”的縮寫,中文叫做“安全套接層”。它是在上世紀90年代中期,由網景公司設計的。(順便插一句,網景公司不光發明了 SSL,還發明了很多 Web 的基礎設施——比如“CSS 樣式表”和“JS 腳本”)
為啥要發明 SSL 這個協議捏?因為原先互聯網上使用的 HTTP 協議是明文的,存在很多缺點——比如傳輸內容會被偷窺(嗅探)和篡改。發明 SSL 協議,就是為了解決這些問題。
到了1999年,SSL 因為應用廣泛,已經成為互聯網上的事實標準。IETF 就在那年把 SSL 標準化。標準化之后的名稱改為 TLS(是“Transport Layer Security”的縮寫),中文叫做“傳輸層安全協議”。
很多相關的文章都把這兩者并列稱呼(SSL/TLS),因為這兩者可以視作同一個東西的不同階段。


3. “HTTPS”是啥意思?

解釋完 HTTP 和 SSL/TLS,現在就可以來解釋 HTTPS 啦。咱們通常所說的 HTTPS 協議,說白了就是“HTTP 協議”和“SSL/TLS 協議”的組合。你可以把 HTTPS 大致理解為——“HTTP over SSL”或“HTTP over TLS”(反正 SSL 和 TLS 差不多)。
再來說說 HTTP 協議的特點

作為背景知識介紹,還需要再稍微談一下 HTTP 協議本身的特點。HTTP 本身有很多特點,考慮到篇幅有限,俺只談那些和 HTTPS 相關的特點。


1. HTTP 的版本和歷史

如今咱們用的 HTTP 協議,版本號是 1.1(也就是 HTTP 1.1)。這個 1.1 版本是1995年底開始起草的(技術文檔是 RFC2068),并在1999年正式發布(技術文檔是 RFC2616)。
在 1.1 之前,還有曾經出現過兩個版本“0.9 和 1.0”,其中的 HTTP 0.9 【沒有】被廣泛使用,而 HTTP 1.0 被廣泛使用過。
另外,據說明年(2015)IETF 就要發布 HTTP 2.0 的標準了。俺拭目以待。


2. HTTP 和 TCP 之間的關系

簡單地說,TCP 協議是 HTTP 協議的基石——HTTP 協議需要依靠 TCP 協議來傳輸數據。
在網絡分層模型中,TCP 被稱為“傳輸層協議”,而 HTTP 被稱為“應用層協議”。

有很多常見的應用層協議是以 TCP 為基礎的,比如“FTP、SMTP、POP、IMAP”等。
TCP 被稱為“面向連接”的傳輸層協議。關于它的具體細節,俺就不展開了(否則篇幅又失控了)。你只需知道:傳輸層主要有兩個協議,分別是 TCP 和 UDP。TCP 比 UDP 更可靠。你可以把 TCP 協議想象成某個水管,發送端這頭進水,接收端那頭就出水。并且 TCP 協議能夠確保,先發送的數據先到達(與之相反,UDP 不保證這點)。


3. HTTP 協議如何使用 TCP 連接?

HTTP 對 TCP 連接的使用,分為兩種方式:俗稱“短連接”和“長連接”(“長連接”又稱“持久連接”,洋文叫做“Keep-Alive”或“Persistent Connection”)
假設有一個網頁,里面包含好多圖片,還包含好多【外部的】CSS 文件和 JS 文件。在“短連接”的模式下,瀏覽器會先發起一個 TCP 連接,拿到該網頁的 HTML 源代碼(拿到 HTML 之后,這個 TCP 連接就關閉了)。然后,瀏覽器開始分析這個網頁的源碼,知道這個頁面包含很多外部資源(圖片、CSS、JS)。然后針對【每一個】外部資源,再分別發起一個個 TCP 連接,把這些文件獲取到本地(同樣的,每抓取一個外部資源后,相應的 TCP 就斷開)
相反,如果是“長連接”的方式,瀏覽器也會先發起一個 TCP 連接去抓取頁面。但是抓取頁面之后,該 TCP 連接并不會立即關閉,而是暫時先保持著(所謂的“Keep-Alive”)。然后瀏覽器分析 HTML 源碼之后,發現有很多外部資源,就用剛才那個 TCP 連接去抓取此頁面的外部資源。

在 HTTP 1.0 版本,【默認】使用的是“短連接”(那時候是 Web 誕生初期,網頁相對簡單,“短連接”的問題不大);
到了1995年底開始制定 HTTP 1.1 草案的時候,網頁已經開始變得復雜(網頁內的圖片、腳本越來越多了)。這時候再用短連接的方式,效率太低下了(因為建立 TCP 連接是有“時間成本”和“CPU 成本”滴)。所以,在 HTTP 1.1 中,【默認】采用的是“Keep-Alive”的方式。
關于“Keep-Alive”的更多介紹,可以參見維基百科詞條(在“這里”)
談談“對稱加密”和“非對稱加密”的概念


1. 啥是“加密”和“解密”?

通俗而言,你可以把“加密”和“解密”理解為某種【互逆的】數學運算。就好比“加法和減法”互為逆運算、“乘法和除法”互為逆運算。
“加密”的過程,就是把“明文”變成“密文”的過程;反之,“解密”的過程,就是把“密文”變為“明文”。在這兩個過程中,都需要一個關鍵的東東——叫做“密鑰”——來參與數學運算。


2. 啥是“對稱加密”?


所謂的“對稱加密技術”,意思就是說:“加密”和“解密”使用【相同的】密鑰。這個比較好理解。就好比你用 7zip 或 WinRAR 創建一個帶密碼(口令)的加密壓縮包。當你下次要把這個壓縮文件解開的時候,你需要輸入【同樣的】密碼。在這個例子中,密碼/口令就如同剛才說的“密鑰”。


3. 啥是“非對稱加密”?

所謂的“非對稱加密技術”,意思就是說:“加密”和“解密”使用【不同的】密鑰。這玩意兒比較難理解,也比較難想到。當年“非對稱加密”的發明,還被譽為“密碼學”歷史上的一次革命。
由于篇幅有限,對“非對稱加密”這個話題,俺就不展開了。有空的話,再單獨寫一篇掃盲。


4. 各自有啥優缺點?

看完剛才的定義,很顯然:(從功能角度而言)“非對稱加密”能干的事情比“對稱加密”要多。這是“非對稱加密”的優點。但是“非對稱加密”的實現,通常需要涉及到“復雜數學問題”。所以,“非對稱加密”的性能通常要差很多(相對于“對稱加密”而言)。
這兩者的優缺點,也影響到了 SSL 協議的設計。


CA 證書的原理及用途

關于這方面,請看俺4年前寫的《數字證書及CA的掃盲介紹》。這里就不再重復嘮叨了,免得篇幅太長。


HTTPS 協議的需求是啥?

花了好多口水,終于把背景知識說完了。下面正式進入正題。先來說說當初設計 HTTPS 是為了滿足哪些需求?
很多介紹 HTTPS 的文章一上來就給你講實現細節。個人覺得:這是不好的做法。早在2009年開博的時候,發過一篇《學習技術的三部曲:WHAT、HOW、WHY》,其中談到“WHY 型問題”的重要性。一上來就給你講協議細節,你充其量只能知道 WHAT 和 HOW,無法理解 WHY。俺在前一個章節講了“背景知識”,在這個章節講了“需求”,這就有助于你理解:當初


為什么

要設計成這樣?——這就是 WHY 型的問題。


兼容性

因為是先有 HTTP 再有 HTTPS。所以,HTTPS 的設計者肯定要考慮到對原有 HTTP 的兼容性。
這里所說的兼容性包括很多方面。比如已有的 Web 應用要盡可能無縫地遷移到 HTTPS;比如對瀏覽器廠商而言,改動要盡可能小;……
基于“兼容性”方面的考慮,很容易得出如下幾個結論:
1. HTTPS 還是要基于 TCP 來傳輸
(如果改為 UDP 作傳輸層,無論是 Web 服務端還是瀏覽器客戶端,都要大改,動靜太大了)
2. 單獨使用一個新的協議,把 HTTP 協議包裹起來
(所謂的“HTTP over SSL”,實際上是在原有的 HTTP 數據外面加了一層 SSL 的封裝。HTTP 協議原有的 GET、POST 之類的機制,基本上原封不動)

打個比方:如果原來的 HTTP 是塑料水管,容易被戳破;那么如今新設計的 HTTPS 就像是在原有的塑料水管之外,再包一層金屬水管。一來,原有的塑料水管照樣運行;二來,用金屬加固了之后,不容易被戳破。


可擴展性

前面說了,HTTPS 相當于是“HTTP over SSL”。
如果 SSL 這個協議在“可擴展性”方面的設計足夠牛逼,那么它除了能跟 HTTP 搭配,還能夠跟其它的應用層協議搭配。豈不美哉?
現在看來,當初設計 SSL 的人確實比較牛。如今的 SSL/TLS 可以跟很多常用的應用層協議(比如:FTP、SMTP、POP、Telnet)搭配,來強化這些應用層協議的安全性。

接著剛才打的比方:如果把 SSL/TLS 視作一根用來加固的金屬管,它不僅可以用來加固輸水的管道,還可以用來加固輸煤氣的管道。


保密性(防泄密)

HTTPS 需要做到足夠好的保密性。
說到保密性,首先要能夠對抗嗅探(行話叫 Sniffer)。所謂的“嗅探”,通俗而言就是監視你的網絡傳輸流量。如果你使用明文的 HTTP 上網,那么監視者通過嗅探,就知道你在訪問哪些網站的哪些頁面。
嗅探是最低級的攻擊手法。除了嗅探,HTTPS 還需要能對抗其它一些稍微高級的攻擊手法——比如“重放攻擊”(后面講協議原理的時候,會再聊)。


完整性(防篡改)

除了“保密性”,還有一個同樣重要的目標是“確保完整性”。關于“完整性”這個概念,在之前的博文《掃盲文件完整性校驗——關于散列值和數字簽名》中大致提過。健忘的同學再去溫習一下。
在發明 HTTPS 之前,由于 HTTP 是明文的,不但容易被嗅探,還容易被篡改。
舉個例子:
比如咱們天朝的網絡運營商(ISP)都比較流氓,經常有網友抱怨說訪問某網站(本來是沒有廣告的),竟然會跳出很多中國電信的廣告。為啥會這樣捏?因為你的網絡流量需要經過 ISP 的線路才能到達公網。如果你使用的是明文的 HTTP,ISP 很容易就可以在你訪問的頁面中植入廣告。
所以,當初設計 HTTPS 的時候,還有一個需求是“確保 HTTP 協議的內容不被篡改”。


真實性(防假冒)

在談到 HTTPS 的需求時,“真實性”經常被忽略。其實“真實性”的重要程度不亞于前面的“保密性”和“完整性”。
舉個例子:
你因為使用網銀,需要訪問該網銀的 Web 站點。那么,你如何確保你訪問的網站確實是你想訪問的網站?(這話有點繞口令)
有些天真的同學會說:通過看網址里面的域名,來確保。為啥說這樣的同學是“天真的”?因為 DNS 系統本身是不可靠的(尤其是在設計 SSL 的那個年代,連 DNSSEC 都還沒發明)。由于 DNS 的不可靠(存在“域名欺騙”和“域名劫持”),你看到的網址里面的域名【未必】是真實滴!
(不了解“域名欺騙”和“域名劫持”的同學,可以參見俺之前寫的《掃盲 DNS 原理,兼談“域名劫持”和“域名欺騙/域名污染”》)
所以,HTTPS 協議必須有某種機制來確保“真實性”的需求(至于如何確保,后面會細聊)。


性能

再來說最后一個需求——性能。
引入 HTTPS 之后,【不能】導致性能變得太差。否則的話,誰還愿意用?
為了確保性能,SSL 的設計者至少要考慮如下幾點:
1. 如何選擇加密算法(“對稱”or“非對稱”)?
2. 如何兼顧 HTTP 采用的“短連接”TCP 方式?
(SSL 是在1995年之前開始設計的,那時候的 HTTP 版本還是 1.0,默認使用的是“短連接”的 TCP 方式——默認不啟用 Keep-Alive)

文章評論

程序員必看的十大電影
程序員必看的十大電影
我是如何打敗拖延癥的
我是如何打敗拖延癥的
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
代碼女神橫空出世
代碼女神橫空出世
Google倫敦新總部 猶如星級莊園
Google倫敦新總部 猶如星級莊園
老程序員的下場
老程序員的下場
中美印日四國程序員比較
中美印日四國程序員比較
2013年中國軟件開發者薪資調查報告
2013年中國軟件開發者薪資調查報告
不懂技術不要對懂技術的人說這很容易實現
不懂技術不要對懂技術的人說這很容易實現
如何成為一名黑客
如何成為一名黑客
漫畫:程序員的工作
漫畫:程序員的工作
程序員最害怕的5件事 你中招了嗎?
程序員最害怕的5件事 你中招了嗎?
看13位CEO、創始人和高管如何提高工作效率
看13位CEO、創始人和高管如何提高工作效率
“懶”出效率是程序員的美德
“懶”出效率是程序員的美德
 程序員的樣子
程序員的樣子
每天工作4小時的程序員
每天工作4小時的程序員
為啥Android手機總會越用越慢?
為啥Android手機總會越用越慢?
我跳槽是因為他們的顯示器更大
我跳槽是因為他們的顯示器更大
程序員周末都喜歡做什么?
程序員周末都喜歡做什么?
Java 與 .NET 的平臺發展之爭
Java 與 .NET 的平臺發展之爭
Java程序員必看電影
Java程序員必看電影
那些性感的讓人尖叫的程序員
那些性感的讓人尖叫的程序員
Web開發人員為什么越來越懶了?
Web開發人員為什么越來越懶了?
5款最佳正則表達式編輯調試器
5款最佳正則表達式編輯調試器
旅行,寫作,編程
旅行,寫作,編程
團隊中“技術大拿”并非越多越好
團隊中“技術大拿”并非越多越好
做程序猿的老婆應該注意的一些事情
做程序猿的老婆應該注意的一些事情
程序員都該閱讀的書
程序員都該閱讀的書
什么才是優秀的用戶界面設計
什么才是優秀的用戶界面設計
程序員眼里IE瀏覽器是什么樣的
程序員眼里IE瀏覽器是什么樣的
2013年美國開發者薪資調查報告
2013年美國開發者薪資調查報告
當下全球最炙手可熱的八位少年創業者
當下全球最炙手可熱的八位少年創業者
“骯臟的”IT工作排行榜
“骯臟的”IT工作排行榜
總結2014中國互聯網十大段子
總結2014中國互聯網十大段子
程序員應該關注的一些事兒
程序員應該關注的一些事兒
寫給自己也寫給你 自己到底該何去何從
寫給自己也寫給你 自己到底該何去何從
60個開發者不容錯過的免費資源庫
60個開發者不容錯過的免費資源庫
10個調試和排錯的小建議
10個調試和排錯的小建議
十大編程算法助程序員走上高手之路
十大編程算法助程序員走上高手之路
鮮為人知的編程真相
鮮為人知的編程真相
要嫁就嫁程序猿—錢多話少死的早
要嫁就嫁程序猿—錢多話少死的早
程序員的鄙視鏈
程序員的鄙視鏈
那些爭議最大的編程觀點
那些爭議最大的編程觀點
一個程序員的時間管理
一個程序員的時間管理
我的丈夫是個程序員
我的丈夫是個程序員
程序員和編碼員之間的區別
程序員和編碼員之間的區別
聊聊HTTPS和SSL/TLS協議
聊聊HTTPS和SSL/TLS協議
初級 vs 高級開發者 哪個性價比更高?
初級 vs 高級開發者 哪個性價比更高?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
軟件開發程序錯誤異常ExceptionCopyright © 2009-2015 MyException 版權所有
重庆幸运农场中奖金额