互聯(lián)網(wǎng)的通信安全,建立在SSL/TLS之上
引自 阮一峰《SSL/TLS協(xié)議運行機制的概述》。
為什么使用SSL/TLS
不使用SSL/TLS的HTTP通信,即明文通信湖雹,存在三大風險
- 竊聽風險
- 篡改風險
- 訪問網(wǎng)頁插播小廣告
- 冒充風險
- 釣魚網(wǎng)站
SSL/TLS怎么解決以上問題:
- 防竊聽:通信過程加密
- 防篡改:具備校驗機制,一旦被篡改曙搬,通信雙方會立刻發(fā)現(xiàn)
- 防冒充:配備證書摔吏,防止被冒充
發(fā)展歷程
- SSL(Secure Socket Layer,安全套接字層)
- 1994年Netscape公司設(shè)計了SSL 1.0纵装,但是未發(fā)布
- 1995年Netscape公司發(fā)布SSL 2.0征讲,存在嚴重的安全漏洞被3.0替代
- 1996年Netscape發(fā)布SSL 3.0,得到大規(guī)模應(yīng)用
- TLS(Transport Layer Security橡娄,傳輸層安全性協(xié)議)
- 1999年IETF將SSL標準化诗箍,并稱作TLS,發(fā)布了SSL的升級版TLS 1.0版本
- 2006年發(fā)布TLS 1.1
- 2008年發(fā)布TLS 1.2挽唉,目前應(yīng)用最廣泛的版本
- 2018年8月發(fā)布TLS 1.3版本
TLS是SSL的升級版扳还,TLS 1.0的版本號是3.1
SSL/TLS如何工作
SSL混合使用了多種加密技術(shù)才避,理解SSL之前先理解這些加密技術(shù):
- SSL使用公開密鑰加密(public key cryptography)來提供認證
- 私鑰加密(secret key cryptography)保證數(shù)據(jù)隱私
- 數(shù)字簽名來保證數(shù)據(jù)完整性
公開密鑰加密(public key cryptography)
- 也稱非對稱加密
- 加解密采用一對密鑰,公鑰公開氨距,私鑰保密。
- 用公鑰加密只有私鑰能解開棘劣,反之亦然俏让。
- 主要用于身份驗證。(B使用自己的私鑰加密數(shù)據(jù)發(fā)送給A茬暇,如果A能夠采用B的公鑰進行解密首昔,則可以相信數(shù)據(jù)確實來自B)
- 數(shù)字簽名
- 公鑰存在形式:數(shù)字證書
- 缺點:計算耗時
- 常見的公開密鑰加密算法
- RSA、ElGamal糙俗、背包算法勒奇、Rabin、迪菲-赫爾曼密鑰交換協(xié)議中的公鑰加密算法巧骚、橢圓曲線加密算法(ECC)
私鑰加密(secret key cryptography)
- 也稱對稱加密赊颠、共享密鑰加密
- 加解密采用采用相同的密鑰,因此是對稱的劈彪,且在通信雙方共享
- 加解密速度比公開密鑰加密快很多竣蹦。
- 常見的對稱加密算法有DES、3DES沧奴、AES痘括、Blowfish、IDEA滔吠、RC5纲菌、RC6。
- 缺點:如何在通信雙方之間安全的共享密鑰疮绷?
工作原理
對稱加密算法加密速度快翰舌,而且很安全,因此可被用作數(shù)據(jù)傳輸?shù)募用芩惴ù@ⅰ5瞧浔∪觞c是如何在通信雙方之間安全的共享密鑰灶芝,即密鑰分發(fā)問題。
有沒有辦法在非安全的通信信道上協(xié)商出一個安全的密鑰用于后續(xù)采用對稱加密進行通信使用(即使通信過程被第三方截獲唉韭,但是只有通信雙方才知道密鑰)夜涕?答案是肯定的。
為了解決這個問題属愤,協(xié)議設(shè)計者引入了公開密鑰加密算法(即非對稱加密)女器,利用該算法作為基礎(chǔ),可以在非安全的傳輸通道上協(xié)商出一個安全的通信密鑰住诸。
以公開密鑰加密算法為基礎(chǔ)可以解決密鑰分發(fā)問題:
- Alice含有一對密鑰驾胆,公鑰公開涣澡,私鑰保留。
- Bob使用Alice的公鑰加密信息發(fā)給Alice丧诺,Alice用其私鑰解開入桂。即使Charlie截獲了Bob發(fā)給Alice的信息,但是由于其沒有Alice的私鑰驳阎,因此其無法解開抗愁。
- Bob向Alice發(fā)消息是沒有問題的,但是Alice向Bob發(fā)送經(jīng)過Alice私鑰加密后的消息還是可以被Charlie解開(因為Alice的公鑰是公開的呵晚,Charlie可以使用Alice的公鑰解開Alice發(fā)送給Bob的消息)
所以蜘腌,單純使用公開密鑰加密是不行的,可利用公開密鑰加密算法協(xié)商出一套后期雙方通信的密鑰饵隙,并且保證即使第三方知道雙方通信的過程撮珠,依然無法知曉后期通信的真正密鑰。
基于此金矛,可以看出SSL/TLS的工作原理簡單來說就是芯急,使用公開密鑰加密算法為基礎(chǔ)對通信雙方進行認證,并協(xié)商出一套用于后期對稱加密的密鑰和算法绷柒。
密鑰協(xié)商過程
對SSL/TLS的密鑰協(xié)商過程簡單抽象成下面的通信(實際上比這個更復(fù)雜)
- Bob 生成一個隨機數(shù)a志于,使用Alice公鑰加密成A后發(fā)送給Alice(Charlie無法將A解密成a,因為它沒有Alice私鑰)
- Alice生成一個隨機數(shù)b废睦,使用Alice私鑰加密成B后發(fā)送給Bob(Charlie可以利用Alice的公鑰將B解密成b)
- Bob再生成一個隨機數(shù)c伺绽,使用Alice的公鑰加密成C后發(fā)送給Alice(Charlie不知道C)。這一步嗜湃,Bob和Alice都知道三個數(shù)(a奈应、b、c)购披,但Charlie只知道b
- 然后杖挣,Bob和Alice分別使用一個已知算法PRF,對三個隨機數(shù)a刚陡、b惩妇、c進行計算生成最終的共享密鑰K,后期通信就使用K進行筐乳。
- 由于K沒有明文傳輸歌殃,且攻擊者由于沒有獲取到足夠信息也無法生成,每次協(xié)商都生成不同的密鑰蝙云。因此具有很強的安全性氓皱。
中間人攻擊
以上協(xié)商過程還存在漏洞:中間人攻擊。
Charlie可以自己生成一套公鑰和私鑰,然后將Alice的公鑰替換成自己的公鑰波材,從而偽裝成Alice跟Bob通信股淡,然后偽裝成Bob跟Alice進行通信。從而可以知曉雙方通信的各種隨機數(shù)廷区,然后可以計算出Bob和Alice通信的密鑰唯灵。或者單純就偽裝成Alice跟Bob通信
這里的關(guān)鍵是如何防止Alice的公鑰被替換隙轻?或者是Bob(客戶端)如何識別出Alice(服務(wù)端)是一個冒牌貨早敬?防止公鑰被替換,我們忽略了一個細節(jié):公鑰怎么保存大脉,客戶端如何拿到公鑰的?
事實上水孩,公鑰是通信時候镰矿,另一方告訴我的。
任何人都可以生成自己的公鑰和私鑰俘种,在Bob向Alice發(fā)請求詢問Alice的公鑰的時候秤标,可以被Charlie攔截,然后Charlie將自己的公鑰發(fā)給Bob宙刘,從而偽裝成Alice苍姜。Bob無法識別出來Charlie是冒牌的。
解決辦法:
- 提供一個由權(quán)威機構(gòu)(CA)頒發(fā)的證書來證明這個公鑰就是屬于Alice的悬包。
- Alice發(fā)送給Bob的不再是單純的公鑰衙猪,而是由CA認證的證書,這個證書里面包含了Alice的公鑰布近,發(fā)行機構(gòu)信息(CA)垫释,以及證書持有者(Alice),還有CA的簽名撑瞧,證書有效期
- Bob相信CA棵譬,從而可以相信CA頒發(fā)的證書,從而相信其拿到的公鑰就是Alice的公鑰预伺,從而相信和它通信的就是Alice(因為只有Alice才有私鑰)订咸。
如何校驗證書
Alice發(fā)給Bob的證書,Bob如何校驗真?zhèn)危?/p>
- 首先Bob拿到證書后酬诀,查看證書的頒發(fā)者是否可信脏嚷,如果不可信則終止連接。
- 怎么知道證書的頒發(fā)者是否可信料滥?
- 系統(tǒng)里面預(yù)裝根證書然眼,或者用戶自己安裝根證書,根證書是CA自己給自己頒發(fā)的證書葵腹。這個信任靠得就是平臺本身和用戶自己高每。
- 如果CA在你信任的CA表里面屿岂,那么說明是受信任的。
- CA可信任后鲸匿,需要進一步檢查證書有沒有被篡改爷怀。
- 完整性校驗依賴于數(shù)字簽名。
- 證書上面有CA的簽名带欢。簽名生成過程:
- 利用HASH算法對證書內(nèi)容計算出HASH值运授,然后CA用自己的私鑰對HASH進行加密,這就是CA對該證書的簽名
- 校驗:
- 利用CA的公鑰(根證書里面有)對簽名進行解密乔煞,得到的就是解密后的HASH值
- 利用HASH算法對證書內(nèi)容計算出HASH吁朦,和上一步解密后的HASH對比,如果不一致則認為被篡改
- 為啥篡改者不連簽名也一起改了渡贾?
- 因為它沒有CA的私鑰逗宜。
- 別忘了,還有證書有效期檢查
證書知識
證書格式標準目前主要為X.509
證書包括的主要內(nèi)容:
- 頒發(fā)機構(gòu)(CA)的名字(issuer)
- 證書持有者(subject)
- 證書持有者的公鑰和算法
- 證書有效期
- 證書內(nèi)容本身的數(shù)字簽名和算法(用CA私鑰加密)
- 證書序列號(具有唯一性空骚,可以吊銷)
證書可以自簽名(自己給自己頒發(fā))纺讲,也可以由權(quán)威的CA頒發(fā)。
證書頒發(fā)機構(gòu)CA分根CA和中間CA囤屹,通常證書不是直接由根CA頒發(fā)熬甚,而是由一個或多個中間CA簽發(fā)。根CA給中間CA頒發(fā)證書肋坚,中間CA再給你頒發(fā)證書乡括。最終用戶用來認證公鑰的證書被稱作end user 證書。
這些證書構(gòu)成了一條證書鏈冲簿。在服務(wù)端向客戶端發(fā)送證書的時候粟判,就需要發(fā)送證書鏈。
SSL/TLS 協(xié)議
工作原理講了峦剔,來看看協(xié)議實際過程档礁。
位于傳輸層和應(yīng)用層之間,與應(yīng)用層協(xié)議無關(guān)吝沫。
SSL/TLS通信開始于信息交換呻澜,這里的信息交換叫做SSL握手。
SSL握手有三個主要目的:
- 協(xié)商加密套件
- 認證通信方(可選)
- 基于協(xié)商好的加密機制構(gòu)建信息安全
SSL握手過程
1. ClientHello
客戶端向服務(wù)器發(fā)起加密通信的請求
主要提供以下信息
- 最高支持的TLS協(xié)議版本
- 一個客戶端生成的隨機數(shù)惨险,稍后用于生成“對話密鑰”
- 支持的加密套件列表
- 支持的壓縮算法
加密套件格式(TLS 1.3之前): 密鑰交換算法_對稱加密算法_MAC算法_PRF
2. Server hello
服務(wù)端選擇雙方都支持的SSL版本羹幸、最佳加密套件、壓縮算法辫愉,產(chǎn)生一個隨機數(shù)返回栅受。
3. Certificate (可選)
服務(wù)端發(fā)送給客戶端它的證書或者證書鏈(以公鑰證書開始,鏈到根CA)。這一步可選屏镊,依賴于前兩步是否要求驗證服務(wù)端依疼。
4. Certificate request(可選)
服務(wù)端要求驗證客戶端身份的時候才會用到,用來請求客戶端發(fā)送它的證書給服務(wù)端
金融機構(gòu)往往只允許認證客戶連入自己的網(wǎng)絡(luò)而芥,就會向正式客戶提供USB密鑰律罢,里面就包含了一張客戶端證書。
5. Server key exchange(可選)
依賴于Server hello階段選擇密碼交換算法棍丐,如果是基于Diffie-Hellman算法误辑,則需要發(fā)送該消息,里面包含了Server的DH公鑰歌逢。
6. Server hello done
7. Certificate(可選)
如果第4步巾钉,服務(wù)端要求客戶端發(fā)送證書,則發(fā)送該消息秘案。
格式和服務(wù)端發(fā)送證書一樣
8. Client key exchange
客戶端生成用于創(chuàng)建用于對稱加密的密鑰的信息(premaster key睛琳,看作第三個隨機數(shù)?)踏烙。 對于RSA,客戶端然后使用服務(wù)器的公鑰加密此密鑰信息并將其發(fā)送到服務(wù)器历等。 對于基于Diffie-Hellman的密碼套件讨惩,此消息包含客戶端的DH公鑰。
這個消息發(fā)送個服務(wù)端后寒屯,客戶端和服務(wù)端可以根據(jù)之前的兩個隨機數(shù)荐捻,加上premaster key,然后利用前面協(xié)商好的PRF算法生成后續(xù)通信用的加密密鑰寡夹。
9. Certificate verify(可選)
這個消息是向服務(wù)端提供了證書之后才需要發(fā)送处面,它使用自己的私鑰加密到現(xiàn)在為止發(fā)送的所有消息的hash,然后服務(wù)端通過客戶端證書里的公鑰解密后進行hash驗證菩掏,來確保確實由客戶端的私鑰簽署魂角。
10 Change Cipher Spec
客戶端告訴服務(wù)端,后續(xù)通信就用協(xié)商好的密鑰進行加密
11. Client Finished
客戶端握手結(jié)束通知智绸。這一項也是前面發(fā)送的所有內(nèi)容的hash值野揪。應(yīng)該是用協(xié)商好的密鑰進行加密,供服務(wù)端進行驗證瞧栗。(不確定)
12 Server Change cipher spec
服務(wù)端發(fā)送改變密鑰通知
13 Server Finished
服務(wù)端握手結(jié)束通知
SSL協(xié)議握手完成之后就已經(jīng)生成了一套后續(xù)通信用的對稱密鑰以及算法斯稳,后續(xù)則使用協(xié)商好的密鑰進行加解密通信。
總結(jié)
SSL/TLS構(gòu)建的是一個加密通道迹恐,和上層應(yīng)用協(xié)議無關(guān)挣惰。
HTTP over TLS = HTTPS
MQTT也支持TLS
你也可以自定義協(xié)議基于SSL、TLS
參考資料
- http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
- https://zh.wikipedia.org/wiki/%E5%82%B3%E8%BC%B8%E5%B1%A4%E5%AE%89%E5%85%A8%E6%80%A7%E5%8D%94%E5%AE%9A
- https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html
- https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc785811(v=ws.10)
- https://developer.android.com/training/articles/security-ssl?hl=zh-cn
- https://security.stackexchange.com/questions/20803/how-does-ssl-tls-work