SSL的那些事兒
Https
氓扛,SSL
平時我們都聽的挺多塌衰,知道它是用來加密的豌注,但是對于里面的工作原理不是很清楚,所以在這里我也總結(jié)下 SSL
的工作原理揉忘,希望大家能夠幫助到大家跳座。
PS:其實這篇文章寫了很久了,是在一次公司的內(nèi)部培訓(xùn)準備的泣矛,寫了幾天PPT疲眷,也看了好多資料,雖然講完了您朽,但是一直放在自己的iCloud里了狂丝,最近又突然看到它了,想到畢竟也是花了時間在上面哗总,還是想整理下發(fā)出來几颜,和大家一起學(xué)習探討。
目錄
- 不安全的Case
- SSL出現(xiàn)的背景
- SSL的演進
- SSL的工作流程
- 小結(jié)
一讯屈,不安全的Case
明文傳輸
眾所周知蛋哭,明文傳輸肯定是不安全的。下面這個例子里涮母,A
告訴 B
的每一句話谆趾,都會被 C
看到躁愿。
密文傳輸
這種對稱加密傳輸?shù)倪^程是需要通信雙方都能提前知道加密密鑰,然后才能讀懂雙方發(fā)送的密文沪蓬。一旦雙方其中有一方泄露了加密密鑰彤钟,整個通信過程就會有危險了。下面這個例子跷叉,如果 C
不管通過什么途徑獲取到了加密密鑰逸雹,那么 C
就能看到 A
和 B
之間的通信內(nèi)容了。
二云挟,SSL出現(xiàn)的背景
基于萬維網(wǎng)的電子商務(wù)和網(wǎng)上銀行等新興應(yīng)用峡眶,極大地方便了人們的日常生活,受到人們的青睞植锉。由于這些應(yīng)用都需要在網(wǎng)絡(luò)上進行在線交易,它們對網(wǎng)絡(luò)通信的安全性提出了更高的要求峭拘。傳統(tǒng)的萬維網(wǎng)協(xié)議HTTP不具備安全機制——采用明文的形式傳輸數(shù)據(jù)俊庇、不能驗證通信雙方的身份、無法防止傳輸?shù)臄?shù)據(jù)被篡改等鸡挠,導(dǎo)致HTTP無法滿足電子商務(wù)和網(wǎng)上銀行等應(yīng)用的安全性要求辉饱。
與此同時,所有行業(yè)都面臨著如下三大風險:
- 竊聽風險(eavesdropping):第三方可以獲知通信內(nèi)容拣展。
- 篡改風險(tampering):第三方可以修改通信內(nèi)容彭沼。
- 冒充風險(pretending):第三方可以冒充他人身份參與通信。
那么什么是SSL呢备埃?相信大家都會有這個疑問姓惑。
SSL(Secure Socket Layer)是netscape公司設(shè)計的主要用以保障在Internet上數(shù)據(jù)傳輸安全,利用數(shù)據(jù)加密(Encryption)技術(shù)按脚,可確保數(shù)據(jù)在網(wǎng)絡(luò)上之傳輸過程中不會被截取及竊聽于毙。一般通用之規(guī)格為40 bit之安全標準,美國則已推出128 bit之更高安全標準辅搬,但限制出境唯沮。當前版本為3.0。它已被廣泛地用于Web瀏覽器與服務(wù)器之間的身份認證和加密數(shù)據(jù)傳輸堪遂。
IETF(www.ietf.org)將SSL作了標準化介蛉,即RFC2246,并將其稱為TLS(Transport Layer Security),從技術(shù)上講溶褪,TLS1.0與SSL3.0的差別非常微小币旧。
在WAP的環(huán)境下,由于手機及手持設(shè)備的處理和存儲能力有限竿滨,wap論壇(www.wapforum.org)在TLS的基礎(chǔ)上做了簡化佳恬,提出了WTLS協(xié)議(Wireless Transport Layer Security)捏境,以適應(yīng)無線的特殊環(huán)境。
三毁葱,SSL的演進
在講到SSL演進之前垫言,還是先跟大家講下我們的對稱加密和非對稱加密。
對稱加密 symmetric cryptographic
- 簡單的說就是加密和解密用的同一個密鑰倾剿。常見的有DES筷频,RC5。
- 優(yōu)點:加解密速度快前痘。缺點:容易暴露密鑰凛捏。
- 公式:E(msg, key) = emsg, D(emsg, key) = msg芹缔。
非對稱加密 asymmetric cryptographic
- 是指一對加密密鑰與解密密鑰坯癣,這兩個密鑰是數(shù)學(xué)相關(guān),用某用戶密鑰加密后所得的信息最欠,只能用該用戶的解密密鑰才能解密示罗。如果知道了其中一個,并不能計算出另外一個芝硬。因此如果公開了一對密鑰中的一個蚜点,并不會危害到另外一個的秘密性質(zhì)。稱公開的密鑰為公鑰拌阴;不公開的密鑰為私鑰绍绘。
- 簡單的說就是加密密鑰與解密密鑰不同,分私鑰和公鑰迟赃。這種方法大多用于密鑰交換陪拘,RSA便是一個我們熟知的例子。
- 優(yōu)點:安全性高纤壁,不用暴露私鑰藻丢。缺點:加解密速度慢。
- 公式:E(msg, publickey) = emsg摄乒, D(emsg, publickey) != msg悠反, D(emsg, privatekey) = msg。
公鑰加密和私鑰解密
下面這個圖例子里馍佑,其實是有兩個場景:
B
手上是有一對密鑰的斋否,一個公鑰和一個私鑰,然后在A
和B
通信的過程中拭荤,B
把公鑰交給A
茵臭,私鑰是自己保管的,然后A
就可以拿著這個公鑰去加密談話內(nèi)容了舅世,而且這個加密的內(nèi)容只能是B
才能解密的旦委。- 流程是
1
里面是一樣的奇徒,主要是加密的內(nèi)容換成了一個對稱密鑰,然后用對稱密鑰去保證通信安全缨硝。
但是摩钙,如果只是提供公鑰和私鑰,任何人都可以是 B
查辩,只要跟 C
謊稱自己就是那個 B
胖笛,然后提供公鑰代替 B
的公鑰,這樣的導(dǎo)致的結(jié)果是 A 根本不知道自己是在跟一個假 B
在聊天宜岛,后果很嚴重长踊。
證書
由于存在上面的身份不確認的問題,這里我們引入了證書來幫助證明 B
就是 B
萍倡,而不是假 B
身弊。
那么什么是證書呢? 簡單的理解證書是一個包含身份ID(類似我們的身份證)列敲,和公鑰信息的一個數(shù)字文件佑刷。
數(shù)字證書就是互聯(lián)網(wǎng)通訊中標志通訊各方身份信息的一串數(shù)字,提供了一種在Internet上驗證通信實體身份的方式酿炸,其作用類似于司機的駕駛執(zhí)照或日常生活中的身份證。它是由一個由權(quán)威機構(gòu)-----CA機構(gòu)涨冀,又稱為證書授權(quán)(Certificate Authority)中心發(fā)行的填硕,人們可以在網(wǎng)上用它來識別對方的身份。數(shù)字證書是一個經(jīng)證書授權(quán)中心數(shù)字簽名的包含公開密鑰擁有者信息以及公開密鑰的文件鹿鳖。最簡單的證書包含一個公開密鑰扁眯、名稱以及證書授權(quán)中心的數(shù)字簽名
目前數(shù)字證書的格式普遍采用的是X.509V3國際標準,一個標準的X.509數(shù)字證書包含以下一些內(nèi)容:
剛才上面有講寂拆,證書其實是由 CA
發(fā)放的翔冀,這里就會牽扯到 CA
的概念了爽醋。簡單點講,CA
是一個信任中心绣版,可以理解是跟央行一樣,央行發(fā)行的紙歼疮,你信嗎杂抽? 這個紙,你當然不信韩脏,但是你信任央行啊缩麸,信任政府啊,自然這個紙它就值錢了赡矢。所以同理杭朱,CA
發(fā)放的證書自然也是真實可靠的阅仔。
- CA機構(gòu),又稱為證書授證(Certificate Authority)中心弧械,作為電子商務(wù)交易中受信任的第三方八酒,承擔公鑰體系中公鑰的合法性檢驗的責任。CA中心為每個使用公開密鑰的用戶發(fā)放一個數(shù)字證書梦谜,數(shù)字證書的作用是證明證書中列出的用戶合法擁有證書中列出的公開密鑰丘跌。CA機構(gòu)的數(shù)字簽名使得攻擊者不能偽造和篡改證書。它負責產(chǎn)生唁桩、分配并管理所有參與網(wǎng)上交易的個體所需的數(shù)字證書闭树,因此是安全電子交易的核心環(huán)節(jié)。由此可見荒澡,建設(shè)證書授權(quán)(CA)中心报辱,是開拓和規(guī)范電子商務(wù)市場必不可少的一步。為保證用戶之間在網(wǎng)上傳遞信息的安全性单山、真實性碍现、可靠性、完整性和不可抵賴性米奸,不僅需要對用戶的身份真實性進行驗證昼接,也需要有一個具有權(quán)威性、公正性悴晰、唯一性的機構(gòu)慢睡,負責向電子商務(wù)的各個主體頒發(fā)并管理符合國內(nèi)、國際安全電子交易協(xié)議標準的電子商務(wù)安全證書铡溪。
- 數(shù)字證書頒發(fā)過程一般為:管理員只需生成“證書請求”(后綴大多為.csr)漂辐,它包含你的個人信息和公鑰,然后把這份請求交給諸如Globlesign棕硫,verisign等有CA服務(wù)公司(當然髓涯,連同幾百美金),你的證書請求經(jīng)驗證后哈扮,CA用它的私鑰簽名纬纪,形成正式的證書發(fā)還給你。管理員再在server上導(dǎo)入這個證書就行了滑肉。
下圖就是 CA
到 用戶證書
的一個組織結(jié)構(gòu):
所以育八,只要引入了證書,那相當于赦邻,客戶端會去獲取到服務(wù)器的證書髓棋,然后會去判斷這個證書是否是我們的 CA
所發(fā)放的,自然就校驗了證書的合法性。最后的結(jié)構(gòu)就是我們的 B
小伙終于可以證明自己了按声,而不用哭暈在廁所里了膳犹。
說到這里,可能有的小伙伴會問签则,由于商業(yè)證書都是要買的须床,沒有錢怎么辦?或者是說我們的服務(wù)都是內(nèi)網(wǎng)的渐裂,不用考慮太多豺旬。那有什么可以滿足這種訴求嗎? 既然有我們的 CA
柒凉,那有沒有不是 CA
的呢族阅? 答案是有的。就是我們可以自己來當這個非官方 CA
膝捞,相當于搭建一個私服坦刀,自己玩,自己嗨蔬咬。
Self-signed certificate:由自己的私鑰簽名而非第三方CA簽發(fā)的證書鲤遥。如果你不想花那筆錢,可以自己做CA林艘,現(xiàn)在有一些工具(openssl盖奈,keynote)可以幫助生成自定義的CA,服務(wù)器的證書和自簽名狐援。當服務(wù)器端安裝好有自定義CA簽名的證書時钢坦,這個時候客戶端是需要導(dǎo)入自定義的CA證書,意味著客戶端“信任”這個CA簽署的證書)咕村。而商業(yè)CA的一般不用,因為它們已經(jīng)內(nèi)置在系統(tǒng)中了蚊俺。
但是建議商業(yè)服務(wù)器還是要買個證書來保證安全懈涛。
數(shù)字簽名
由于公鑰加密只能協(xié)商出一個會話密鑰,通過會話密鑰可以保證通信的機密性泳猬。但是不能保證通信的完整性批钠。簡單的說就是證書能夠保證通信的內(nèi)容不被破解,但是不能保證內(nèi)容被篡改得封。
在下面的例子里埋心,A
小伙和 B
小伙通過一段時間的溝通已經(jīng)互有好感,此時 B
小伙想要告訴 A
小伙:"我喜歡你"忙上。但是居心叵測的 C
非要過來插一腳拷呆,在后面補一句變成了:"我喜歡你 我去年買了個表",可想而知,從此世界少了一對茬斧,不知道 C
是出于什么心態(tài)啊腰懂。不管怎么樣,C
成功篡改了通信內(nèi)容项秉。
那么問題來了绣溜,有什么辦法可以讓 A
小伙和 B
小伙在一起呢。
duang娄蔼,duang怖喻,duang,數(shù)字簽名來了岁诉。數(shù)字簽名就是為了解決信息被篡改的干活锚沸。
數(shù)字簽名是指用原文進行HASH運算得到摘要信息并用發(fā)送者的私鑰加密,與原文一起傳送給接收者唉侄。接收者只有用發(fā)送者的公鑰才能解密被加密的摘要信息咒吐,然后用HASH函數(shù)對收到的原文產(chǎn)生一個摘要信息,與解密的摘要信息對比属划。如果相同恬叹,則說明收到的信息是完整的,在傳輸過程中沒有被修改同眯,否則說明信息被修改過绽昼,因此數(shù)字簽名能夠驗證信息的完整性。
有了數(shù)字簽名的幫助须蜗,誰都無法阻止 A
和 B
在一起了硅确。而這一切都是 SSL
自動幫我們做了,就是這么自然明肮,但是了解里面的原理還是很有必要的菱农。
四,SSL的工作流程
首先來說下它的架構(gòu)柿估,SSL是一個介于HTTP協(xié)議與TCP之間的一個可選層循未。
---------
| HTTP |
---------
| SSL |
---------
| TCP |
---------
| IP |
---------
- SSL層: 借助SSL層協(xié)議的的信道安全的協(xié)商出一份加密密鑰,并用此密鑰來加密HTTP請求秫舌,SSL在TCP之上建立了一個加密通道的妖,通過這一層的數(shù)據(jù)經(jīng)過了加密,因此達到保密的效果
- TCP層:與web server的443端口建立連接足陨,傳遞SSL處理后的數(shù)據(jù)嫂粟。
- SSL協(xié)議可分為部分: SSL記錄協(xié)議(SSL Record Protocol):它建立在可靠的傳輸協(xié)議(如TCP)之上,為高層協(xié)議提供數(shù)據(jù)封裝墨缘、壓縮星虹、加密等基本功能的支持零抬。 SSL握手協(xié)議(SSL Handshake Protocol):它建立在SSL記錄協(xié)議之上,用于在實際的數(shù)據(jù)傳輸開始前搁凸,通訊雙方進行身份認證媚值、協(xié)商加密算法、交換加密密鑰等护糖。
握手的過程
簡單的說客戶端會發(fā)出一個 ClientHello
來發(fā)起握手褥芒,這個消息里面包含了自己可實現(xiàn)的算法列表和其它一些需要的消息,服務(wù)器端會回應(yīng)一個 ServerHello
嫡良,這里面確定了這次通信所需要的算法锰扶,然后發(fā)過去自己的證書(里面包含了身份和自己的公鑰)∏奘埽客戶端在收到這個消息后會生成一個秘密消息坷牛,用服務(wù)器的公鑰加密后傳過去,然后服務(wù)器端用自己的私鑰解密后很澄,會話密鑰協(xié)商成功京闰,雙方可以用同一份會話密鑰來安全通信了。
舉個更形象的例子:
我們假設(shè)A與B通信甩苛,A是SSL客戶端蹂楣,B是SSL服務(wù)器端,加密后的消息放在方括號[]里讯蒲,以突出明文消息的區(qū)別痊土。雙方的處理動作的說明用圓括號()括起。
A:我想和你安全的通話墨林,我這里的對稱加密算法有DES,RC5,密鑰交換算法有RSA和DH赁酝,摘要算法有MD5和SHA。
B:我們用DES-RSA-SHA這對組合好了旭等。這是我的證書酌呆,里面有我的名字和公鑰,你拿去驗證一下我的身份(把證書發(fā)給A)搔耕。目前沒有別的可說的了隙袁。
A:(查看證書上B的名字是否無誤,并通過手頭早已有的CA的證書驗證了B的證書的真實性度迂,如果其中一項有誤藤乙,發(fā)出警告并斷開連接猜揪,這一步保證了B的公鑰的真實性)產(chǎn)生一份秘密消息惭墓,這份秘密消息處理后將用作加密密鑰,加密初始化向量和hmac的密鑰而姐。將這份秘密消息-協(xié)議中稱為per_master_secret-用B的公鑰加密腊凶,封裝成稱作ClientKeyExchange的消息。由于用了B的公鑰,保證了第三方無法竊聽)
我生成了一份秘密消息钧萍,并用你的公鑰加密了褐缠,給你(把ClientKeyExchange發(fā)給B)
注意,下面我就要用加密的辦法給你發(fā)消息了风瘦!
(將秘密消息進行處理队魏,生成加密密鑰,加密初始化向量和hmac的密鑰)
[我說完了]
B:(用自己的私鑰將ClientKeyExchange中的秘密消息解密出來万搔,然后將秘密消息進行處理胡桨,生成加密密鑰,加密初始化向量和hmac的密鑰瞬雹,這時雙方已經(jīng)安全的協(xié)商出一套加密辦法了)
注意昧谊,我也要開始用加密的辦法給你發(fā)消息了!
[我說完了]
A: [我的秘密是...]
B: [其它人不會聽到的...]
小結(jié)
自此酗捌,我們終于撥開了 SSL
的迷霧呢诬,SSL
一個看似簡單的東西,里面涵蓋了對稱加密胖缤,非對稱加密尚镰,證書 和 數(shù)字簽名。對 SSL
感興趣的小伙伴了解下這些還是有好處的草姻,至少都是和我們學(xué)習工作息息相關(guān)的钓猬。