版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
網絡請求方式通常分為兩種,分別是HTTP請求和HTTPS請求,其中HTTP的傳輸屬於明文傳輸,在傳輸的過程中容易被人截取並且偷窺其中的內容,而HTTPS是一種在HTTP的基礎上加了SSL/TLS層(安全套接層)的安全的超文本傳輸協議,其傳輸的內容是通過加密得到的,所以說是一種安全的傳輸。
說到加密算法,先來了解一下兩種常用的加密方式,分別是對稱加密和非對稱加密:
1.對稱加密:加密使用的秘鑰和解密使用的秘鑰是相同的,也就是說加密和解密都使用同一個秘鑰,加密算法是公開的,秘鑰是加密者和解密者絕對保密的。
2.非對稱加密:加密使用的秘鑰和解密使用的秘鑰是不相同的,HTTPS在數字證書驗證的時候,采用的RSA密碼體制就是一種非對稱加密。
RSA是一種公鑰秘鑰密碼體制,現在使用非常廣泛,這個密碼體制分為三部分,公鑰、私鑰、加密算法,其中公鑰和加密算法是公布的,私鑰是自己保密的。這種機制最大的特點是,通過公鑰加密的密文只有對應的私鑰才能解密,同樣通過私鑰加密的密文也只有對應的公鑰才能解密。下面我們將會講到HTTPS是如何通過RSA這種密碼體制去驗證身份的。
首先了解一下數字證書,它有點像身份證,是由權威的CA機構頒發的,證書的主要內容有:公鑰(Public Key)、ISSUER(證書的發布機構)、Subject(證書持有者)、證書有效期、簽名算法、指紋及指紋算法。
下面csdn博客的CA證書內容:
可以看到公鑰是一串很長的2048 Bits的字符串,同時也可以看到<使用者>的內容包含了csdn.net網址,這個網址是CSDN唯一擁有的,后面驗證鏈接url是否正確的時候用到,還有頒發者、有效期、簽名哈希算法等等。當然還有指紋及指紋算法等其他內容,我們滾動到下面看看另外一個截圖
上面是CSDN網站CA證書,頒發者是GeoTrust,它就是權威的CA機構之一。到這里特別說明一下,CA機構除了給別人頒發證書以外,它也有自己的證書,為了區分我們稱它為根證書,根證書也有自己的公鑰和私鑰,我們稱之為根公鑰和根私鑰。然后根公鑰和加密算法是向外公布的,而根私鑰是機構自己絕對保密的。這個根證書在驗證證書的過程中起着核心的作用。
指紋是什么?指紋是一個證書的簽名,是通過指紋算法sha1計算出來的一個hash值,是用來驗證證書內容有沒有被篡改的。證書在發布之前,CA機構會把所頒發證書的內容用自己的根私鑰通過指紋算法計算得到一個hash值,這個hash值只有對應的根公鑰才能解密,所以在驗證證書的時候,我們通過同樣的指紋算法將證書內容通過計算得到另一個hash值,如果這個hash值跟證書上的簽名解析出來的hash值相同,就代表證書沒有被篡改過。
下面基於一個簡單的圖例,去分析整個HTTPS的數字證書驗證過程:
圖示如下:
假設這是一個瀏覽器的HTTPS請求
一:首先瀏覽器通過URL網址去請求某個后台服務器,后台接收到請求后,就會給瀏覽器發送一個自己的CA數字證書。
二:瀏覽器接收到數字證書以后,就要開始進行驗證工作了。首先從證書的內容中獲取證書的頒發機構,然后從瀏覽器系統中去尋找此頒發機構是否為瀏覽器的信任機構。這里解析一下,世界上就幾個權威的CA機構,這幾個機構的信息都是預先嵌入到我們的瀏覽器系統中的。如果收到的一個數字證書但其頒發機構沒有在我們瀏覽器系統中的,那么就會有警告提示無法確認證書的真假。如果是受信任的機構,那么就到下一步。
此時我們就可以從瀏覽器中找到CA機構的根公鑰,用這個公鑰去解析證書的簽名得到一個hash值H1,上面提到過,這個簽名是證書發布之前CA機構用自己的根私鑰加密而成的,所以這里只能由根證書的根公鑰去解密。然后用證書的指紋算法對證書的內容再進行hash計算得到另一個hash值H2,如果此時H1和H2是相等的,就代表證書沒有被修改過。在證書沒有被修改過的基礎上,再檢查證書上的使用者的URL(比如csdn.net)和我們請求的URL是否相等,如果相等,那么就可以證明當前瀏覽器連接的網址也是正確的,而不是一些釣魚網之類的。
這里我們假設,如果瀏覽器的連接被某個釣魚網截取了,釣魚網也可以發一個自己的證書給瀏覽器,然后也可以通過證書沒有被篡改的驗證,但是在證書沒有被篡改的情況下,通過對比證書上的URL和我們請求的URL,就可以發現這個證書的URL不是我們所要連接的網址,所以說釣魚網也騙不了我們。
看到這里如果還不是很明白證書驗證過程的話,我特別解析一下,我們知道CA機構有自己的根公鑰和根私鑰。在證書頒發之前,機構會用根私鑰將這個證書內容加密得到一個簽名,這個簽名只能用對應的根公鑰去解密。在客戶端(瀏覽器)收到服務端發過來的證書以后,我們首先從瀏覽器中拿到機構的根公鑰,用這個根公鑰去解析證書的簽名得到一個哈希值H1,這個H1代表證書的原始內容,假設這個證書上的簽名是不法分子偽造的,但是偽造的簽名不可能是根私鑰加密生成的(因為根私鑰是CA機構私有),所以根公鑰也不可能去解密任何第三方生成的簽名(加密內容只能由對應的公鑰私鑰解析)。然后我們再用同樣的哈希算法對收證書內容進行計算得到哈希值H2,通過對比H1和H2是否相等就知道證書有沒有被褚篡改過了。講到這里,我們應該明白證書是否被篡改的驗證機制了吧。
三:到這里,已經驗證了證書是沒有被篡改的並且確認連接的URL也是正確的,然后我們獲取到了證書上的公鑰。下一步有一個很重要的任務就是,如何將一個對稱加密算法的秘鑰安全地發給服務器。
首先隨機生成一個字符串S作為我們的秘鑰,然后通過證書公鑰加密成密文,將密文發送給服務器。因為此密文是用公鑰加密的,這是一個非對稱加密,我們知道,這個密文只有私鑰的持有者才能進行解密,所以說任何第三方截取到密文也是沒用的,因為沒有對應的私鑰所以解析不出來。
一個關鍵步驟,發送密文的時候也會對消息內容進行簽名操作。簽名上面講解過,就是對密文內容進行hash計算得到的一個hash值,將這個簽名加密以后和消息內容一起發送出去。接收方收到消息以后,通過私鑰解析出密文和簽名的hash值,同時也會對接收的消息內容進行同樣的計算得到另一個hash值,通過比對兩個hash值是否相同來判斷密文是否有修改過。
四:通過了上面的步驟以后,此時客戶端和服務端都持有了對稱加密算法的秘鑰,然后兄弟兩就可以愉快地安全通信了。
總結:數字證書的驗證有兩個重要的步驟,第一是驗證數字證書沒有被篡改以及連接的URL是否正確,第二是通過RSA機制的原理安全地將對稱加密算法的秘鑰發送給對方。這兩步都完成以后,整個HTTPS的數字證書的驗證就算是成功了。
好了,通過上面 的講解,相信我們已經掌握了https的數字證書驗證原理了。