深入理解 HTTPS 原理、過程與實踐
引言
HTTP是不安全的,我們的頁面也被運營商插入過小黃圖廣告(資料被篡改),對於HTTP來說,再簡單不過,只需要設定相應的DNS,做一箇中間人攻擊,再將修改後的資料返回,這一方面可能洩露使用者隱私資料,同時也對我們的品牌形象產生惡劣影響。
然而,當我們切換HTTPS時候,運營商的這些小九九就施展不開了,服務端認證不通過,瀏覽器不會展示相應的頁面資料;運營商實施搞的這一套東東也就不能在使用者不知情的情況下搞起來了,解決辦法是去除相應的受汙染的DNS。
全球最大的成人網站PornHub,YouPorn都要全面切HTTPS了,我們還在猶豫什麼了?
安全的HTTP的需求
對HTTP的安全需求:
- 加密(客戶端和伺服器的對話是私密的,無須擔心被竊聽)
- 服務端認證(客戶端知道它們是在與真正的而不是偽造的伺服器通訊)
- 客戶端認證(伺服器知道它們是在與真正的而不是偽造的客戶端通訊)
- 完整性(客戶端和伺服器的資料不會被修改)
- 效率(一個執行足夠快的演算法,一遍低端的客戶端和伺服器使用)
- 普適性(基本上所有的客戶端和伺服器都支援這些協議)
- 管理的可擴充套件性(在任何地方的任何人都可以立即進行安全通訊)
- 適應性(能夠支援當前最知名的安全方法)
- 在社會上的可行性(滿足社會的政治文化需要),要有公眾受信能力
在這裡面最重要的是前面幾條
- 資料加密 傳輸內容進行混淆
- 身份驗證 通訊雙方驗證對方的身份真實性
- 資料完整性保護 檢測傳輸的內容是否被篡改或偽造
安全HTTP的實現
加密方式的選擇
共享金鑰加密 對稱金鑰加密
共享金鑰加密方式使用相同的金鑰進行加密解密,通訊雙方都需要接收對方的加密金鑰進行資料解密,這種方式在通訊過程中必須互動共享的金鑰,同樣無法避免被網路監聽洩漏金鑰的問題;同時對於眾多客戶端的伺服器來說還需要分配和管理金鑰,對於客戶端來說也需要管理金鑰,增加設計和實現的複雜度,同時也降低了通訊的效率;不用看都不靠譜。
公開金鑰加密
公開金鑰加密方式使用一對非對稱的金鑰對(私鑰和公鑰),不公開的作為私鑰,隨意分發的作為公鑰;公鑰和私鑰都能進行資料加密和解密,公鑰能解密私鑰加密的資料,私鑰也能解密公鑰加密的資料;這樣只需要一套金鑰就能處理服務端和眾多客戶端直接的通訊被網路監聽洩漏金鑰的問題,同時沒有額外的管理成本;看起來挺合適。
沒那麼簡單
公開金鑰加密安全性高,伴隨著加密方式複雜,處理速度慢的問題。如果我們的通訊都是用公開金鑰的方式加密,那麼通訊效率會很低。
HTTPS採用共享金鑰加密和公開金鑰加密混合的加密方式,在交換金鑰對環節使用公開金鑰加密方式(防止被監聽洩漏金鑰)加密共享的金鑰,在隨後的通訊過程中使用共享金鑰的方式使用共享的金鑰進行加解密。
認證方式實現
數字證書
數字簽名是附加在報文上的特殊加密校驗碼,可以證明是作者編寫了這條報文,前提是作者才會有私鑰,才能算出這些校驗碼。如果傳輸的報文被篡改,則校驗碼不會匹配,因為校驗碼只有作者儲存的私鑰才能產生,所以前面可以保證報文的完整性。
數字證書認證機構(Certificate Authority CA)是客戶端和伺服器雙方都可信賴的第三方機構。
伺服器的運營人員向數字證書認證機構提出證書認證申請,數字證書認證機構在判明申請者的身份之後,會對已申請的公開金鑰做數字簽名,然後分配這個已簽名的公開金鑰,並將該公開金鑰放入公鑰證書(也叫數字證書或證書)後繫結在一起。伺服器將這份有數字認證機構頒發的公鑰證書發總給客戶端,以進行公開金鑰加密方式通訊。
EV SSL(Extended Validation SSL Certificate)證書是基於國際標準的認證指導方針辦法的證書,通過認證的Web網站能獲得更高的認可度。持有EV SSL證書的Web網站的瀏覽器位址列的背景色是綠色的,同時在位址列的左側顯示了SSL證書中記錄的組織名稱及辦法證書的認證機構的名稱。
使用OpenSSL,每個人都可以構建一套認證機構檔案,同時可以用來給自己的證書請求進行簽名,這種方式產生的證書稱為自簽名證書,這種證書通常是CA自己的證書,使用者開發測試的正式,也可以像12306這樣的,信不信由你。
證書信任的方式
- 作業系統和瀏覽器內建每個作業系統和大多數瀏覽器都會內建一個知名證書頒發機構的名單。因此,你也會信任作業系統及瀏覽器提供商提供和維護的可信任機構。受信認證機構(也有不受信的,比如賽門鐵克,沃通,或者像2011年被入侵的DigiNotar等)的證書一般會被作業系統或者瀏覽器在發行或者釋出時內建。
- 證書頒發機構CA( Certificate Authority,證書頒發機構)是被證書接受者(擁有者)和依賴證書的一方共同信任的第三方。
- 手動指定證書所有瀏覽器和作業系統都提供了一種手工匯入信任證書的機制。至於如何獲得證書和驗證完整性則完全由你自己來定。
PKI(Public Key Infrastructure),即公開金鑰基礎設施,是國際上解決開放式網際網路絡資訊保安需求的一套體系。PKI支援身份認證,資訊傳輸,儲存的完整性,訊息傳輸,儲存的機密性以及操作的不可否認性。
資料完整性
數字簽名是隻有資訊傳送者才能產生的別人無法偽造的一段文字,這段文字是對資訊傳送者傳送資訊真實性的一個有效證明,具有不可抵賴性。
報文的傳送方從報文文字生成一個128位的雜湊值(或稱為報文摘要活雜湊值),傳送方使用自己的私鑰對這個摘要值進行加密來形成傳送方的數字簽名。然後這個數字簽名將作為報文的附件一起傳送給報文的接收方。報文的接收方首先從接收到的原始報文中計算出128位的雜湊值,再用傳送方的公鑰來對報文附加的數字簽名進行解密。如果兩次得到的結果是一致的那麼接收方可以確認該數字簽名是傳送方的,同時確認資訊是真實的 。
HTTPS資料互動過程
HTTP中沒有加密機制,可以通過SSL(Secure Socket Layer 安全套接層)或TLS(Transport Layer Security 安全層傳輸協議)的組合使用,加密HTTP的通訊內容。
HTTPS是 HTTP Secure 或 HTTP over SSL。
SSL(Security Socket Layer)是最初由網景公司(NetScape)為了保障網上交易安全而開發的協議,該協議通過加密來保護客戶個人資料,通過認證和完整性檢查來確保交易安全。網景公司開發過SSL3.0之前的版本;目前主導權已轉移給IETF(Internet Engineering Task Force),IETF以SSL3.0為原型,標準化並制定了TSL1.0,TLS1.1,TLS1.2。但目前主流的還是SSL3.0和TSL1.0。
SSL工作在OSI七層模型中的表示層,TCP/IP 四層模型的應用層。
SSL 和 TLS 可以作為基礎協議的一部分(對應用透明),也可以嵌入在特定的軟體包中(比如Web伺服器中的實現)。
SSL 基於TCP,SSL不是簡單地單個協議,而是兩層協議;SSL記錄協議(SSL Record Protocol)為多種高層協議(SSL握手協議,SSL修改密碼引數協議,SSL報警協議)提供基本的安全服務。HTTP是為Web客戶端/伺服器互動提供傳輸服務的,它可以在SSL的頂層執行;SSL記錄協議為SSL連結提供兩種服務,機密性:握手協議定義了一個共享金鑰,用於SSL載荷的對稱加密。 訊息完整性:握手協議還定義了一個共享金鑰,它用來產生一個訊息認證碼(Message Authentication Code,MAC)。
SSL記錄協議操作
- 分段 將每個上層訊息分解成不大於2^14(16384)位,然後有選擇的進行壓縮
- 新增MAC 在壓縮資料的基礎上計算MAC
- 加密 訊息加上MAC用對稱加密方法加密
- 新增SSL記錄頭 內容型別(8位),主版本(8位),副版本(8位),壓縮長度(16位)
SSL握手過程
- 第一階段 建立安全能力 包括協議版本 會話Id 密碼構件 壓縮方法和初始隨機數
- 第二階段 伺服器傳送證書 金鑰交換資料和證書請求,最後傳送請求-相應階段的結束訊號
- 第三階段 如果有證書請求客戶端傳送此證書 之後客戶端傳送金鑰交換資料 也可以傳送證書驗證訊息
- 第四階段 變更密碼構件和結束握手協議
SSL協議兩個重要概念,SSL會話,SSL連線;SSL連線是點到點的連線,而且每個連線都是瞬態的,每一個連結都與一個會話關聯。SSL會話是一個客戶端和一個伺服器之間的一種關聯,會話由握手協議(Handshake Protocol)建立,所有會話都定義了一組密碼安全引數,這些安全引數可以在多個連線之間共享,會話可以用來避免每一個連結需要進行的代價高昂的新的安全引數協商過程。
Client Server ClientHello:HandShake --------> ServerHello:Handshake Certificate*:Handshake ServerKeyExchange*:Handshake CertificateRequest*:Handshake <-------- ServerHelloDone:Handshake Certificate*:Handshake ClientKeyExchange:Handshake CertificateVerify*:Handshake [ChangeCipherSpec] Finished:Handshake --------> [ChangeCipherSpec] <-------- Finished:Handshake Application Data <-------> Application Data
客戶端伺服器資料互動實戰
使用openssl命令
openssl s_client -state -connect q.qunarzz.com:443
該命令可以顯示SSL握手過程,SSL證書鏈,公鑰證書以及其他相關的狀態和屬性資訊。
使用Wireshark抓取資料包
相關配置
- 配置環境變數,同時保證檔案路徑存在
SSLKEYLOG=/path/to/sslkeylog.log
- 配置Wireshark
Wireshark->Preference->Protocols->SSL->(Pre)-Master-Secret log filename=>選擇上面的路徑
抓包操作
- 在命令列中開啟Chrome或者Firefox,確保環境變數被讀取;如果不行就用Chrome或者Firefox的開發版。
open /Applications/Firefox.app open /Applications/Google\ Chrome.app
- 確保$SSLKEYLOGFILE裡面有內容了,再往下進行。
- 選擇對應網路卡,抓包配置為host http://q.qunarzz.com,開始抓包
- 使用剛剛開啟的瀏覽器訪問一個對應host http://q.qunarzz.com下的某個資源,在抓包介面使用ssl過濾資料
- 在抓包介面可以看到對應的SSL握手資訊,同時還能看到解密後的應用資料。
內容解析(不同的網路資源可能不完全一致,比如需要客戶端證書)
客戶端⇒伺服器
- Client Hello
- 最高支援的協議版本 如TLS 1.0
- 支援的加密演算法列表(Cipher Suites)
- 支援的壓縮演算法列表(Compression Methods)
- 客戶端生成的隨機數,稍後用於生成會話金鑰
伺服器⇒客戶端
- Server Hello
- 選定的協議版本
- 選定的加密演算法
- 選定的壓縮方法
- 服務端生成的隨機數,稍後用於生成會話金鑰
- Certificate 證書內容
- Server Key Exchange, Server Hello Done
- 公鑰
- 數字簽名
- Server Hello Done
客戶端⇒伺服器
- Client Key Exchange, Change Cipher Spec, Finished
- 公鑰
- Change Cipher Spec
- Finished
客戶端⇒伺服器
- HTTP GET
服務端⇒客戶端
- 內容的資料片段資訊
- HTTP HTTP/1.1 200 OK
服務端⇒客戶端
- Encrypted Alert
- Alert (Level Warning, Description: Close Notify)
參考資料
- 《Web效能權威指南》
- 《RFC 2246》
- 《圖解HTTP》
- 《HTTP權威指南》
- 《HTTPS權威指南 在伺服器和Web應用上部署SSL/TLS和PKI》
- 《計算機網路系統方法》
- 《計算機網路自上而下方法》
- 《電腦保安原理與實踐》
- 《網路安全基礎-應用與標準》
- 《PKI/CA與數字證書技術大全》
- 《SSL與TLS》
- 《OpenSSL官方命令文件》
- 《OpenSSL與網路資訊保安-基礎、結構和指令》
- 《OpenSSL攻略》
- Wireshark Doc SSL
相關文章
- 深入理解 ProtoBuf 原理與工程實踐(概述)
- 深入理解HTTPS工作原理HTTP
- Https原理解析及詳細推演過程HTTP
- 深入理解中文編碼:原理、應用與實踐
- 【深入理解Go】協程設計與排程原理(上)Go
- 【深入理解Go】協程設計與排程原理(下)Go
- Nginx部署HTTPS服務過程與異常處理實踐NginxHTTP
- Redis核心原理與實踐--Redis啟動過程原始碼分析Redis原始碼
- 深入理解https進行SSL單向認證的全過程HTTP
- 深入淺出 PLT/GOT Hook與原理實踐GoHook
- 深入理解 Android ANR 觸發原理以及資訊收集過程Android
- 深入理解ORACLE啟動過程Oracle
- Django訊號與擴充套件:深入理解與實踐Django套件
- HTTPS原理解析HTTP
- 深入理解JVM虛擬機器11:Java記憶體異常原理與實踐JVM虛擬機Java記憶體
- 深入理解單元測試:技巧與最佳實踐
- Babel 外掛原理的理解與深入Babel
- 深入理解linux啟動過程Linux
- https理論與實踐HTTP
- 理解https中的安全及其實現原理HTTP
- 深入理解DES演算法:原理、實現與應用演算法
- 理解 HTTPS 的工作原理HTTP
- 深入高可用架構原理與實踐 書籍學習架構
- 深入理解[Future模式]原理與技術模式
- 深入理解spark之架構與原理Spark架構
- 深入理解 iOS App 的啟動過程iOSAPP
- 深入理解Linux啟動過程薦Linux
- 深入理解HTTPS協議HTTP協議
- angr原理與實踐(一)——原理
- Webpack原理與實踐Web
- 深入淺出HTTPS工作原理HTTP
- 深入理解ReentrantLock的實現原理ReentrantLock
- 透過 Chrome 深入理解瀏覽器導航過程Chrome瀏覽器
- 大型網站的HTTPS實踐(一)——HTTPS協議和原理網站HTTP協議
- 大型網站的 HTTPS 實踐(一): HTTPS 協議和原理網站HTTP協議
- 大型網站的 HTTPS 實踐(一)—— HTTPS 協議和原理網站HTTP協議
- https加密過程HTTP加密
- 深入淺出理解 Spark:環境部署與工作原理Spark