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

































