本文摘錄參考:
細(xì)說 CA 和證書(主要講解 CA 的使用)
數(shù)字簽名是什么?(簡(jiǎn)單理解原理)
深入淺出 HTTPS 工作原理(深入理解原理)
HTTP 協(xié)議由于是明文傳送铸鹰,所以存在三大風(fēng)險(xiǎn):
1癌别、被竊聽的風(fēng)險(xiǎn):第三方可以截獲并查看你的內(nèi)容
2、被篡改的危險(xiǎn):第三方可以截獲并修改你的內(nèi)容
3蹋笼、被冒充的風(fēng)險(xiǎn):第三方可以偽裝成通信方與你通信
HTTP 因?yàn)榇嬖谝陨先蟀踩L(fēng)險(xiǎn)展姐,所以才有了 HTTPS 的出現(xiàn)。
HTTPS 涉及到了很多概念剖毯,比如 SSL/TSL圾笨,數(shù)字證書、數(shù)字簽名逊谋、加密擂达、認(rèn)證、公鑰和私鑰等胶滋,比較容易混淆板鬓。我們先從一次簡(jiǎn)單的安全通信故事講起吧,其中穿插復(fù)習(xí)一些密碼學(xué)的概念究恤。
一俭令、關(guān)于 Bob 與他好朋友通信的故事
這個(gè)故事的原文是:
http://www.youdzone.com/signature.html
阮一峰老師也翻譯過:
http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
(不過阮老師里面沒有很好的區(qū)分加密和認(rèn)證的概念,以及最后 HTTPS 的說明不夠嚴(yán)謹(jǐn)部宿,評(píng)論區(qū)的針對(duì)這些問題的討論比較激烈抄腔,挺有意思的)
這里重新敘述一下這個(gè)故事:
故事的主人公是 Bob,他有三個(gè)好朋友 Pat、Doug 和 Susan赫蛇。Bob 經(jīng)常跟他們寫信绵患,因?yàn)樗男攀敲魑膫鬏數(shù)模趥鬟f過程可能被人截獲偷窺棍掐,也可能被人截獲然后又篡改了藏雏,更有可能別人偽裝成 Bob 本人跟他的好朋友通信拷况,總之是不安全的作煌。他很苦惱,經(jīng)過一番苦苦探索赚瘦,誒粟誓,他發(fā)現(xiàn)計(jì)算機(jī)安全學(xué)里有一種叫非對(duì)稱加密算法的東東,好像可以幫助他解決這個(gè)問題
說明:非對(duì)稱加密算法(RSA)是內(nèi)容加密的一類算法起意,它有兩個(gè)秘鑰:公鑰與私鑰鹰服。公鑰是公開的鑰匙,所有人都可以知道揽咕,私鑰是保密的悲酷,只有持有者知道。通過公鑰加密的內(nèi)容亲善,只能通過私鑰解開设易。非對(duì)稱加密算法的安全性很高,但是因?yàn)橛?jì)算量龐大蛹头,比較消耗性能顿肺。
好了,來看看 Bob 是怎么應(yīng)用非對(duì)稱加密算法與他的好朋友通信的:
1渣蜗、首先 Bob 弄到了兩把鑰匙:公鑰和私鑰屠尊;
2、Bob 自己保留下了私鑰耕拷,把公鑰復(fù)制成三份送給了他的三個(gè)好朋友 Pat讼昆、Doug 和 Susan;
3骚烧、此時(shí)浸赫,Bob 總算可以安心地和他的好朋友愉快地通信了。比如 Susan 要和他討論關(guān)于去哪吃午飯的事情止潘,Susan 就可以先把自己的內(nèi)容(明文)首先用 Bob 送給他的公鑰做一次加密掺炭,然后把加密的內(nèi)容傳送給 Bob。Bob 收到信后凭戴,再用自己的私鑰解開信的內(nèi)容涧狮;
說明:這其實(shí)是計(jì)算機(jī)安全學(xué)里加密的概念,加密的目的是為了不讓別人看到傳送的內(nèi)容,加密的手段是通過一定的加密算法及約定的密鑰進(jìn)行的(比如上述用了非對(duì)稱加密算法以及 Bob 的公鑰)者冤,而解密則需要相關(guān)的解密算法及約定的秘鑰(如上述用了非對(duì)稱加密算法和 Bob 自己的私鑰)肤视,可以看出加密是可逆的(可解密的)。
4涉枫、Bob 看完信后邢滑,決定給 Susan 回一封信。為了防止信的內(nèi)容被篡改(或者別人偽裝成他的身份跟 Susan 通信)愿汰,他決定先對(duì)信的內(nèi)容用 hash 算法做一次處理困后,得到一個(gè)字符串哈希值,Bob 又用自己的私鑰對(duì)哈希值做了一次加密得到一個(gè)簽名衬廷,然后把簽名和信(明文的)一起發(fā)送給 Susan摇予;
說明 2:Bob 的內(nèi)容實(shí)質(zhì)是明文傳輸?shù)模赃@個(gè)過程是可以被人截獲和窺探的吗跋,但是 Bob 不擔(dān)心被人窺探侧戴,他擔(dān)心的是內(nèi)容被人篡改或者有人冒充自己跟 Susan 通信。這里其實(shí)涉及到了計(jì)算機(jī)安全學(xué)中的認(rèn)證概念跌宛,Bob 要向 Susan 證明通信的對(duì)方是 Bob 本人酗宋,另外也需要確保自己的內(nèi)容是完整的。
5疆拘、Susan 接收到了 Bob 的信蜕猫,首先用 Bob 給的公鑰對(duì)簽名作了解密處理,得到了哈希值 A入问,然后 Susan 用了同樣的 Hash 算法對(duì)信的內(nèi)容作了一次哈希處理丹锹,得到另外一個(gè)哈希值 B,對(duì)比 A 和 B芬失,如果這兩個(gè)值是相同的楣黍,那么可以確認(rèn)信就是 Bob 本人寫的,并且內(nèi)容沒有被篡改過棱烂;
說明:4 跟 5 其實(shí)構(gòu)成了一次完整的通過數(shù)字簽名進(jìn)行認(rèn)證的過程租漂。數(shù)字簽名的過程簡(jiǎn)述為:發(fā)送方通過不可逆算法對(duì)內(nèi)容 text1 進(jìn)行處理(哈希),得到的結(jié)果值 hash1颊糜,然后用私鑰加密 hash1 得到結(jié)果值 encry1哩治。對(duì)方接收 text1 和 encry1,用公鑰解密 encry1 得到 hash1衬鱼,然后用 text1 進(jìn)行同等的不可逆處理得到 hash2业筏,對(duì) hash1 和 hash2 進(jìn)行對(duì)比即可認(rèn)證發(fā)送方。
6鸟赫、此時(shí)蒜胖,另外一種比較復(fù)雜出現(xiàn)了消别,Bob 是通過網(wǎng)絡(luò)把公鑰寄送給他的三個(gè)好朋友的,有一個(gè)不懷好意的家伙 Jerry 截獲了 Bob 給 Doug 的公鑰台谢。Jerry 開始偽裝成 Bob 跟 Doug 通信寻狂,Doug 感覺通信的對(duì)象不像是 Bob,但是他又無法確認(rèn)朋沮;
7蛇券、Bob 最終發(fā)現(xiàn)了自己的公鑰被 Jerry 截獲了,他感覺自己的公鑰通過網(wǎng)絡(luò)傳輸給自己的小伙伴似乎也是不安全的樊拓,不懷好意的家伙可以截獲這個(gè)明文傳輸?shù)墓€纠亚。為此他想到了去第三方權(quán)威機(jī)構(gòu)"證書中心"(certificate authority,簡(jiǎn)稱 CA)做認(rèn)證骑脱。證書中心用自己的私鑰對(duì) Bob 的公鑰和其它信息做了一次加密菜枷。這樣 Bob 通過網(wǎng)絡(luò)將數(shù)字證書傳遞給他的小伙伴后,小伙伴們先用 CA 給的公鑰解密證書叁丧,這樣就可以安全獲取 Bob 的公鑰了。
二岳瞭、HTTPS 通信過程
通過 Bob 與他的小伙伴的通信拥娄,我們已經(jīng)可以大致了解一個(gè)安全通信的過程,也可以了解基本的加密瞳筏、解密稚瘾、認(rèn)證等概念。HTTPS 就是基于這樣一個(gè)邏輯設(shè)計(jì)的姚炕。
首先看看組成 HTTPS 的協(xié)議:HTTP 協(xié)議和 SSL/TSL 協(xié)議摊欠。HTTP 協(xié)議就不用講了,而 SSL/TSL 就是負(fù)責(zé)加密解密等安全處理的模塊柱宦,所以 HTTPS 的核心在 SSL/TSL 上面些椒。整個(gè)通信如下:
1、瀏覽器發(fā)起往服務(wù)器的 443 端口發(fā)起請(qǐng)求掸刊,請(qǐng)求攜帶了瀏覽器支持的加密算法和哈希算法免糕。
2、服務(wù)器收到請(qǐng)求忧侧,選擇瀏覽器支持的加密算法和哈希算法石窑。
3、服務(wù)器下將數(shù)字證書返回給瀏覽器蚓炬,這里的數(shù)字證書可以是向某個(gè)可靠機(jī)構(gòu)申請(qǐng)的松逊,也可以是自制的。
4肯夏、瀏覽器進(jìn)入數(shù)字證書認(rèn)證環(huán)節(jié)经宏,這一部分是瀏覽器內(nèi)置的 TSL 完成的:
4.1 首先瀏覽器會(huì)從內(nèi)置的證書列表中索引楼咳,找到服務(wù)器下發(fā)證書對(duì)應(yīng)的機(jī)構(gòu),如果沒有找到烛恤,此時(shí)就會(huì)提示用戶該證書是不是由權(quán)威機(jī)構(gòu)頒發(fā)母怜,是不可信任的。如果查到了對(duì)應(yīng)的機(jī)構(gòu)缚柏,則取出該機(jī)構(gòu)頒發(fā)的公鑰苹熏。
4.2 用機(jī)構(gòu)的證書公鑰解密得到證書的內(nèi)容和證書簽名,內(nèi)容包括網(wǎng)站的網(wǎng)址币喧、網(wǎng)站的公鑰轨域、證書的有效期等。瀏覽器會(huì)先驗(yàn)證證書簽名的合法性(驗(yàn)證過程類似上面 Bob 和 Susan 的通信)杀餐。簽名通過后干发,瀏覽器驗(yàn)證證書記錄的網(wǎng)址是否和當(dāng)前網(wǎng)址是一致的,不一致會(huì)提示用戶史翘。如果網(wǎng)址一致會(huì)檢查證書有效期枉长,證書過期了也會(huì)提示用戶。這些都通過認(rèn)證時(shí)琼讽,瀏覽器就可以安全使用證書中的網(wǎng)站公鑰了必峰。
4.3 瀏覽器生成一個(gè)隨機(jī)數(shù) R,并使用網(wǎng)站公鑰對(duì) R 進(jìn)行加密钻蹬。
5吼蚁、瀏覽器將加密的 R 傳送給服務(wù)器。
6问欠、服務(wù)器用自己的私鑰解密得到 R肝匆。
7、服務(wù)器以 R 為密鑰使用了對(duì)稱加密算法加密網(wǎng)頁內(nèi)容并傳輸給瀏覽器顺献。
8旗国、瀏覽器以 R 為密鑰使用之前約定好的解密算法獲取網(wǎng)頁內(nèi)容。
備注 1:前 5 步其實(shí)就是 HTTPS 的握手過程滚澜,這個(gè)過程主要是認(rèn)證服務(wù)端證書(內(nèi)置的公鑰)的合法性粗仓。因?yàn)榉菍?duì)稱加密計(jì)算量較大,整個(gè)通信過程只會(huì)用到一次非對(duì)稱加密算法(主要是用來保護(hù)傳輸客戶端生成的用于對(duì)稱加密的隨機(jī)數(shù)私鑰)设捐。后續(xù)內(nèi)容的加解密都是通過一開始約定好的對(duì)稱加密算法進(jìn)行的借浊。
備注 2:SSL/TLS 是 HTTPS 安全性的核心模塊,TLS 的前身是 SSL萝招,TLS1.0 就是 SSL3.1蚂斤,TLS1.1 是 SSL3.2,TLS1.2 則是 SSL3.3槐沼。 SSL/TLS 是建立在 TCP 協(xié)議之上曙蒸,因而也是應(yīng)用層級(jí)別的協(xié)議捌治。其包括 TLS Record Protocol 和 TLS Handshaking Protocols 兩個(gè)模塊,后者負(fù)責(zé)握手過程中的身份認(rèn)證纽窟,前者則保證數(shù)據(jù)傳輸過程中的完整性和私密性肖油。