1. 什么是https
Https = http + 加密 + 認證
https是對http的安全強化,在http的基礎上引入了加密和認證過程。通過加密和認證構建一條安全的傳輸通道。所以https可以看成是:在安全通道內,對數據進行對稱加密后傳輸。這樣即使黑客打破了安全通道,還有一層數據加密。極大的保障了數據通信的安全性。
2. https的演化
我們將從http的不安全方面着手,通過三個場景的闡述,來說明https是怎么來的以及其基本原理
Round 1:
正常交流:
“客戶”->“服務器”:你好
“服務器”->“客戶”:你好,我是服務器
這是一次正常的客戶端和服務器的交流。中間沒有任何安全校驗,客戶端得知對方是服務器后,就完全的相信了對方就是自己想要的服務器。這種情況下,服務器如果收到攻擊,有人偽造是服務器,客戶端也是不知情的。既然知道了這種通信的不安全,所以引入了RSA加密,說明下:用RSA私鑰進行加密,RSA公鑰進行解密的是簽名;公鑰加密,私鑰解密的是加密。於是有第二輪的通信
Round 2:
“客戶”->“服務器”:你好
“服務器”->“客戶”:你好,我是服務器
“客戶”->“服務器”:向我證明你就是服務器
“服務器”->“客戶”:你好,我是服務器 {***********}(對內容用私鑰進行簽名)
“客戶”->“服務器”:{我的帳號是aaa,密碼是123,把我的余額的信息發給我看看}{***********}(對內容用私鑰進行RSA加密)
“服務器”->“客戶”:{你的余額是100元}{***********}(對內容用私鑰進行簽名)
在第二輪通信中,服務器通過RSA私鑰進行簽名,客戶端用RSA公鑰進行驗證來達到 確定服務器身份。雖然引入了RSA加密后,服務器的身份是被唯一確認了,但是由於服務器的后續所有的信息都是通過RSA私鑰進行加密,而公鑰是對外公開的,這樣會導致服務器的所有內容對其他人都是公開的。所以這次通信同樣存在安全問題。
Round 3:
“客戶”->“服務器”:你好
“服務器”->“客戶”:你好,我是服務器
“客戶”->“服務器”:向我證明你就是服務器
“服務器”->“客戶”:你好,我是服務器 {***********}(對內容用私鑰進行RSA加密)
“客戶”->“服務器”:{我們后面的通信過程,用對稱加密來進行,這里是對稱加密算法和密鑰} {***********}(對內容用公鑰進行RSA加密)
“服務器”->“客戶”:{OK,收到!}{***********}(用雙方協商的密鑰進行加密-- 對稱加密算法)
“客戶”->“服務器”:{我的帳號是aaa,密碼是123,把我的余額的信息發給我看看} {***********}(用雙方協商的密鑰進行加密-- 對稱加密算法)
“服務器”->“客戶”:{你的余額是100元}[密鑰|對稱加密算法]{***********}(用雙方協商的密鑰進行加密-- 對稱加密算法)
在第三輪通信包括了兩部分,第一部分是用非對稱加密算法來進行身份認證。第二部分,信息通信用了對稱加密算法進行加解密。這也就就是https構建安全通道的基本流程。
3.證書
在第三輪通信的第一部分,雖然用非對稱加密算法來進行身份認證可以很安全,但是隨之的問題是如何把RSA的公鑰給客戶端,如果用傳統方式:用網絡發送或是在通信過程中攜帶公鑰,都會存在公鑰被篡改的情況。為了解決這個問題,所以才有了數字證書的出現。通過一個大家都認可的,並且是可信的第三方來頒發。
數字證書一般包括:
- 證書的發布機構
- 證書的有效期
- 公鑰
- 證書所有者(Subject)
- 簽名所使用的算法
- 指紋以及指紋算法
這樣,服務器在身份認證階段就不需要把公鑰發給客戶端了,而是把服務器端的證書發給客戶端,客戶端拿到服務器證書后,通過驗證證書來完成身份認證。一般證書認證包括:證書的有效期,證書鏈的驗證。證書鏈的驗證是通過根證書對證書進行一級一級的認證。證書鏈的認證過程如下圖所示:

證書認證成功后,接下來就可以使用服務器證書里面的公鑰進行服務器身份的驗證。
第一部分是用非對稱加密算法來進行身份認證。同時引入了數字證書來達到保護密鑰的安全。
4. DH密鑰交換算法
在上面第三輪通信中,第一部分身份認證是通過非對稱加密算法,可以保證其安全性,但是第二部分,由於用的是對稱加密算法,那么如果保證密鑰不被截獲是整個通信安全的重點。在https里用的是DH密鑰交換算法。它的安全性是依賴於離散對數的難解性得到保證。下面簡單介紹下DH密鑰交換算法。在介紹前先看幾個數學上的名詞
3.1 生成元
對於一個素數q,如果數值 a mod q, a^2 mod q, a^3 mod q,... a ^q-1 mod q 是各不相同的整數,並且以某種排列方式組成從1到q-1,則整數a就為素數q的一個生成元,或稱元根。比如5就是23的一個生成元
3.2 離散對數
對於一個整數b和一個素數q的生成元a,可以找到一個唯一的指數i,使得:
b = a^i mod q (0 <= i <= q-1)
則指數i稱為b的以a為底數的模q的離散對數。
對於給定的a,i,q可以很容易的計算出b,但是對於給出b,a,q卻是很難計算出i。這就是DH算法和許多公鑰密碼算法的基礎。
3.3 DH密鑰交換過程
用戶A和用戶B共享素數q以及其生成元a,現在A和B進行密鑰交換
用戶A:產生隨機數Xa < q,計算Ya = a^Xa mod q ,同時把Ya發送給B
用戶B:產生隨機數Xb < q,計算Yb= a^Xb mod q,同時把Yb發送給A
A拿到Yb后:計算Ka = (Yb)^Xa mod q
B拿到Ya后,計算Kb = (Ya)^Xb mod q
最后的結果是:Ka = Kb
證明過程這里就省略了,用代入法很快就可以證明出Ka = Kb
而這里的K就是A和B雙方協商的密鑰
5. 握手協議
通過上述,我們可以知道整個https的過程其實包括以下幾個過程:證書認證,身份認證,密鑰交換,傳輸數據的加解密,下面是一個完整的https握手協議的流程:

上述https演化一節參考了:http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html
