15分鐘理解HTTPS——通俗篇
| 導語 它很深奧嗎?你肯定常常見過它,使用它,甚至離不開它... 它很淺顯嗎?你可能覺得看透它,理解它,甚至懂它... 讓我們用15分鐘,不那麽學術地將它的深挖到底~
什麽?如何證明我是我?本文要上升到這樣的哲學高度了嗎?嚇得作者筆都掉了,不,是鍵盤按鍵都飛出來了…
HTTPS的身份認證機制還真的是一個“如何證明我是我”的問題,並且巧妙地使用了“零知識證明”。先來看個故事吧!
我知道某帶密碼門鎖房間的密碼,如何證明我有這個密碼呢?下面有兩種方式:
①我把密碼告訴你,你用密碼打開該房間的鎖。
②我們都知道房間內有某一物體,我用密碼打開房間的門,然後把物體拿出來給你看。
方式①的結果是密碼泄漏了,如果換作二戰被俘的情報員或者被四十大盜劫持的阿裏巴巴身上,他們的結局一定是被無情殺害了。
方式②是零知識證明。它指的是證明者能夠在不向驗證者提供任何有用的信息的情況下,使驗證者相信某個論斷是正確的。
那下面我們來挖一挖HTTPS如何借鑒這種思想進行身份認證的。不過,先來看一眼目錄吧!沒有目錄的長文都是耍流氓…
1.HTTPS原理概述
1.1什麽是HTTPS?
1.2HTTPS保證安全通信的原理(加密|簽名|證書)
1.3一次完整的HTTPS過程
2.HTTPS實踐與應用
2.1從HTTP升級到HTTPS
2.2Fiddler抓包HTTPS
2.3局限性和使用場景
1.1什麽是HTTPS?
一句話:超文本傳輸安全協議(Hypertext Transfer Protocol Secure, HTTP
為什麽要有HTTPS呢?因為HTTP通信是明文傳輸,有以下風險,而HTTPS完美地解決了這些風險。
1.2HTTPS保證安全通信的原理
(一) 加密——防竊聽
舉一個最簡單的加密,abc->bcd。
l 加密函數f:將加密過程抽象成函數。
l 密鑰: f(n)中的參數n。上例中n=1。
l 對稱加密:加密和解密的密鑰相同。計算量小,速度快。
l 非對稱加密:加密和解密的密鑰不同,一般地,服務器方存有私鑰不外傳,而把對應公鑰開放給客戶端。客戶端用公鑰加密內容,服務器用私鑰解密。計算量大,速度慢。
HTTPS的真正加密過程:用非對稱加密方式協商對稱密鑰;通信時使用協商好的對稱密鑰。這段話在看完1.3會更加清晰。
對稱加密非常好理解。HTTPS關鍵技術之一的非對稱加密是如何實現的呢?以比較具有代表性的RSA算法為例,解剖下非對稱加密實現原理:
首先,存在這樣一個事實(1)。其次,非對稱加密是公鑰私鑰計算過程大致如(2)所述。然後,(3)利用兩個式子可以進行加密和解密。
那麽,RSA實現非對稱加密的原理問題,可以簡化為(3)中兩個式子的m是否相等。將(1)中的等式帶入(3)中公式,加以不長不短的數學證明,結果顯示兩式相等。Done! 總結來說,RSA的實現基於的是數學世界中存在的兩個質數之間不對稱關系。(文末附有證明的參考資料)
(1)兩個互質數之間存在一個等式
如果兩個正整數a和n互質,那麽一定可以找到整數b,使得 ab-1 被n整除,或者說ab被n除的余數是1。這時,b就叫做a的“模反元素”。這個等式可以由“歐拉定理”證明。
(2)利用這兩個互質數產生一對公鑰私鑰
S1.隨機選擇兩個不相等的質數p和q。
S2.計算p和q的乘積n。
S3.計算n的歐拉函數φ(n)。
S4.隨機選擇一個整數e,條件是1< e < φ(n),且e與φ(n) 互質。
S5.計算e對於φ(n)的模反元素d。
S6.(n,e)是公鑰,(n,d)是私鑰。
(3)加密和解密
加密:m是要加密信息,用(n,e)計算出加密後信息c。
解密:用(n,d)計算出原始信息m。
(二) 簽名——防篡改
簽名如何證明信息沒有被纂改?
舉例子:
開發gg小猴很帥,到處發自己的公鑰給妹子。有一天他中意一個妹子,想私下給妹子加密寫信。為了防止信被他的好哥們亂改,他這樣做:
把信的內容哈希得到摘要,摘要進行私鑰加密得到簽名,簽名附到信後面。
妹子收到了信,熟練地把信內容哈希得到摘要,把簽名公鑰解密得到摘要,對比兩個摘要相同,相信了這信沒被別人纂改過。防止篡改的原理就是,外人只改動內容會對不上簽名中的摘要,而簽名又是加密過的無法和內容修改的一致。
(三) 證書——防冒充
可惜,妹子還是套路不夠深….
小猴的哥們小豬也喜歡這個妹子,不敢表白,偷偷冒充了小猴。
他盜用小猴電腦,把小猴公鑰換成自己公鑰,用自己的私鑰給妹子寫信。
妹子以為自己拿著小猴的公鑰,驗證了信沒被纂改過。而實際上這公鑰是小豬的,信也是小豬寫的。
要避免這樣的悲劇,“數字證書”就出場了。既然無法確信“小猴的公鑰是小猴的“,那只好找權威機構幫忙認證了
小猴去證書中心(CA)申請證書,CA用自己的私鑰對小猴的公鑰和相關信息一起加密,生成“數字證書“。小猴再寫信時,附上簽名和證書。
妹子收到信,用CA的公鑰(這個不好冒充)解密證書,確信得到的是小猴的公鑰了。
再來看開始提到的零知識證明。它的一個應用是Guillo-Ouisquater身份認證,這種認證方式主要基於了RSA公鑰算法的基本思想。換句話說,前述的簽名和證書的身份認證屬於零知識證明的應用。過程需要一個權威CA,認證可靠,並沒有提供任何有用信息,也不會因認證次數增加而安全性降低。
1.3一次完整的HTTPS過程
流程概述:
- 客戶端向服務器索要公鑰,並驗證
- 雙方協商生成對話密鑰(對稱加密)
- 采用對稱加密通信
步驟1和2稱為握手過程。
驗證證書時,瀏覽器一般存有大型可信CA的公鑰。驗證證書是否為真,是否過期等。如驗證不通過,瀏覽器會顯示警告,用戶可以選擇繼續訪問。
至此,客戶端和服務都有了隨機數①②③,用它們三個形成相同的對稱密鑰,用於接下來通信。
Session恢復:
如果出於某種原因,對話中斷,就需要恢復對話。
? Session ID:session ID保存在一臺服務器中,如果客戶端能提供上次的session ID,就不再需要重新握手。
? Session ticket:不局限於一臺服務器, session ticket是上次對話中服務器發送的,內容是加密過的密鑰和解密方法等,客戶端如果能提供session ticket,也可以恢復對話。
2.HTTPS實踐與應用
2.1從HTTP升級到HTTPS
1申請證書
認證級別
ü 域名認證:最低級別認證,可以確認申請人擁有這個域名。對於這種證書,瀏覽器會在地址欄顯示一把鎖。
ü 公司認證:確認域名所有人是哪一家公司,證書裏面會包含公司信息。
ü 擴展認證:最高級別的認證,瀏覽器地址欄會顯示公司名。
證書類型
? 單域名證書:只能用於單一域名,foo.com的證書不能用於www.foo.com
? 通配符證書:可以用於某個域名及其所有一級子域名,比如*.foo.com的證書可以用於foo.com,也可以用於www.foo.com
? 多域名證書:可以用於多個域名,比如foo.com和bar.com
2證書安裝和配置
一般地,這部分工作會被運維的同事做。
3修改鏈接
通常直接去掉協議名稱,根據用戶輸入的協議為準。如://vip.qq.com
當用戶使用http請求時還是不走https,這時還可以:
不修改鏈接,修改web服務器配置,使用301重定向,如
server {
listen 80;
server_name domain.com www.domain.com;
return 301 https://domain.com$request_uri;
}
2.2Fiddler抓包HTTPS
1.開啟fiddler支持https抓包
2.訪問fiddler代理IP:端口,點擊安裝證書
3.對證書授信
? ios:設置-通用-描述文件與設備管理-點進去選擇信任
? android:設置-安全和隱私-受信任的憑據-用戶-點進去選擇信任
2.3HTTPS的局限性和使用場景
https由於過程復雜,耗時稍慢,需要證書等因素,使得需要高安全性的網站才應用它,或者只在註、登陸、支付等關鍵頁面才使用。
但https如果經過優化,不會明顯影響性能,所有場景都適合使用。
參考資料
《RSA算法原理(一)》
http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
《RSA算法原理(二)》
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
《數字簽名是什麽?》
http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
https://wenku.baidu.com/view/5cf354fd31b765ce04081463.html
https://wenku.baidu.com/view/88a0f233eefdc8d376ee328e.html
《SSL/TLS協議運行機制的概述》
http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
《圖解SSL/TLS協議》
http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html
《HTTPS 升級指南》
http://www.ruanyifeng.com/blog/2016/08/migrate-from-http-to-https.html
等...
15分鐘理解HTTPS——通俗篇