看到了一篇很不錯的關于雙向認證SSL 的文章,深入淺出,不可多得的好文

文中首先解釋了加密解密的一些基礎知識和概念,然后通過一個加密通信過程的例子說明了加密算法的作用,以及數字證書的出現所起的作用。接著對數字證書做一個詳細的解釋,并討論一下

windows中數字證書的管理,最后演示使用makecert生成數字證書。如果發現文中有錯誤的地方,或者有什么地方說得不夠清楚,歡迎指出!


1、基礎知識

??????這部分內容主要解釋一些概念和術語,最好是先理解這部分內容。

1.1、公鑰密碼體制(public-key cryptography)

公鑰密碼體制分為三個部分,公鑰、私鑰、加密解密算法,它的加密解密過程如下:

加密:通過加密算法和公鑰對內容(或者說明文)進行加密,得到密文。加密過程需要用到公鑰。

解密:通過解密算法和私鑰對密文進行解密,得到明文。解密過程需要用到解密算法和私鑰。注意,由公鑰加密的內容,只能由私鑰進行解密,也就是說,由公鑰加密的內容,如果不知道私鑰,是無法解密的。

公鑰密碼體制的公鑰和算法都是公開的(這是為什么叫公鑰密碼體制的原因),私鑰是保密的。大家都以使用公鑰進行加密,但是只有私鑰的持有者才能解密。在實際的使用中,有需要的人會生成一對公鑰和私鑰,把公鑰發布出去給別人使用,自己保留私鑰。


1.2、對稱加密算法(symmetric key algorithms)

在對稱加密算法中,加密使用的密鑰和解密使用的密鑰是相同的。也就是說,加密和解密都是使用的同一個密鑰。因此對稱加密算法要保證安全性的話,密鑰要做好保密,只能讓使用的人知道,不能對外公開。這個和上面的公鑰密碼體制有所不同,公鑰密碼體制中加密是用公鑰,解密使用私鑰,而對稱加密算法中,加密和解密都是使用同一個密鑰,不區分公鑰和私鑰。


??????? //?密鑰,一般就是一個字符串或數字,在加密或者解密時傳遞給加密/解密算法。前面在公鑰密碼體制中說到的公鑰、私鑰就是密鑰,公鑰是加密使用的密鑰,私鑰是解密使用的密鑰。


1.3、非對稱加密算法(asymmetric key algorithms)

在非對稱加密算法中,加密使用的密鑰和解密使用的密鑰是不相同的。前面所說的公鑰密碼體制就是一種非對稱加密算法,他的公鑰和是私鑰是不能相同的,也就是說加密使用的密鑰和解密使用的密鑰不同,因此它是一個非對稱加密算法。


1.4、RSA簡介

RSA是一種公鑰密碼體制,現在使用得很廣泛。如果對RSA本身有興趣的,后面看我有沒有時間寫個RSA的具體介紹。

RSA密碼體制是一種公鑰密碼體制,公鑰公開,私鑰保密,它的加密解密算法是公開的。?由公鑰加密的內容可以并且只能由私鑰進行解密,并且由私鑰加密的內容可以并且只能由公鑰進行解密。也就是說,RSA的這一對公鑰、私鑰都可以用來加密和解密,并且一方加密的內容可以由并且只能由對方進行解密。


1.5、簽名和加密

我們說加密,是指對某個內容加密,加密后的內容還可以通過解密進行還原。?比如我們把一封郵件進行加密,加密后的內容在網絡上進行傳輸,接收者在收到后,通過解密可以還原郵件的真實內容。

這里主要解釋一下簽名,簽名就是在信息的后面再加上一段內容,可以證明信息沒有被修改過,怎么樣可以達到這個效果呢?一般是對信息做一個hash計算得到一個hash值,注意,這個過程是不可逆的,也就是說無法通過hash值得出原來的信息內容。在把信息發送出去時,把這個hash值加密后做為一個簽名和信息一起發出去。?接收方在收到信息后,會重新計算信息的hash值,并和信息所附帶的hash值(解密后)進行對比,如果一致,就說明信息的內容沒有被修改過,因為這里hash計算可以保證不同的內容一定會得到不同的hash值,所以只要內容一被修改,根據信息內容計算的hash值就會變化。當然,不懷好意的人也可以修改信息內容的同時也修改hash值,從而讓它們可以相匹配,為了防止這種情況,hash值一般都會加密后(也就是簽名)再和信息一起發送,以保證這個hash值不被修改。至于如何讓別人可以解密這個簽名,這個過程涉及到數字證書等概念,我們后面在說到數字證書時再詳細說明,這里您先只需先理解簽名的這個概念。


2、一個加密通信過程的演化

??????我們來看一個例子,現在假設"服務器"和"客戶"要在網絡上通信,并且他們打算使用RSA(參看前面的RSA簡介)來對通信進行加密以保證談話內容的安全。由于是使用RSA這種公鑰密碼體制,"服務器"需要對外發布公鑰(算法不需要公布,RSA的算法大家都知道),自己留著私鑰。"客戶"通過某些途徑拿到了"服務器"發布的公鑰,客戶并不知道私鑰。"客戶"具體是通過什么途徑獲取公鑰的,我們后面再來說明,下面看一下雙方如何進行保密的通信:


2.1?第一回合:

"客戶"->"服務器":你好

"服務器"->"客戶":你好,我是服務器

"客戶"->"服務器":????

因為消息是在網絡上傳輸的,有人可以冒充自己是"服務器"來向客戶發送信息。例如上面的消息可以被黑客截獲如下:

"客戶"->"服務器":你好

"服務器"->"客戶":你好,我是服務器

"客戶"->"黑客":你好????????//?黑客在"客戶"和"服務器"之間的某個路由器上截獲"客戶"發給服務器的信息,然后自己冒充"服務器"

"黑客"->"客戶":你好,我是服務器

因此"客戶"在接到消息后,并不能肯定這個消息就是由"服務器"發出的,某些"黑客"也可以冒充"服務器"發出這個消息。如何確定信息是由"服務器"發過來的呢?有一個解決方法,因為只有服務器有私鑰,所以如果只要能夠確認對方有私鑰,那么對方就是"服務器"。因此通信過程可以改進為如下:


2.2?第二回合:

"客戶"->"服務器":你好

"服務器"->"客戶":你好,我是服務器

"客戶"->"服務器":向我證明你就是服務器

"服務器"->"客戶":你好,我是服務器?{你好,我是服務器}[私鑰|RSA]

??????//?注意這里約定一下,{}?表示RSA加密后的內容,[ | ]表示用什么密鑰和算法進行加密,后面的示例中都用這種表示方式,例如上面的?{你好,我是服務器}[私鑰|RSA]??就表示用私鑰對"你好,我是服務器"進行加密后的結果。

為了向"客戶"證明自己是"服務器",?"服務器"把一個字符串用自己的私鑰加密,把明文和加密后的密文一起發給"客戶"。對于這里的例子來說,就是把字符串?"你好,我是服務器"和這個字符串用私鑰加密后的內容?{你好,我是服務器}[私鑰|RSA]?發給客戶。

"客戶"收到信息后,她用自己持有的公鑰解密密文,和明文進行對比,如果一致,說明信息的確是由服務器發過來的。也就是說"客戶"把?{你好,我是服務器}[私鑰|RSA]?這個內容用公鑰進行解密,然后和"你好,我是服務器"對比。因為由"服務器"用私鑰加密后的內容,由并且只能由公鑰進行解密,私鑰只有"服務器"持有,所以如果解密出來的內容是能夠對得上的,那說明信息一定是從"服務器"發過來的。

假設"黑客"想冒充"服務器":

"黑客"->"客戶":你好,我是服務器

"客戶"->"黑客":向我證明你就是服務器

"黑客"->"客戶":你好,我是服務器?{你好,我是服務器}[???|RSA]????//這里黑客無法冒充,因為他不知道私鑰,無法用私鑰加密某個字符串后發送給客戶去驗證。

"客戶"->"黑客":????

由于"黑客"沒有"服務器"的私鑰,因此它發送過去的內容,"客戶"是無法通過服務器的公鑰解密的,因此可以認定對方是個冒牌貨!

到這里為止,"客戶"就可以確認"服務器"的身份了,可以放心和"服務器"進行通信,但是這里有一個問題,通信的內容在網絡上還是無法保密。為什么無法保密呢?通信過程不是可以用公鑰、私鑰加密嗎?其實用RSA的私鑰和公鑰是不行的,我們來具體分析下過程,看下面的演示:


2.3?第三回合:

"客戶"->"服務器":你好

"服務器"->"客戶":你好,我是服務器

"客戶"->"服務器":向我證明你就是服務器

"服務器"->"客戶":你好,我是服務器?{你好,我是服務器}[私鑰|RSA]

"客戶"->"服務器":{我的帳號是aaa,密碼是123,把我的余額的信息發給我看看}[公鑰|RSA]

"服務器"->"客戶":{你的余額是100元}[私鑰|RSA]

注意上面的的信息?{你的余額是100元}[私鑰],這個是"服務器"用私鑰加密后的內容,但是我們之前說了,公鑰是發布出去的,因此所有的人都知道公鑰,所以除了"客戶",其它的人也可以用公鑰對{你的余額是100元}[私鑰]進行解密。所以如果"服務器"用私鑰加密發給"客戶",這個信息是無法保密的,因為只要有公鑰就可以解密這內容。然而"服務器"也不能用公鑰對發送的內容進行加密,因為"客戶"沒有私鑰,發送個"客戶"也解密不了。

這樣問題就又來了,那又如何解決呢?在實際的應用過程,一般是通過引入對稱加密來解決這個問題,看下面的演示:


2.4?第四回合:

"客戶"->"服務器":你好

"服務器"->"客戶":你好,我是服務器

"客戶"->"服務器":向我證明你就是服務器

"服務器"->"客戶":你好,我是服務器?{你好,我是服務器}[私鑰|RSA]

"客戶"->"服務器":{我們后面的通信過程,用對稱加密來進行,這里是對稱加密算法和密鑰}[公鑰|RSA]????//藍色字體的部分是對稱加密的算法和密鑰的具體內容,客戶把它們發送給服務器。

"服務器"->"客戶":{OK,收到!}[密鑰|對稱加密算法]

"客戶"->"服務器":{我的帳號是aaa,密碼是123,把我的余額的信息發給我看看}[密鑰|對稱加密算法]

"服務器"->"客戶":{你的余額是100元}[密鑰|對稱加密算法]

在上面的通信過程中,"客戶"在確認了"服務器"的身份后,"客戶"自己選擇一個對稱加密算法和一個密鑰,把這個對稱加密算法和密鑰一起用公鑰加密后發送給"服務器"。注意,由于對稱加密算法和密鑰是用公鑰加密的,就算這個加密后的內容被"黑客"截獲了,由于沒有私鑰,"黑客"也無從知道對稱加密算法和密鑰的內容。

由于是用公鑰加密的,只有私鑰能夠解密,這樣就可以保證只有服務器可以知道對稱加密算法和密鑰,而其它人不可能知道(這個對稱加密算法和密鑰是"客戶"自己選擇的,所以"客戶"自己當然知道如何解密加密)。這樣"服務器"和"客戶"就可以用對稱加密算法和密鑰來加密通信的內容了。


總結一下,RSA加密算法在這個通信過程中所起到的作用主要有兩個:

因為私鑰只有"服務器"擁有,因此"客戶"可以通過判斷對方是否有私鑰來判斷對方是否是"服務器"。

客戶端通過RSA的掩護,安全的和服務器商量好一個對稱加密算法和密鑰來保證后面通信過程內容的安全。

如果這里您理解了為什么不用RSA去加密通信過程,而是要再確定一個對稱加密算法來保證通信過程的安全,那么就說明前面的內容您已經理解了。(如果不清楚,再看下2.3和2.4,如果還是不清楚,那應該是我們說清楚,您可以留言提問。)

到這里,"客戶"就可以確認"服務器"的身份,并且雙方的通信內容可以進行加密,其他人就算截獲了通信內容,也無法解密。的確,好像通信的過程是比較安全了。


但是這里還留有一個問題,在最開始我們就說過,"服務器"要對外發布公鑰,那"服務器"如何把公鑰發送給"客戶"呢?我們第一反應可能會想到以下的兩個方法:

a)把公鑰放到互聯網的某個地方的一個下載地址,事先給"客戶"去下載。

b)每次和"客戶"開始通信時,"服務器"把公鑰發給"客戶"。

但是這個兩個方法都有一定的問題,

對于a)方法,"客戶"無法確定這個下載地址是不是"服務器"發布的,你憑什么就相信這個地址下載的東西就是"服務器"發布的而不是別人偽造的呢,萬一下載到一個假的怎么辦?另外要所有的"客戶"都在通信前事先去下載公鑰也很不現實。

對于b)方法,也有問題,因為任何人都可以自己生成一對公鑰和私鑰,他只要向"客戶"發送他自己的私鑰就可以冒充"服務器"了。示意如下:

"客戶"->"黑客":你好???????????//黑客截獲"客戶"發給"服務器"的消息

"黑客"->"客戶":你好,我是服務器,這個是我的公鑰????//黑客自己生成一對公鑰和私鑰,把公鑰發給"客戶",自己保留私鑰

"客戶"->"黑客":向我證明你就是服務器

"黑客"->"客戶":你好,我是服務器?{你好,我是服務器}[黑客自己的私鑰|RSA]??????//客戶收到"黑客"用私鑰加密的信息后,是可以用"黑客"發給自己的公鑰解密的,從而會誤認為"黑客"是"服務器"

因此"黑客"只需要自己生成一對公鑰和私鑰,然后把公鑰發送給"客戶",自己保留私鑰,這樣由于"客戶"可以用黑客的公鑰解密黑客的私鑰加密的內容,"客戶"就會相信"黑客"是"服務器",從而導致了安全問題。這里問題的根源就在于,大家都可以生成公鑰、私鑰對,無法確認公鑰對到底是誰的。?如果能夠確定公鑰到底是誰的,就不會有這個問題了。例如,如果收到"黑客"冒充"服務器"發過來的公鑰,經過某種檢查,如果能夠發現這個公鑰不是"服務器"的就好了。

為了解決這個問題,數字證書出現了,它可以解決我們上面的問題。先大概看下什么是數字證書,一個證書包含下面的具體內容:

證書的發布機構

證書的有效期

公鑰

證書所有者(Subject)

簽名所使用的算法

指紋以及指紋算法

證書的內容的詳細解釋會在后面詳細解釋,這里先只需要搞清楚一點,數字證書可以保證數字證書里的公鑰確實是這個證書的所有者(Subject)的,或者證書可以用來確認對方的身份。也就是說,我們拿到一個數字證書,我們可以判斷出這個數字證書到底是誰的。至于是如何判斷的,后面會在詳細討論數字證書時詳細解釋。現在把前面的通信過程使用數字證書修改為如下:


2.5?第五回合:

"客戶"->"服務器":你好

"服務器"->"客戶":你好,我是服務器,這里是我的數字證書????????//這里用證書代替了公鑰

"客戶"->"服務器":向我證明你就是服務器

"服務器"->"客戶":你好,我是服務器?{你好,我是服務器}[私鑰|RSA]

注意,上面第二次通信,"服務器"把自己的證書發給了"客戶",而不是發送公鑰。"客戶"可以根據證書校驗這個證書到底是不是"服務器"的,也就是能校驗這個證書的所有者是不是"服務器",從而確認這個證書中的公鑰的確是"服務器"的。后面的過程和以前是一樣,"客戶"讓"服務器"證明自己的身份,"服務器"用私鑰加密一段內容連同明文一起發給"客戶","客戶"把加密內容用數字證書中的公鑰解密后和明文對比,如果一致,那么對方就確實是"服務器",然后雙方協商一個對稱加密來保證通信過程的安全。到這里,整個過程就完整了,我們回顧一下:


2.6?完整過程:

step1:?"客戶"向服務端發送一個通信請求

"客戶"->"服務器":你好


step2:?"服務器"向客戶發送自己的數字證書。證書中有一個公鑰用來加密信息,私鑰由"服務器"持有

"服務器"->"客戶":你好,我是服務器,這里是我的數字證書?


step3:?"客戶"收到"服務器"的證書后,它會去驗證這個數字證書到底是不是"服務器"的,數字證書有沒有什么問題,數字證書如果檢查沒有問題,就說明數字證書中的公鑰確實是"服務器"的。檢查數字證書后,"客戶"會發送一個隨機的字符串給"服務器"用私鑰去加密,服務器把加密的結果返回給"客戶","客戶"用公鑰解密這個返回結果,如果解密結果與之前生成的隨機字符串一致,那說明對方確實是私鑰的持有者,或者說對方確實是"服務器"。

"客戶"->"服務器":向我證明你就是服務器,這是一個隨機字符串?????//前面的例子中為了方便解釋,用的是"你好"等內容,實際情況下一般是隨機生成的一個字符串。

"服務器"->"客戶":{一個隨機字符串}[私鑰|RSA]


step4:?驗證"服務器"的身份后,"客戶"生成一個對稱加密算法和密鑰,用于后面的通信的加密和解密。這個對稱加密算法和密鑰,"客戶"會用公鑰加密后發送給"服務器",別人截獲了也沒用,因為只有"服務器"手中有可以解密的私鑰。這樣,后面"服務器"和"客戶"就都可以用對稱加密算法來加密和解密通信內容了。

"服務器"->"客戶":{OK,已經收到你發來的對稱加密算法和密鑰!有什么可以幫到你的?}[密鑰|對稱加密算法]

"客戶"->"服務器":{我的帳號是aaa,密碼是123,把我的余額的信息發給我看看}[密鑰|對稱加密算法]

"服務器"->"客戶":{你好,你的余額是100元}[密鑰|對稱加密算法]

……?//繼續其它的通信


2.7?其它問題:

上面的過程已經十分接近HTTPS的真實通信過程了,完全可以按照這個過程去理解HTTPS的工作原理。但是我為了方便解釋,上面有些細節沒有說到,有興趣的人可以看下這部分的內容。可以跳過不看,無關緊要。


【問題1】

上面的通信過程中說到,在檢查完證書后,"客戶"發送一個隨機的字符串給"服務器"去用私鑰加密,以便判斷對方是否真的持有私鑰。但是有一個問題,"黑客"也可以發送一個字符串給"服務器"去加密并且得到加密后的內容,這樣對于"服務器"來說是不安全的,因為黑客可以發送一些簡單的有規律的字符串給"服務器"加密,從而尋找加密的規律,有可能威脅到私鑰的安全。所以說,"服務器"隨隨便便用私鑰去加密一個來路不明的字符串并把結果發送給對方是不安全的。

〖解決方法〗

每次收到"客戶"發來的要加密的的字符串時,"服務器"并不是真正的加密這個字符串本身,而是把這個字符串進行一個hash計算,加密這個字符串的hash值(不加密原來的字符串)后發送給"客戶","客戶"收到后解密這個hash值并自己計算字符串的hash值然后進行對比是否一致。也就是說,"服務器"不直接加密收到的字符串,而是加密這個字符串的一個hash值,這樣就避免了加密那些有規律的字符串,從而降低被破解的機率。"客戶"自己發送的字符串,因此它自己可以計算字符串的hash值,然后再把"服務器"發送過來的加密的hash值和自己計算的進行對比,同樣也能確定對方是否是"服務器"。


【問題2】

在雙方的通信過程中,"黑客"可以截獲發送的加密了的內容,雖然他無法解密這個內容,但是他可以搗亂,例如把信息原封不動的發送多次,擾亂通信過程。

〖解決方法〗

可以給通信的內容加上一個序號或者一個隨機的值,如果"客戶"或者"服務器"接收到的信息中有之前出現過的序號或者隨機值,那么說明有人在通信過程中重發信息內容進行搗亂,雙方會立刻停止通信。有人可能會問,如果有人一直這么搗亂怎么辦?那不是無法通信了??答案是的確是這樣的,例如有人控制了你連接互聯網的路由器,他的確可以針對你。但是一些重要的應用,例如軍隊或者政府的內部網絡,它們都不使用我們平時使用的公網,因此一般人不會破壞到他們的通信。?


【問題3】

在雙方的通信過程中,"黑客"除了簡單的重復發送截獲的消息之外,還可以修改截獲后的密文修改后再發送,因為修改的是密文,雖然不能完全控制消息解密后的內容,但是仍然會破壞解密后的密文。因此發送過程如果黑客對密文進行了修改,"客戶"和"服務器"是無法判斷密文是否被修改的。雖然不一定能達到目的,但是"黑客"可以一直這樣碰碰運氣。

〖解決方法〗

在每次發送信息時,先對信息的內容進行一個hash計算得出一個hash值,將信息的內容和這個hash值一起加密后發送。接收方在收到后進行解密得到明文的內容和hash值,然后接收方再自己對收到信息內容做一次hash計算,與收到的hash值進行對比看是否匹配,如果匹配就說明信息在傳輸過程中沒有被修改過。如果不匹配說明中途有人故意對加密數據進行了修改,立刻中斷通話過程后做其它處理。


3.?證書的構成和原理

3.1?證書的構成和原理

之前已經大概說了一個證書由什么構成,但是沒有仔細進行介紹,這里對證書的內容做一個詳細的介紹。先看下一個證書到底是個什么東西,在windows下查看一個證書時,界面是這樣的,我們主要關注一下Details Tab頁,其中的內容比較長,我滾動內容后后抓了三個圖,把完整的信息顯示出來:

里面的內容比較多——Version、Serial number、Signature algorithm?等等,挑幾個重要的解釋一下。


◆Issuer (證書的發布機構)

指出是什么機構發布的這個證書,也就是指明這個證書是哪個公司創建的(只是創建證書,不是指證書的使用者)。對于上面的這個證書來說,就是指"SecureTrust CA"這個機構。


◆Valid from , Valid to (證書的有效期)

也就是證書的有效時間,或者說證書的使用期限。?過了有效期限,證書就會作廢,不能使用了。


◆Public key (公鑰)

這個我們在前面介紹公鑰密碼體制時介紹過,公鑰是用來對消息進行加密的,第2章的例子中經常用到的。這個數字證書的公鑰是2048位的,它的值可以在圖的中間的那個對話框中看得到,是很長的一串數字。


◆Subject (主題)

這個證書是發布給誰的,或者說證書的所有者,一般是某個人或者某個公司名稱、機構的名稱、公司網站的網址等。?對于這里的證書來說,證書的所有者是Trustwave這個公司。


◆Signature algorithm (簽名所使用的算法)

就是指的這個數字證書的數字簽名所使用的加密算法,這樣就可以使用證書發布機構的證書里面的公鑰,根據這個算法對指紋進行解密。指紋的加密結果就是數字簽名(第1.5節中解釋過數字簽名)。


◆Thumbprint, Thumbprint algorithm (指紋以及指紋算法)

這個是用來保證證書的完整性的,也就是說確保證書沒有被修改過,這東西的作用和2.7中說到的第3個問題類似。?其原理就是在發布證書時,發布者根據指紋算法(一個hash算法)計算整個證書的hash值(指紋)并和證書放在一起,使用者在打開證書時,自己也根據指紋算法計算一下證書的hash值(指紋),如果和剛開始的值對得上,就說明證書沒有被修改過,因為證書的內容被修改后,根據證書的內容計算的出的hash值(指紋)是會變化的。?注意,這個指紋會使用"SecureTrust CA"這個證書機構的私鑰用簽名算法(Signature algorithm)加密后和證書放在一起。


注意,為了保證安全,在證書的發布機構發布證書時,證書的指紋和指紋算法,都會加密后再和證書放到一起發布,以防有人修改指紋后偽造相應的數字證書。這里問題又來了,證書的指紋和指紋算法用什么加密呢?他們是用證書發布機構的私鑰進行加密的??梢杂米C書發布機構的公鑰對指紋和指紋算法解密,也就是說證書發布機構除了給別人發布證書外,他自己本身也有自己的證書。證書發布機構的證書是哪里來的呢???這個證書發布機構的數字證書(一般由他自己生成)在我們的操作系統剛安裝好時(例如windows xp等操作系統),這些證書發布機構的數字證書就已經被微軟(或者其它操作系統的開發機構)安裝在操作系統中了,微軟等公司會根據一些權威安全機構的評估選取一些信譽很好并且通過一定的安全認證的證書發布機構,把這些證書發布機構的證書默認就安裝在操作系統里面了,并且設置為操作系統信任的數字證書。這些證書發布機構自己持有與他自己的數字證書對應的私鑰,他會用這個私鑰加密所有他發布的證書的指紋作為數字簽名。


3.2?如何向證書的發布機構去申請證書

舉個例子方便大家理解,假設我們公司"ABC Company"花了1000塊錢,向一個證書發布機構"SecureTrust CA"為我們自己的公司"ABC Company"申請了一張證書,注意,這個證書發布機構"SecureTrust CA"是一個大家公認并被一些權威機構接受的證書發布機構,我們的操作系統里面已經安裝了"SecureTrust CA"的證書。"SecureTrust CA"在給我們發布證書時,把Issuer,Public key,Subject,Valid from,Valid to等信息以明文的形式寫到證書里面,然后用一個指紋算法計算出這些數字證書內容的一個指紋,并把指紋和指紋算法用自己的私鑰進行加密,然后和證書的內容一起發布,同時"SecureTrust CA"還會給一個我們公司"ABC Company"的私鑰給到我們。我們花了1000塊錢買的這個證書的內容如下:

×××××××××××××××證書內容開始×××××××××××××××××

Issuer : SecureTrust CA

Subject : ABC Company

Valid from?:?某個日期

Valid to:?某個日期

Public Key :?一串很長的數字

……?其它的一些證書內容……

{證書的指紋和計算指紋所使用的指紋算法}[SecureTrust CA的私鑰|RSA]??????//這個就是"SecureTrust CA"對這個證書的一個數字簽名,表示這個證書確實是他發布的,有什么問題他會負責(收了我們1000塊,出了問題肯定要負責任的)

×××××××××××××××證書內容結束×××××××××××××××××

?????????????? //?記不記得前面的約定?{}?表示RSA加密后的內容,[ | ]表示用什么密鑰和算法進行加密


我們"ABC Company"申請到這個證書后,我們把證書投入使用,我們在通信過程開始時會把證書發給對方,對方如何檢查這個證書的確是合法的并且是我們"ABC Company"公司的證書呢?首先應用程序(對方通信用的程序,例如IE、OUTLook等)讀取證書中的Issuer(發布機構)為"SecureTrust CA"?,然后會在操作系統中受信任的發布機構的證書中去找"SecureTrust CA"的證書,如果找不到,那說明證書的發布機構是個水貨發布機構,證書可能有問題,程序會給出一個錯誤信息。?如果在系統中找到了"SecureTrust CA"的證書,那么應用程序就會從證書中取出"SecureTrust CA"的公鑰,然后對我們"ABC Company"公司的證書里面的指紋和指紋算法用這個公鑰進行解密,然后使用這個指紋算法計算"ABC Company"證書的指紋,將這個計算的指紋與放在證書中的指紋對比,如果一致,說明"ABC Company"的證書肯定沒有被修改過并且證書是"SecureTrust CA"?發布的,證書中的公鑰肯定是"ABC Company"的。對方然后就可以放心的使用這個公鑰和我們"ABC Company"進行通信了。

★這個部分非常重要,一定要理解,您可以重新回顧一下之前的兩章"1、基礎知識"和" 2、一個加密通信過程的演化",然后再來理解這部分的內容。如果您把這節的內容看了幾遍還沒有搞懂證書的工作原理,您可以留言指出我沒有說清楚的內容,我好方便進行修正。


3.3?證書的發布機構

前面已經初步介紹了一下證書發布機構,這里再深入討論一下。

其實所有的公司都可以發布證書,我們自己也可以去注冊一家公司來專門給別人發布證書。但是很明顯,我們自己的專門發布證書的公司是不會被那些國際上的權威機構認可的,人家怎么知道你是不是個狗屁皮包公司?因此微軟在它的操作系統中,并不會信任我們這個證書發布機構,當應用程序在檢查證書的合法信的時候,一看證書的發布機構并不是操作系統所信任的發布機構,就會拋出錯誤信息。也就是說windows操作系統中不會預先安裝好我們這個證書發布機構的證書,不信任我們這個發布機構。


不受信任的證書發布機構的危害

為什么一個證書發布機構受不受信任這么重要?我們舉個例子。假設我們開了一個狗屁公司來為別人發布證書,并且我和微軟有一腿,微軟在他們的操作系統中把我設置為了受信任的證書發布機構?,F在如果有個小公司叫Wicrosoft?花了10塊錢讓我為他們公司申請了一個證書,并且公司慢慢壯大,證書的應用范圍也越來越廣。然后有個奸商的公司JS Company想冒充Wicrosoft,于是給了我¥10000,讓我為他們頒布一個證書,但是證書的名字(Subject)要寫Wicrosoft,假如我為了這¥10000,真的把證書給了他們,那么他們以后就可以使用這個證書來冒充Wicrosoft了。

如果是一個優秀的證書發布機構,比如你要向他申請一個名字叫Wicrosoft的證書,它會讓你提供很多資料證明你確實可以代表Wicrosoft這個公司,也就是說他回去核實你的身份。證書發布機構是要為他發布出的證書負法律責任的。


到這里,你可能會想,TMD,那我們自己就不能發布證書嗎?就一定要花錢去申請?當然不是,我們自己也可以成立證書發布機構,但是需要通過一些安全認證等等,只是有點麻煩。另外,如果數字證書只是要在公司內部使用,公司可以自己給自己生成一個證書,在公司的所有機器上把這個證書設置為操作系統信任的證書發布機構的證書(這句話仔細看清楚,有點繞口),這樣以后公司發布的證書在公司內部的所有機器上就可以通過驗證了(在發布證書時,把這些證書的Issuer(發布機構)設置為我們自己的證書發布機構的證書的Subject(主題)就可以了)。但是這只限于內部應用,因為只有我們公司自己的機器上設置了信任我們自己這個所謂的證書發布機構,而其它機器上并沒有事先信任我們這個證書發布機構,所以在其它機器上,我們發布的證書就無法通過安全驗證。


4.?在windows中對數字證書進行管理

4.1?查看、刪除、安裝?數字證書

我們在上一章中說到了,我們的操作系統中會預先安裝好一些證書發布機構的證書,我們看下在windows中如何找到這些證書,步驟如下:

1)開始菜單->運行,輸入mmc,回車

2)在打開的窗口中選擇?File-> Add/Remove Snap-in…

3)然后在彈出的對話框的?Standalone Tab頁里面點擊?Add…?按鈕

4)在彈出的對對話框中選擇?certificates?后點擊?Add?按鈕

具體的步驟如下圖所示:


上面的步驟結束后,會又彈出一個對話框,里面有三個單選按鈕如下:

My user account

Service account

Computer account

可以選擇第一或者第三個選項,用來查看當前用戶的證書或整個計算里面安裝的證書。我們這里就默認選擇第一個,平時一般安裝證書的時候都會給所有用戶安裝,所以選擇第一個和第三個選項看到的證書會差不多。我們在左邊的導航樹中選中受信任的證書發布機構(Trusted Root Certificate Authorities),然后點擊下面的證書(Certificates),在右邊的區域中就可以看到所有的受信任的證書發布機構的證書。


注意上面的圖片中,右邊我們選中的這個證書發布機構"SecureTrust CA",我們前面在第3章3.2節中舉例子的時候,就是去向這個證書發布機構申請的證書,由于我們申請的證書是這個機構發布的,所以應用程序在檢查我們的證書的發布機構時(會檢查我們證書的簽名,確認是該機構發布的證書),就會發現是可以信任的證書發布機構,從而就會相信我們證書的真實性。

刪除數字證書很簡單,直接在右邊的列表中右鍵然后刪除就可以了。

數字證書的安裝也比較簡單,直接雙擊數字證書文件,會打開數字證書,對話框下面會有一個Install Certificate按鈕,點擊后就可以根據向導進行安裝,如下圖所示:

這個證書是我自己生成的測試證書,在證書的導入向導里面,它會讓你選擇導入到什么位置,如果是一個我們自己信任的證書發布機構自己的證書,只要導入到Certificate Authorities就可以了。Trusted Root Certificate Authorities, Intermediate Certification Authorities, Third-Party Root Certification Authorities?都是可以的,他們只是對證書的發布機構做了一個分類,還有一些其它的證書類型,例如Personal(個人證書)等等,具體就不介紹了。安裝的時候一般來說可以用默認的選擇項一直"下一步"到底。


4.2?如何自己創建證書

每個證書發布機構都有自己的用來創建證書的工具,當然,具體他們怎么去創建一個證書的我也不太清楚,不同類型的證書都有一定的格式和規范,我沒有仔細去研究過這部分內容。?微軟為我們提供了一個用來創建證書的工具makecert.exe,在安裝Visual Studio的時候會安裝上。如果沒有安裝也無所謂,可以上網去下一個,搜索makecert就可以了。可以直接從我的博客下載,這是鏈接。

向一些正規的證書發布機構申請證書一般是要收費的(因為別人要花時間檢查你的身份,確認有沒有同名的證書等等),這里我們看下如何自己創建一個證書,為后面在IIS中配置Https做準備。

我們用到的是makecert這個工具,微軟有很詳細的使用幫助,我這里只做一個簡單的解釋,詳細的各種參數和使用方法請查看MSDNmakecert的幫助。但是里面有些參數說得不夠清楚,而且還有遺漏的,可以參看我后面的解釋作為一個補充。

先看下makecert最簡單的使用方式:

makecert.exe test.cer

上面的命令會在makecert.exe所在的目錄生成一個證書文件test.cer的數字證書文件。可以雙擊證書打開,看看證書的內容如下:


證書的發布機構是"Root Agency",證書的主題(證書發布給誰)是"Joe's-Software-Emporium",因為我們沒有指定把證書發布給誰,makecert自己給我們隨便生成了一個公司的名字。另外還指定了公鑰、簽名算法(用來解密簽名)、指紋和指紋算法等。

注意,因為這個證書是由微軟的工具生成的,嚴格來說它沒什么發布機構,所以微軟虛擬了一個叫做"Root Agency"的發布機構,默認情況下,windows里面安裝了這個所謂的證書發布機構的證書,但是這證書默認情況下不是受信任的,原因很簡單,這樣做大家都可以用makecert來制作合法的數字證書了。如果我們自己硬是要,也可以把它設置為受信任的。


下面我們看下其它的參數,比如我們要給網站?www.jefferysun.com?生成一個證書MyCA.cer,假設我們把makecert.exe放在C:盤下,命令行如下:

makecert -r -pe -n "CN=10.30.146.206" -b 01/01/2000 -e 01/01/2036 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12

C:\> makecert.exe –pe -r? –n? "CN=www.jefferysun.com" -ss my -sr LocalMachine -a sha1 -len 2048? MyCA.cer

解釋一下makecert的常用參數的意思:

-n?指定主題的名字,這個是有固定的格式的,?CN=主題名字?,CN應該是Certificate Name的縮寫。我這里的主題的名字就是我們的IIS所在機器的IP。這里可以指定一些主題的其它附加信息,例如?O= ***?表示組織信息等等。

-r?創建自簽署證書,意思就是說在生成證書時,將證書的發布機構設置為自己。

-pe?將所生成的私鑰標記為可導出。注意,服務器發送證書給客戶端的時候,客戶端只能從證書里面獲取公鑰,私鑰是無法獲取的。如果我們指定了這個參數,證書在安裝在機器上后,我們還可以從證書中導出私鑰,默認情況下是不能導出私鑰的。正規的途徑發布的證書,是不可能讓你導出私鑰的。

-b –e?證書的有效期

-ss?證書的存儲名稱,就是windows證書存儲區的目錄名,如果不存在在的話就創建一個。

-sr?證書的存儲位置,只有currentuser(默認值)或?localmachine兩個值。

-sv?指定保存私鑰的文件,文件里面除了包含私鑰外,其實也包含了證書。這個文件是需要保密的,這個文件在服務端配置時是需要用到的。

這個CN=10.30.146.206要與自己的服務器相對應,要不然在配置HTTPS的時候會出現錯誤

-a?指定簽名算法,必須是md5或rsa1。(還記得簽名算法的作用不?可以看一下3章的第1節中關于簽名算法的介紹)

-in?指定證書發布機構的名稱

-len?這個參數在中文的幫助文檔中好像沒有提到,但是這個其實很重要,用于指定公鑰的位數,越大越安全,默認值是1024,推薦2048。我試了下,這個不為1024的倍數也是可以的。

生成證書后可以進行安裝,安裝過程可以參看4.1節。

轉載地質鏈接:https://www.cnblogs.com/kevin860/p/10258544.html

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容

  • 文中首先解釋了加密解密的一些基礎知識和概念,然后通過一個加密通信過程的例子說明了加密算法的作用,以及數字證書的出現...
    已認證用戶閱讀 3,860評論 1 4
  • 數字證書原理 - 無恙 - 博客園 文中首先解釋了加密解密的一些基礎知識和概念,然后通過一個加密通信過程的例子說明...
    拉肚閱讀 1,675評論 0 3
  • 前言 文中首先解釋加密解密的一些基礎知識和概念,然后通過一個加密通信過程的例子說明了加密算法的作用,以及數字證書的...
    sunny沖哥閱讀 3,007評論 0 2
  • 文中首先解釋了加密解密的一些基礎知識和概念,然后通過一個加密通信過程的例子說明了加密算法的作用,以及數字證書的出現...
    sunny沖哥閱讀 1,398評論 0 3
  • 原文地址:數字證書原理,公鑰私鑰加密原理 文中首先解釋了加密解密的一些基礎知識和概念,然后通過一個加密通信過程的例...
    淇濱杜隆坦閱讀 4,175評論 4 46