深入理解HTTPS原理、過程與實踐
引言
HTTP是不安全的,我們的頁面也被運營商插入過小黃圖廣告(數(shù)據(jù)被篡改),對于HTTP來說,再簡單不過,只需要設(shè)定相應(yīng)的DNS,做一個中間人攻擊,再將修改后的數(shù)據(jù)返回,這一方面可能泄露用戶隱私數(shù)據(jù),同時也對我們的品牌形象產(chǎn)生惡劣影響。
然而,當(dāng)我們切換HTTPS時候,運營商的這些小九九就施展不開了,服務(wù)端認(rèn)證不通過,瀏覽器不會展示相應(yīng)的頁面數(shù)據(jù);運營商實施搞的這一套東東也就不能在用戶不知情的情況下搞起來了,解決辦法是去除相應(yīng)的受污染的DNS。
全球最大的成人網(wǎng)站PornHub,YouPorn都要全面切HTTPS了,我們還在猶豫什么了?
安全的HTTP的需求
對HTTP的安全需求:
- 加密(客戶端和服務(wù)器的對話是私密的,無須擔(dān)心被竊聽)
- 服務(wù)端認(rèn)證(客戶端知道它們是在與真正的而不是偽造的服務(wù)器通信)
- 客戶端認(rèn)證(服務(wù)器知道它們是在與真正的而不是偽造的客戶端通信)
- 完整性(客戶端和服務(wù)器的數(shù)據(jù)不會被修改)
- 效率(一個運行足夠快的算法,一遍低端的客戶端和服務(wù)器使用)
- 普適性(基本上所有的客戶端和服務(wù)器都支持這些協(xié)議)
- 管理的可擴(kuò)展性(在任何地方的任何人都可以立即進(jìn)行安全通信)
- 適應(yīng)性(能夠支持當(dāng)前最知名的安全方法)
- 在社會上的可行性(滿足社會的政治文化需要),要有公眾受信能力
在這里面最重要的是前面幾條
- 數(shù)據(jù)加密 傳輸內(nèi)容進(jìn)行混淆
- 身份驗證 通信雙方驗證對方的身份真實性
- 數(shù)據(jù)完整性保護(hù) 檢測傳輸?shù)膬?nèi)容是否被篡改或偽造
安全HTTP的實現(xiàn)
加密方式的選擇
共享密鑰加密 對稱密鑰加密
共享密鑰加密方式使用相同的密鑰進(jìn)行加密解密,通信雙方都需要接收對方的加密密鑰進(jìn)行數(shù)據(jù)解密,這種方式在通信過程中必須交互共享的密鑰,同樣無法避免被網(wǎng)絡(luò)監(jiān)聽泄漏密鑰的問題;同時對于眾多客戶端的服務(wù)器來說還需要分配和管理密鑰,對于客戶端來說也需要管理密鑰,增加設(shè)計和實現(xiàn)的復(fù)雜度,同時也降低了通信的效率;不用看都不靠譜。
公開密鑰加密
公開密鑰加密方式使用一對非對稱的密鑰對(私鑰和公鑰),不公開的作為私鑰,隨意分發(fā)的作為公鑰;公鑰和私鑰都能進(jìn)行數(shù)據(jù)加密和解密,公鑰能解密私鑰加密的數(shù)據(jù),私鑰也能解密公鑰加密的數(shù)據(jù);這樣只需要一套密鑰就能處理服務(wù)端和眾多客戶端直接的通信被網(wǎng)絡(luò)監(jiān)聽泄漏密鑰的問題,同時沒有額外的管理成本;看起來挺合適。
沒那么簡單
公開密鑰加密安全性高,伴隨著加密方式復(fù)雜,處理速度慢的問題。如果我們的通信都是用公開密鑰的方式加密,那么通信效率會很低。
HTTPS采用共享密鑰加密和公開密鑰加密混合的加密方式,在交換密鑰對環(huán)節(jié)使用公開密鑰加密方式(防止被監(jiān)聽泄漏密鑰)加密共享的密鑰,在隨后的通信過程中使用共享密鑰的方式使用共享的密鑰進(jìn)行加解密。
認(rèn)證方式實現(xiàn)
數(shù)字證書
數(shù)字簽名是附加在報文上的特殊加密校驗碼,可以證明是作者編寫了這條報文,前提是作者才會有私鑰,才能算出這些校驗碼。如果傳輸?shù)膱笪谋淮鄹?,則校驗碼不會匹配,因為校驗碼只有作者保存的私鑰才能產(chǎn)生,所以前面可以保證報文的完整性。
數(shù)字證書認(rèn)證機(jī)構(gòu)(Certificate Authority CA)是客戶端和服務(wù)器雙方都可信賴的第三方機(jī)構(gòu)。
服務(wù)器的運營人員向數(shù)字證書認(rèn)證機(jī)構(gòu)提出證書認(rèn)證申請,數(shù)字證書認(rèn)證機(jī)構(gòu)在判明申請者的身份之后,會對已申請的公開密鑰做數(shù)字簽名,然后分配這個已簽名的公開密鑰,并將該公開密鑰放入公鑰證書(也叫數(shù)字證書或證書)后綁定在一起。服務(wù)器將這份有數(shù)字認(rèn)證機(jī)構(gòu)頒發(fā)的公鑰證書發(fā)總給客戶端,以進(jìn)行公開密鑰加密方式通信。
EV SSL(Extended Validation SSL Certificate)證書是基于國際標(biāo)準(zhǔn)的認(rèn)證指導(dǎo)方針辦法的證書,通過認(rèn)證的Web網(wǎng)站能獲得更高的認(rèn)可度。持有EV SSL證書的Web網(wǎng)站的瀏覽器地址欄的背景色是綠色的,同時在地址欄的左側(cè)顯示了SSL證書中記錄的組織名稱及辦法證書的認(rèn)證機(jī)構(gòu)的名稱。
使用OpenSSL,每個人都可以構(gòu)建一套認(rèn)證機(jī)構(gòu)文件,同時可以用來給自己的證書請求進(jìn)行簽名,這種方式產(chǎn)生的證書稱為自簽名證書,這種證書通常是CA自己的證書,用戶開發(fā)測試的正式,也可以像12306這樣的,信不信由你。
證書信任的方式
- 操作系統(tǒng)和瀏覽器內(nèi)置每個操作系統(tǒng)和大多數(shù)瀏覽器都會內(nèi)置一個知名證書頒發(fā)機(jī)構(gòu)的名單。因此,你也會信任操作系統(tǒng)及瀏覽器提供商提供和維護(hù)的可信任機(jī)構(gòu)。受信認(rèn)證機(jī)構(gòu)(也有不受信的,比如賽門鐵克,沃通,或者像2011年被入侵的DigiNotar等)的證書一般會被操作系統(tǒng)或者瀏覽器在發(fā)行或者發(fā)布時內(nèi)置。
- 證書頒發(fā)機(jī)構(gòu)CA( Certificate Authority,證書頒發(fā)機(jī)構(gòu))是被證書接受者(擁有者)和依賴證書的一方共同信任的第三方。
- 手動指定證書所有瀏覽器和操作系統(tǒng)都提供了一種手工導(dǎo)入信任證書的機(jī)制。至于如何獲得證書和驗證完整性則完全由你自己來定。
PKI(Public Key Infrastructure),即公開密鑰基礎(chǔ)設(shè)施,是國際上解決開放式互聯(lián)網(wǎng)絡(luò)信息安全需求的一套體系。PKI支持身份認(rèn)證,信息傳輸,存儲的完整性,消息傳輸,存儲的機(jī)密性以及操作的不可否認(rèn)性。
數(shù)據(jù)完整性
數(shù)字簽名是只有信息發(fā)送者才能產(chǎn)生的別人無法偽造的一段文本,這段文本是對信息發(fā)送者發(fā)送信息真實性的一個有效證明,具有不可抵賴性。
報文的發(fā)送方從報文文本生成一個128位的散列值(或稱為報文摘要活哈希值),發(fā)送方使用自己的私鑰對這個摘要值進(jìn)行加密來形成發(fā)送方的數(shù)字簽名。然后這個數(shù)字簽名將作為報文的附件一起發(fā)送給報文的接收方。報文的接收方首先從接收到的原始報文中計算出128位的散列值,再用發(fā)送方的公鑰來對報文附加的數(shù)字簽名進(jìn)行解密。如果兩次得到的結(jié)果是一致的那么接收方可以確認(rèn)該數(shù)字簽名是發(fā)送方的,同時確認(rèn)信息是真實的 。
HTTPS數(shù)據(jù)交互過程
HTTP中沒有加密機(jī)制,可以通過SSL(Secure Socket Layer 安全套接層)或TLS(Transport Layer Security 安全層傳輸協(xié)議)的組合使用,加密HTTP的通信內(nèi)容。
HTTPS是 HTTP Secure 或 HTTP over SSL。
SSL(Security Socket Layer)是最初由網(wǎng)景公司(NetScape)為了保障網(wǎng)上交易安全而開發(fā)的協(xié)議,該協(xié)議通過加密來保護(hù)客戶個人資料,通過認(rèn)證和完整性檢查來確保交易安全。網(wǎng)景公司開發(fā)過SSL3.0之前的版本;目前主導(dǎo)權(quán)已轉(zhuǎn)移給IETF(Internet Engineering Task Force),IETF以SSL3.0為原型,標(biāo)準(zhǔn)化并制定了TSL1.0,TLS1.1,TLS1.2。但目前主流的還是SSL3.0和TSL1.0。
SSL工作在OSI七層模型中的表示層,TCP/IP 四層模型的應(yīng)用層。
SSL 和 TLS 可以作為基礎(chǔ)協(xié)議的一部分(對應(yīng)用透明),也可以嵌入在特定的軟件包中(比如Web服務(wù)器中的實現(xiàn))。
SSL 基于TCP,SSL不是簡單地單個協(xié)議,而是兩層協(xié)議;SSL記錄協(xié)議(SSL Record Protocol)為多種高層協(xié)議(SSL握手協(xié)議,SSL修改密碼參數(shù)協(xié)議,SSL報警協(xié)議)提供基本的安全服務(wù)。HTTP是為Web客戶端/服務(wù)器交互提供傳輸服務(wù)的,它可以在SSL的頂層運行;SSL記錄協(xié)議為SSL鏈接提供兩種服務(wù),機(jī)密性:握手協(xié)議定義了一個共享密鑰,用于SSL載荷的對稱加密。 消息完整性:握手協(xié)議還定義了一個共享密鑰,它用來產(chǎn)生一個消息認(rèn)證碼(Message Authentication Code,MAC)。
SSL記錄協(xié)議操作
- 分段 將每個上層消息分解成不大于2^14(16384)位,然后有選擇的進(jìn)行壓縮
- 添加MAC 在壓縮數(shù)據(jù)的基礎(chǔ)上計算MAC
- 加密 消息加上MAC用對稱加密方法加密
- 添加SSL記錄頭 內(nèi)容類型(8位),主版本(8位),副版本(8位),壓縮長度(16位)
SSL握手過程
- 第一階段 建立安全能力 包括協(xié)議版本 會話Id 密碼構(gòu)件 壓縮方法和初始隨機(jī)數(shù)
- 第二階段 服務(wù)器發(fā)送證書 密鑰交換數(shù)據(jù)和證書請求,最后發(fā)送請求-相應(yīng)階段的結(jié)束信號
- 第三階段 如果有證書請求客戶端發(fā)送此證書 之后客戶端發(fā)送密鑰交換數(shù)據(jù) 也可以發(fā)送證書驗證消息
- 第四階段 變更密碼構(gòu)件和結(jié)束握手協(xié)議
SSL協(xié)議兩個重要概念,SSL會話,SSL連接;SSL連接是點到點的連接,而且每個連接都是瞬態(tài)的,每一個鏈接都與一個會話關(guān)聯(lián)。SSL會話是一個客戶端和一個服務(wù)器之間的一種關(guān)聯(lián),會話由握手協(xié)議(Handshake Protocol)創(chuàng)建,所有會話都定義了一組密碼安全參數(shù),這些安全參數(shù)可以在多個連接之間共享,會話可以用來避免每一個鏈接需要進(jìn)行的代價高昂的新的安全參數(shù)協(xié)商過程。
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
客戶端服務(wù)器數(shù)據(jù)交互實戰(zhàn)
使用openssl命令
openssl s_client -state -connect q.qunarzz.com:443
該命令可以顯示SSL握手過程,SSL證書鏈,公鑰證書以及其他相關(guān)的狀態(tài)和屬性信息。
使用Wireshark抓取數(shù)據(jù)包
相關(guān)配置
- 配置環(huán)境變量,同時保證文件路徑存在
SSLKEYLOG=/path/to/sslkeylog.log
- 配置Wireshark
Wireshark->Preference->Protocols->SSL->(Pre)-Master-Secret log filename=>選擇上面的路徑
抓包操作
- 在命令行中打開Chrome或者Firefox,確保環(huán)境變量被讀取;如果不行就用Chrome或者Firefox的開發(fā)版。
open /Applications/Firefox.app open /Applications/Google\ Chrome.app
- 確保$SSLKEYLOGFILE里面有內(nèi)容了,再往下進(jìn)行。
- 選擇對應(yīng)網(wǎng)卡,抓包配置為host http://q.qunarzz.com,開始抓包
- 使用剛剛打開的瀏覽器訪問一個對應(yīng)host http://q.qunarzz.com下的某個資源,在抓包界面使用ssl過濾數(shù)據(jù)
- 在抓包界面可以看到對應(yīng)的SSL握手信息,同時還能看到解密后的應(yīng)用數(shù)據(jù)。
內(nèi)容解析(不同的網(wǎng)絡(luò)資源可能不完全一致,比如需要客戶端證書)
客戶端⇒服務(wù)器
- Client Hello
- 最高支持的協(xié)議版本 如TLS 1.0
- 支持的加密算法列表(Cipher Suites)
- 支持的壓縮算法列表(Compression Methods)
- 客戶端生成的隨機(jī)數(shù),稍后用于生成會話密鑰
服務(wù)器⇒客戶端
- Server Hello
- 選定的協(xié)議版本
- 選定的加密算法
- 選定的壓縮方法
- 服務(wù)端生成的隨機(jī)數(shù),稍后用于生成會話密鑰
- Certificate 證書內(nèi)容
- Server Key Exchange, Server Hello Done
- 公鑰
- 數(shù)字簽名
- Server Hello Done
客戶端⇒服務(wù)器
- Client Key Exchange, Change Cipher Spec, Finished
- 公鑰
- Change Cipher Spec
- Finished
客戶端⇒服務(wù)器
- HTTP GET
服務(wù)端⇒客戶端
- 內(nèi)容的數(shù)據(jù)片段信息
- HTTP HTTP/1.1 200 OK
服務(wù)端⇒客戶端
- Encrypted Alert
- Alert (Level Warning, Description: Close Notify)
參考資料
- 《Web性能權(quán)威指南》
- 《RFC 2246》
- 《圖解HTTP》
- 《HTTP權(quán)威指南》
- 《HTTPS權(quán)威指南 在服務(wù)器和Web應(yīng)用上部署SSL/TLS和PKI》
- 《計算機(jī)網(wǎng)絡(luò)系統(tǒng)方法》
- 《計算機(jī)網(wǎng)絡(luò)自上而下方法》
- 《計算機(jī)安全原理與實踐》
- 《網(wǎng)絡(luò)安全基礎(chǔ)-應(yīng)用與標(biāo)準(zhǔn)》
- 《PKI/CA與數(shù)字證書技術(shù)大全》
- 《SSL與TLS》
- 《OpenSSL官方命令文檔》
- 《OpenSSL與網(wǎng)絡(luò)信息安全-基礎(chǔ)、結(jié)構(gòu)和指令》
- 《OpenSSL攻略》
- Wireshark Doc SSL