HTTPS是如何保證連線安全:每位Web開發者都應知道的
【感謝@埃姆傑 的熱心翻譯。如果其他朋友也有不錯的原創或譯文,可以嘗試提交到伯樂線上。】
“HTTPS協議的工作原理是什麼?”這是我在數天前工作專案中需要解決的問題。
作為一名Web開發者,我當然知道 HTTPS 協議是保障使用者敏感資料的好辦法,但並不知道這種協議的內在工作機制。
它怎麼保護資料?有人監聽線路的情況下,伺服器與客戶端之間如何建立安全的連線?安全證書又是什麼,為什麼還要花錢買呢?
一系列通道
在深入講解原理細節之前,讓我們首先簡單瞭解下HTTPS所防範的的問題,以及安全連線為何如此重要吧。
在你訪問自己喜歡的站點時,從你的電腦傳送的請求會在各個不同的網路之間傳遞——這些網路很有可能是用來偷聽,甚至篡改你的資訊。
區域網中,資訊從你的電腦傳輸到其他電腦,傳輸到接入點,到ISP的路由器、交換機,最後到達骨幹網線路。這樣的一個過程中,有許多不同的組織在傳送著你的請求。這時,如果不懷好意的使用者侵入這條線路之中的任何一個系統中時,他們將很有可能看到線路中傳送的內容。
而一般情況下,Web請求和相應都經由普通的HTTP協議明文傳送。HTTP協議預設不使用加密協議,都是由於這些原因:
- 加密消耗了很多計算資源。
- 加密佔用了更多的傳輸頻寬。
- 加密後快取機制會失效。
不過,Web開發者會時不時遇到在連線中傳送密碼、信用卡號等敏感資訊的情況。所以,有必要為這些頁面做好防嗅探的準備措施。
傳輸層安全協議(TLS)
雖然下面講解的內容和密碼學有關,但是這裡只是一個簡單的介紹,不熟悉相關知識也應該看得懂。在實踐中,是密碼學演算法確保了通訊過程的安全,同時也抵禦了潛在的資訊黑手——干擾通訊和監聽的人。
SSL協議的繼任者——TLS協議,常被用來實現安全HTTP連線(HTTPS)協議。在OSI網路模型中,TLS協議比HTTP協議的工作更加底層。確切來說,就是TLS的那部分連線發生在HTTP的連線之前。
TLS是一種混合的加密機制。它具有多種正規化,接下來所看到的是對於這兩種正規化(用於共享祕密資訊和身份認證(確保聲稱的身份和實際身份一致)的公鑰演算法和用於加密請求與迴應機密資訊的對稱式演算法)的說明:
公鑰加密機制
使用公鑰加密機制,雙方各自擁有一份公鑰和一份私鑰,公鑰和私鑰通過數學演算聯絡在一起。公鑰用於將明文轉化為密文(變成了一堆亂碼),私鑰用來解密這一堆亂碼般的資訊。
一旦資訊被公鑰加密,它將只能由相應的私鑰解密。兩者缺一不可,而且也不能反過來使用。公鑰可以自由傳播,無需擔心繫統安全性降低;但私鑰應妥善保管,不可將其洩露給未經授權解密的資訊的使用者,這就是公鑰和私鑰這兩個名稱的由來。
公鑰機制相當酷的地方在於,通訊雙方可以在最初不安全的通道上建立起安全可靠的通訊連線。
客戶端和伺服器都可以使用各自的私鑰,只要共享了一部分公開資訊,也就是共用了同一個公鑰的情況下,就可以建立起相應的會話。
這意味著即使有人坐在客戶端或者伺服器前檢視連線過程,他們也不會知道客戶端或者服務的的私鑰,也不會知道會話所共享的密碼。
這得靠什麼實現?靠數學!
Diffie-Hellman
這種金鑰交換最常使用是Diffie-Hellman的金鑰交換法。這項過程允許伺服器和客戶端雙方商定共同的保密資訊,而不需要在傳輸過程中交換這個資訊。這樣一來,即使嗅探者檢視每個資料包,也不能確定連線上傳輸的共享密碼是什麼。
在最初的DH式金鑰交換髮生之後所生成的共享資訊,可以在會話接下來的通訊中使用更簡潔的對稱式加密法,我們之後就會看到對稱式加密法的說明。
一點點數學
公鑰演算法的特點就是很容易由運算元計算出結果,而基本上不可能作逆向運算。這也就是使用了兩個質數的所要達到的目的。
現在假設Alice和Bob分別是參與DH式金鑰交換過程的兩方,他們一開始會商議確定一個小質數(一般是2,3,5這樣的小數字)和一個大質數(有300位以上)作為加密的原始資訊。小質數和大質數都可以直接傳輸,不必擔心交換過程中的不安全。
需要明白的是,Alice和Bob各自都持有著自己的私鑰(100多位的數),而且也永遠不應該共享自己的私鑰。不光是兩人之間,也包括其他不相關的人都不應該擁有這兩組私鑰。網路中傳輸的是他們的私鑰、小質數和大質數混合運算得到的結果。更確切來說,就是:
- Alice的結果 = (小質數Alice的密碼)% 大質數
- Bob的結果 = (小質數Bob的密碼)% 大質數
- (“%” 符號表示取模運算,即取得除法運算的餘數)
所以Alice使用大質數和小質數加上自己的私鑰運算,就會得出結果,而Bob做同樣的計算,也能得到相同的結果。當他們接收到對方的運算結果時,他們可以由數學計算匯出會話中所要傳輸的資訊,也就是說:
Alice計算的是
- (Bob的結果Alice的密碼)% 大質數
而Bob則計算
- (Alice的結果Bob的密碼)% 大質數
Alice和Bob得出來的數字相同,這個數字也就是會話中所要共享的密碼。請注意,雙方都沒有向對方傳輸各自的私鑰,而連線過程中也沒有明文傳遞保密資訊。這一點真是太棒了!
對數學不好的人而言,維基百科上有一張混合顏料的圖可以用來說明情況:
請注意圖中一開始的顏色(黃色)最後都會有Alice和Bob的顏色參與計算。這就是雙方會得到同樣結果的原因。對於觀看中間過程的人來說,唯一在連線中傳送的半合成資訊是毫無意義的。
對稱式加密機制
每次會話中只需要產生一次公鑰交換的過程。在接受了同一個共享保密資訊以後,伺服器和客戶端之間會使用更為高效的對稱式加密機制進行通訊,省去了來回交換的額外花銷。
在接受了之前的共享保密資訊之後,還會使用一套密碼機制(一般是一組加密演算法),使用共享的密碼安全地通訊,加密解密各自的資訊。而竊聽者只會看到一堆亂碼在傳來傳去。
身份認證
DH式金鑰交換允許雙方建立私有的,共有的密碼,但通訊雙方怎麼確保是真正想要對話的人呢?這裡就涉及到了身份認證的問題。
假設我拿起電話,跟我的朋友進行DH式金鑰交換,在電話已經被幹擾的情況,實際上是在跟其他人交換資訊。在使用共享密碼了以後,我仍然可以安全地與“朋友”交換資訊,沒有人可以解密我們的通訊資訊,但是“朋友”並不真的是我的朋友,這可是十分不安全的!
要解決身份認證問題,需要有配套的公鑰基本設施,來核實使用者的真實身份。這些設施用來建立,管理,釋出,收回數字證書。而數字證書正是你需要為站點使用HTTPS協議付費的惱人事項。
但是,什麼是數字證書,數字證書又是如何保證資訊更加安全的呢?
證書
從更高的層次來講,數字證書是將機器上的公鑰和身份資訊綁在一起的數字簽名。數字簽名擔保某份公鑰屬於某個特定的組織和機構。
證書將域名(身份資訊)和特定公鑰關聯起來。這就避免了竊聽者將自己的伺服器偽裝成使用者將要連線的伺服器,並進行攻擊的行為。
在上面打電話的例子中,攻擊者可以嘗試展示自己的公鑰,裝作是你的“朋友”,但是證書上面的簽名信息便顯示出:這份證書不是來自我信任的人的。
要受到一般瀏覽器的信任,證書本身還應當受到CA的信任。CA公司對認證會進行人工核查,確定申請主體滿足以下兩個條件:
- 在公共記錄中存在著這個人/這家公司。
- 需要簽名的證書上標明的域名的確由申請主體實際控制。
當CA查證,得出申請人屬實,並且的確擁有這個域名的結果,CA便會為證書頒發簽證,蓋上“已核准”的戳記,表明網站的公鑰屬於這個網站,而且可以信任。
你的瀏覽器中會內建一系列受信任的CA列表。如果伺服器返回的是未經過受信任CA簽證的證書,瀏覽器會彈出大大的警告,這就在系統中多了一層安全措施,如果不然,任何人都可以四處籤售偽造的證書。
這樣一來,即使攻擊者將自己的公鑰拿出來,生成這份金鑰,聲稱自己的偽造伺服器就是“facebook.com”,瀏覽器也會因為檢查到“未經受信任CA簽名的證書”而彈出提示。
一些關於證書的其他事項
增強式認證
在常規的X.509 證書之外,增強式認證證書提供了更強力的認證。
要授予增強式認證證書,CA會對域名持有著做更加深入的查驗(通常需要提供護照和水電費賬單等資訊)。
這種型別的證書,瀏覽器中大鎖圖示的顯示位置背景也會變成綠色。
在同一臺伺服器上執行的多個網站
在HTTP協議連線開始之前進行的TLS協議握手流程,很有可能存在著多個網站存放在同一個伺服器,使用相同IP地址的情況。
虛擬主機的Web路由是由Web伺服器分發,但是TCP握手的過程,卻是發生在連線之前。整個系統的單張證書會被髮送到伺服器的所有請求之中,這種流程會在共享主機的環境中發生問題。
如果你正在使用Web主機上提供的服務,他們會在你使用HTTPS協議之前要求使用獨立的IP地址。不然主體提供商就需要每次在伺服器上有新站點的時候,取得新證書(並且向CA重新申請認證)。
相關推薦
HTTPS是如何保證連線安全:每位Web開發者都應知道的
【感謝@埃姆傑 的熱心翻譯。如果其他朋友也有不錯的原創或譯文,可以嘗試提交到伯樂線上。】 “HTTPS協議的工作原理是什麼?”這是我在數天前工作專案中需要解決的問題。 作為一名Web開發者,我當然知道 HTTPS 協議是保障使用者敏感資料的好辦法,但並不知道這種協
HTTPS是如何保證連線安全
HTTPS協議的工作原理是什麼?”這是我在數天前工作專案中需要解決的問題。 作為一名Web開發者,我當然知道 HTTPS 協議是保障使用者敏感資料的好辦法,但並不知道這種協議的內在工作機制。 它怎麼保護資料?有人監聽線路的情況下,伺服器與客戶端之間如何建立安全的連線?
每個Web開發者都該瞭解的12條命令列
轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。原文出處:https://tutorialzine.com/2017/08/12-terminal-commands-every-web-developer-should-know 在開
每一個JavaScript開發者都應該知道的10道面試題
結束 vid 認識 本質 特定 更新 mixin 構造函數 程序猿 JavaScript十分特別。而且差點兒在每一個大型應用中起著至關關鍵的數據。那麽,究竟是什麽使JavaScript顯得與眾不同,意義非凡? 這裏有一些問題將幫助你了解其真正的奧妙所在:
全棧開發者都應該關註這些(轉載)
學習 移動互 top emd ret 知識 讀者 iam 運維 這篇文章推薦了包括技術、設計、極客和創業相關的熱門公眾號。 1、面向對象 「面向對象」一個專門為 IT 單身男女服務的征友相親公眾號。可以發布單身男生和女生相親信息。既
PDB文件:每個開發人員都必須知道的
ger val 變量 conf 地址空間 代碼 modules div 查找 http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/05/11/pdb-files-what-every-developer-must
極速彩源碼搭建步驟 Java 開發者都應該知道的 5 個註解
推出 註解 http lean error: java編譯 lse 隱式 滿足 自 JDK5 推出以來,註解已成為Java生態系統不可缺少的一部分。雖然開發者為Java框架(例如Spring的@Autowired)開發了無數的自定義註解,但編譯器認可的一些註解非常重要。 在
PDB檔案:每個開發人員都必須知道的
PDB檔案:每個開發人員都必須知道的 PDB Files: What Every Developer Must Know http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/05/11/pdb-files-what-
學習C語言的教材、如何成為一名優秀的C程式設計師、激發程式設計師創意的6本書、國外程式設計師推薦:每個程式設計師都應讀的書
學習C語言的教材 我的C語言是自學的,這些年看過不少教材。 下面,我對其中一些教材做個點評。 1. How to Think Like a Computer Scientist: C version 這是我讀過最易懂的C語言教材。 雖然它只講
國外程式設計師推薦:每個程式設計師都應讀的書
【更新】:近日(2012年8月17日)重看 StackOverflow 的原討論帖,發現於今年年初被關閉了。不過有人做了彙總,把其他回覆中提到的書籍,放在投票數最高的回覆中。新更新新增 59 本書,詳情可見文章後半部分。 編者按:2008年8月4日,StackOve
JavaScript 開發者都應該知道的十個概念,你知道幾個?
自學 現在學習 JavaScript 和 Web 開發的人很多,他們都希望能憑此獲得一份工作。然而,自學常常會使學習者對 JavaScript 語言本身的理解存在知識盲點。 實際上,令人感到驚訝的是,他們只需要掌握很少的語言知識就能製作複雜的網頁,然而這樣通常不能很好掌握 JavaS
書_國外程式設計師推薦:每個程式設計師都應讀的書[轉]
編者按:2008年8月4日,StackOverflow 網友 Bert F 發帖提問:哪本最具影響力的書,是每個程式設計師都應該讀的? “如果能時光倒流,回到過去,作為一個開發人員,你可以告訴自己在職業生涯初期應該讀一本,你會選擇哪本書呢?我希望這個書單列表內容豐富,可以
15款國內移動應用開發者都必須知道的小而美SDK
隨著智慧手機硬體效能的不斷提升和4G網路的普及,移動APP以迅雷不及掩耳之勢席捲並改變了我們的生活。移動應用程式的開發需求也迅速上升,各大企業也將自己的開發能力開放出來。封裝好的工具SDK因為開發成本低、節約時間、快速上線、功能穩定等突出優勢受到了廣大開發者的青睞。 據不
國外程式設計師推薦:每個程式設計師都應讀的書【轉載】
編者按:2008年8月4日,StackOverflow 網友 Bert F 發帖提問: “如果能時光倒流,回到過去,作為一個開發人員,你可以告訴自己在職業生涯初期應該讀一本,你會選擇哪本書呢?我希望這個書單列表內容豐富,可以涵蓋很多東西。” 很多程式設計師響應,他們在
國外程式設計師推薦:每個程式設計師都應讀的書(作為一個碼奴,這個也留著)(轉)
國外程式設計師推薦:每個程式設計師都應讀的書 來自:http://www.williamlong.info/archives/3028.html “如果能時光倒流,回到過去,作為一個開發人員,你可以告訴自己在職業生涯初期應該讀一本,你會選擇哪本書呢?我希望這個書單列表內容豐富,可以涵蓋很多東西。”
【vs除錯】PDB檔案:每個開發人員都必須知道的
PDB檔案:每個開發人員都必須知道的 一 什麼是PDB檔案 大部分的開發人員應該都知道PDB檔案是用來幫助軟體的除錯的。但是他究竟是如何工作的呢,我們可能並不熟悉。本文描述了PDB檔案的儲存和內容。同時還描 述了debugger如何找到binay相應的PDB檔案,以及debugger如何找到與bin
程式設計師推薦:每個程式設計師都應讀的書-國外計算機圖書
很多程式設計師響應,他們在推薦時也寫下自己的評語。以前就有國內網友介紹這個程式設計師書單,不過都是推薦數 Top 10的書。其實除了前10本之外,推薦數前30左右的書籍都算經典,筆者整理編譯這個問答貼,同時摘譯部分推薦人的評語。下面就按照各本書的推薦數排列。 如果能時光倒流
99%遊戲開發者都不知道的遊戲運營詞彙
作為遊戲開發者,在實際工作過程中經常遇到一些 遊戲運營詞彙 。它們可以從各個層面來衡量遊戲的健康狀態,供我們進行分析,發現遊戲存在的問題。那麼究竟該留意哪些些資料呢?或者說該從何入手瞭解這些資料?本文提供一個簡單的索引,幫助大家認清方向,同時也可以方便的檢視相關的概念。資料收
每個 Java 開發者都應該知道的 5 個註解
自 JDK5 推出以來,註解已成為Java生態系統不可缺少的一部分。雖然開發者為Java框架(例如Spring的@Autowired)開發了無數的自定義註解,但編譯器認可的一些註解非常重要。在本文中,我們將看到5個Java編譯器支援的註解,並瞭解其期望用途。順便,我們將探索其
訊息推送一個好功能,90%的開發者都不知道
1.個推報表簡介 推送資料報表主要用於統計某一條訊息的具體下發情況。單條推送訊息下發使用者總量有多少,其中成功推送到手機的數量有多