HTTPS只驗證服務器的SSL握手過程(客戶端驗證服務器端)過程,參考這篇文章
https://www.jianshu.com/p/c2bf75485c15
假定客戶端叫做愛麗絲,服務器叫做鮑勃,其驗證步驟爲:
- 愛麗絲(瀏覽器)給出協議版本號、一個客戶端生成的隨機數(隨機數A),以及客戶端支持的加密方法。
- 鮑勃(服務器)確認雙方使用的加密方法,並給出數字證書、以及一個服務器生成的隨機數(隨機數B)。
- 愛麗絲(瀏覽器)確認數字證書有效,然後生成一個新的隨機數(隨機數C),並使用數字證書中的公鑰,加密這個隨機數,發給鮑勃(服務器)。
- 鮑勃(服務器)使用自己的私鑰,獲取愛麗絲(瀏覽器)發來的隨機數(隨機數C)
- 愛麗絲(瀏覽器)和鮑勃(服務器)根據約定的加密方法,使用前面的三個隨機數(A,B,C),生成"對話密鑰"(session key),用來加密接下來的整個對話過程。
這篇文章也解釋的比較詳細,https://www.jianshu.com/p/1429b12a5519
根據上面的描述,有兩個問題:
1.客戶端如何檢測數字證書是合法的並是所要請求的公司的?
2.數字證書中的公鑰在哪裏?
根據這些問題,找到了這篇文章https://blog.csdn.net/luluyo/article/details/88723701,有如下解釋。
三、HTTPS運行原理
我們可以通過4個問題徹底理解HTTPS的運行原理,首先要從數字證書開始說起。HTTPS的安全性主要依賴於對數字證書的驗證以及非對稱加密機制,細看步驟3),客戶端具體是如何判斷證書的合法性的?
先來看看數字證書都有哪些內容
Issuer--證書的發佈機構
發佈證書的機構,指明證書是哪個公司創建的(並不是指使用證書的公司)。出了問題具體的頒發機構是要負責的Valid from,Valid to--證書的有效期
證書的使用期限。過了這個期限證書就會作廢,不能使用。Public key--公鑰
剛開始的時候介紹過公鑰的概念,用於對消息加密的。Subject--主題
證書是頒發給誰了,一般是個人或公司名稱或機構名稱或公司網站的網址。Signature algorithm--簽名所使用的算法
數字證書的數字簽名所使用的加密算法,根據這個算法可以對指紋解密。指紋加密的結果就是數字簽名。Thumbprint,Thumbprint algorithm--指紋以及指紋算法(一種HASH算法)
指紋和指紋算法會使用證書機構的私鑰加密後和證書放在一起。主要用來保證證書的完整性,確保證書沒有修改過。使用者在打開證書時根據指紋算法計算證書的hash值,和剛開始的值一樣,則表示沒有被修改過。a)
繞了一大圈,問題回來了,客戶端如何檢測數字證書是合法的並是所要請求的公司的?首先應用程序讀取證書中的Issuer(發佈機構),然後會在操作系統或瀏覽器內置的受信任的發佈機構中去找該機構的證書(爲什麼操作系統會有受信任機構的證書?先看完這個流程再來回答)。如果找不到就說明證書是水貨,證書有問題,程序給錯誤信息。如果找到了,或用戶確認使用該證書。就會拿上級證書的公鑰,解密本級證書,得到數字指紋。然後對本級證書的公鑰進行數字摘要算法(證書中提供的指紋加密算法)計算結果,與解密得到的指紋對比。如果一樣,說明證書沒有被修改過。公鑰可以放心使用,可以開始握手通信了。
b)
接下來解答操作系統爲什麼會有證書發佈機構的證書?其實證書發佈機構除了給別人發佈證書外,自己也有自己的證書。在操作系統安裝好時,受信任的證書發佈機構的數字證書就已經被微軟安裝在操作系統中了,根據一些權威安全機構的評估,選取一些信譽很好並且通過一定安全認證的證書發佈機構,把這些證書默認安裝在操作系統中並設爲信任的數字證書。發佈機構持有與自己數字證書對應的私鑰,會用這個私鑰加密所有他發佈的證書及指紋整體作爲數字簽名。
還有一個問題,如果沒有有效的證書,HTTPS連接是否加密的?參考這篇文章https://www.zhihu.com/question/300285738、https://blog.csdn.net/abinge317/article/details/51791856
簡單來說,如果客戶端驗證服務端的證書無效,此時通信過程仍然加密。
https證書有兩個作用,一個是認證,一個是加密會話。
加密會話其實和證書關係不大,它是由客戶端與服務器協商出來的。它可能會用到證書,比如用RSA算法協商session key的時候,就是用證書的公鑰加密後發給服務器。而使用DH算法時可以不用證書。後續的會話都是用session key加密的,不會用證書的公鑰,私鑰加密。
證書主要的作用還是認證,讓你可以確定服務器的真僞。
服務器沒有有效的證書,就是證書不是有效的ca簽發的,它不能證明服務器是真的,存在安全風險。一般瀏覽器會阻止你訪問。如果你執意要訪問,後續的流量都是加密的,但是並不安全。
驗證數字簽名的過程,參考https://www.jianshu.com/p/29e0ba31fb8d