【貓說】秘鑰—數(shù)字證書

文中首先解釋了加密解密的一些基礎(chǔ)知識和概念锋叨,然后通過一個加密通信過程的例子說明了加密算法的作用辐脖,以及數(shù)字證書的出現(xiàn)所起的作用形用。接著對數(shù)字證書做一個詳細(xì)的解釋奥裸,并討論一下windows中數(shù)字證書的管理险掀,最后演示使用makecert生成數(shù)字證書。如果發(fā)現(xiàn)文中有錯誤的地方湾宙,或者有什么地方說得不夠清楚樟氢,歡迎指出!

1 基礎(chǔ)知識

這部分內(nèi)容主要解釋一些概念和術(shù)語侠鳄,最好是先理解這部分內(nèi)容嗡害。

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

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

加密:通過加密算法和公鑰對內(nèi)容(或者說明文)進(jìn)行加密知押,得到密文叹螟。加密過程需要用到公鑰。

解密:通過解密算法和私鑰對密文進(jìn)行解密台盯,得到明文罢绽。解密過程需要用到解密算法和私鑰。注意静盅,由公鑰加密的內(nèi)容良价,只能由私鑰進(jìn)行解密寝殴,也就是說,由公鑰加密的內(nèi)容明垢,如果不知道私鑰蚣常,是無法解密的。

公鑰密碼體制的公鑰和算法都是公開的(這是為什么叫公鑰密碼體制的原因)痊银,私鑰是保密的抵蚊。大家都以使用公鑰進(jìn)行加密,但是只有私鑰的持有者才能解密溯革。在實(shí)際的使用中贞绳,有需要的人會生成一對公鑰和私鑰,把公鑰發(fā)布出去給別人使用致稀,自己保留私鑰冈闭。

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

在對稱加密算法中,加密使用的密鑰和解密使用的密鑰是相同的抖单。也就是說拒秘,加密和解密都是使用的同一個密鑰。因此對稱加密算法要保證安全性的話臭猜,密鑰要做好保密,只能讓使用的人知道押蚤,不能對外公開蔑歌。這個和上面的公鑰密碼體制有所不同,公鑰密碼體制中加密是用公鑰揽碘,解密使用私鑰次屠,而對稱加密算法中,加密和解密都是使用同一個密鑰雳刺,不區(qū)分公鑰和私鑰劫灶。

密鑰,一般就是一個字符串或數(shù)字掖桦,在加密或者解密時傳遞給加密/解密算法本昏。前面在公鑰密碼體制中說到的公鑰、私鑰就是密鑰枪汪,公鑰是加密使用的密鑰涌穆,私鑰是解密使用的密鑰。

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

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

1.4 RSA簡介

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

RSA密碼體制是一種公鑰密碼體制唯欣,公鑰公開嘹吨,私鑰保密,它的加密解密算法是公開的境氢。 由公鑰加密的內(nèi)容可以并且只能由私鑰進(jìn)行解密蟀拷,并且由私鑰加密的內(nèi)容可以并且只能由公鑰進(jìn)行解密。也就是說萍聊,RSA的這一對公鑰问芬、私鑰都可以用來加密和解密,并且一方加密的內(nèi)容可以由并且只能由對方進(jìn)行解密寿桨。

1.5此衅、簽名和加密

我們說加密,是指對某個內(nèi)容加密亭螟,加密后的內(nèi)容還可以通過解密進(jìn)行還原挡鞍。 比如我們把一封郵件進(jìn)行加密,加密后的內(nèi)容在網(wǎng)絡(luò)上進(jìn)行傳輸预烙,接收者在收到后墨微,通過解密可以還原郵件的真實(shí)內(nèi)容。

這里主要解釋一下簽名扁掸,簽名就是在信息的后面再加上一段內(nèi)容翘县,可以證明信息沒有被修改過,怎么樣可以達(dá)到這個效果呢谴分?一般是對信息做一個hash計算得到一個hash值锈麸,注意,這個過程是不可逆的牺蹄,也就是說無法通過hash值得出原來的信息內(nèi)容忘伞。在把信息發(fā)送出去時,把這個hash值加密后做為一個簽名和信息一起發(fā)出去沙兰。 接收方在收到信息后虑省,會重新計算信息的hash值,并和信息所附帶的hash值(解密后)進(jìn)行對比僧凰,如果一致探颈,就說明信息的內(nèi)容沒有被修改過,因?yàn)檫@里hash計算可以保證不同的內(nèi)容一定會得到不同的hash值训措,所以只要內(nèi)容一被修改伪节,根據(jù)信息內(nèi)容計算的hash值就會變化光羞。當(dāng)然,不懷好意的人也可以修改信息內(nèi)容的同時也修改hash值怀大,從而讓它們可以相匹配雏逾,為了防止這種情況防泵,hash值一般都會加密后(也就是簽名)再和信息一起發(fā)送,以保證這個hash值不被修改。至于如何讓別人可以解密這個簽名卫玖,這個過程涉及到數(shù)字證書等概念蛮穿,我們后面在說到數(shù)字證書時再詳細(xì)說明蓉坎,這里您先只需先理解簽名的這個概念黎烈。

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

我們來看一個例子,現(xiàn)在假設(shè)“服務(wù)器”和“客戶”要在網(wǎng)絡(luò)上通信蒜焊,并且他們打算使用RSA(參看前面的RSA簡介)來對通信進(jìn)行加密以保證談話內(nèi)容的安全倒信。由于是使用RSA這種公鑰密碼體制,“服務(wù)器”需要對外發(fā)布公鑰(算法不需要公布泳梆,RSA的算法大家都知道)鳖悠,自己留著私鑰∮琶睿“客戶”通過某些途徑拿到了“服務(wù)器”發(fā)布的公鑰乘综,客戶并不知道私鑰√着穑“客戶”具體是通過什么途徑獲取公鑰的卡辰,我們后面再來說明,下面看一下雙方如何進(jìn)行保密的通信:

2.1 第一回合:

“客戶”->“服務(wù)器”:你好

“服務(wù)器”->“客戶”:你好熟菲,我是服務(wù)器

“客戶”->“服務(wù)器”:?朴恳?抄罕??

因?yàn)橄⑹窃诰W(wǎng)絡(luò)上傳輸?shù)挠谟保腥丝梢悦俺渥约菏恰胺?wù)器”來向客戶發(fā)送信息呆贿。例如上面的消息可以被黑客截獲如下:

“客戶”->“服務(wù)器”:你好

“服務(wù)器”->“客戶”:你好,我是服務(wù)器

“客戶”->“黑客”:你好// 黑客在“客戶”和“服務(wù)器”之間的某個路由器上截獲“客戶”發(fā)給服務(wù)器的信息森渐,然后自己冒充“服務(wù)器”

“黑客”->“客戶”:你好做入,我是服務(wù)器

因此“客戶”在接到消息后,并不能肯定這個消息就是由“服務(wù)器”發(fā)出的同衣,某些“黑客”也可以冒充“服務(wù)器”發(fā)出這個消息竟块。如何確定信息是由“服務(wù)器”發(fā)過來的呢?有一個解決方法耐齐,因?yàn)橹挥蟹?wù)器有私鑰浪秘,所以如果只要能夠確認(rèn)對方有私鑰蒋情,那么對方就是“服務(wù)器”。因此通信過程可以改進(jìn)為如下:

2.2 第二回合:

“客戶”->“服務(wù)器”:你好

“服務(wù)器”->“客戶”:你好耸携,我是服務(wù)器

“客戶”->“服務(wù)器”:向我證明你就是服務(wù)器

“服務(wù)器”->“客戶”:你好棵癣,我是服務(wù)器 {你好,我是服務(wù)器}[私鑰|RSA]

// 注意這里約定一下夺衍,{} 表示RSA加密后的內(nèi)容狈谊,[ | ]表示用什么密鑰和算法進(jìn)行加密,后面的示例中都用這種表示方式沟沙,例如上面的{你好河劝,我是服務(wù)器}[私鑰|RSA]**? 就表示用私鑰對“你好,我是服務(wù)器”進(jìn)行加密后的結(jié)果尝胆。**

為了向“客戶”證明自己是“服務(wù)器”丧裁, “服務(wù)器”把一個字符串用自己的私鑰加密,把明文和加密后的密文一起發(fā)給“客戶”含衔。對于這里的例子來說煎娇,就是把字符串 “你好,我是服務(wù)器”和這個字符串用私鑰加密后的內(nèi)容 {你好贪染,我是服務(wù)器}[私鑰|RSA] 發(fā)給客戶缓呛。

“客戶”收到信息后,她用自己持有的公鑰解密密文杭隙,和明文進(jìn)行對比哟绊,如果一致,說明信息的確是由服務(wù)器發(fā)過來的痰憎。也就是說“客戶”把 {你好票髓,我是服務(wù)器}[私鑰|RSA] 這個內(nèi)容用公鑰進(jìn)行解密,然后和“你好铣耘,我是服務(wù)器”對比洽沟。因?yàn)橛伞胺?wù)器”用私鑰加密后的內(nèi)容,由并且只能由公鑰進(jìn)行解密蜗细,私鑰只有“服務(wù)器”持有裆操,所以如果解密出來的內(nèi)容是能夠?qū)Φ蒙系模钦f明信息一定是從“服務(wù)器”發(fā)過來的炉媒。

假設(shè)“黑客”想冒充“服務(wù)器”:

“黑客”->“客戶”:你好踪区,我是服務(wù)器

“客戶”->“黑客”:向我證明你就是服務(wù)器

“黑客”->“客戶”:你好,我是服務(wù)器 {你好吊骤,我是服務(wù)器}[缎岗??白粉?|RSA]//這里黑客無法冒充密强,因?yàn)樗恢?b>私鑰茅郎,無法用私鑰加密某個字符串后發(fā)送給客戶去驗(yàn)證。

“客戶”->“黑客”:或渤?系冗??薪鹦?

由于“黑客”沒有“服務(wù)器”的私鑰掌敬,因此它發(fā)送過去的內(nèi)容,“客戶”是無法通過服務(wù)器的公鑰解密的池磁,因此可以認(rèn)定對方是個冒牌貨奔害!

到這里為止,“客戶”就可以確認(rèn)“服務(wù)器”的身份了地熄,可以放心和“服務(wù)器”進(jìn)行通信华临,但是這里有一個問題,通信的內(nèi)容在網(wǎng)絡(luò)上還是無法保密端考。為什么無法保密呢雅潭?通信過程不是可以用公鑰、私鑰加密嗎却特?其實(shí)用RSA的私鑰和公鑰是不行的扶供,我們來具體分析下過程,看下面的演示:

2.3 第三回合:

“客戶”->“服務(wù)器”:你好

“服務(wù)器”->“客戶”:你好裂明,我是服務(wù)器

“客戶”->“服務(wù)器”:向我證明你就是服務(wù)器

“服務(wù)器”->“客戶”:你好椿浓,我是服務(wù)器 {你好,我是服務(wù)器}[私鑰|RSA]

“客戶”->“服務(wù)器”:{我的帳號是aaa闽晦,密碼是123扳碍,把我的余額的信息發(fā)給我看看}[公鑰|RSA]

“服務(wù)器”->“客戶”:{你的余額是100元}[私鑰|RSA]

注意上面的的信息 {你的余額是100元}[私鑰],這個是“服務(wù)器”用私鑰加密后的內(nèi)容仙蛉,但是我們之前說了笋敞,公鑰是發(fā)布出去的,因此所有的人都知道公鑰捅儒,所以除了“客戶”液样,其它的人也可以用公鑰對{你的余額是100元}[私鑰]進(jìn)行解密振亮。所以如果“服務(wù)器”用私鑰加密發(fā)給“客戶”巧还,這個信息是無法保密的,因?yàn)橹灰泄€就可以解密這內(nèi)容坊秸。然而“服務(wù)器”也不能用公鑰對發(fā)送的內(nèi)容進(jìn)行加密麸祷,因?yàn)椤翱蛻簟睕]有私鑰,發(fā)送個“客戶”也解密不了褒搔。

這樣問題就又來了阶牍,那又如何解決呢喷面?在實(shí)際的應(yīng)用過程,一般是通過引入對稱加密來解決這個問題走孽,看下面的演示:

2.4 第四回合:

“客戶”->“服務(wù)器”:你好

“服務(wù)器”->“客戶”:你好惧辈,我是服務(wù)器

“客戶”->“服務(wù)器”:向我證明你就是服務(wù)器

“服務(wù)器”->“客戶”:你好,我是服務(wù)器 {你好磕瓷,我是服務(wù)器}[私鑰|RSA]

“客戶”->“服務(wù)器”:{我們后面的通信過程盒齿,用對稱加密來進(jìn)行,這里是對稱加密算法和密鑰}[公鑰|RSA]? ? //藍(lán)色字體的部分是對稱加密的算法和密鑰的具體內(nèi)容困食,客戶把它們發(fā)送給服務(wù)器边翁。

“服務(wù)器”->“客戶”:{OK,收到硕盹!}[密鑰|對稱加密算法]

“客戶”->“服務(wù)器”:{我的帳號是aaa符匾,密碼是123,把我的余額的信息發(fā)給我看看}[密鑰|對稱加密算法]

“服務(wù)器”->“客戶”:{你的余額是100元}[密鑰|對稱加密算法]

在上面的通信過程中瘩例,“客戶”在確認(rèn)了“服務(wù)器”的身份后啊胶,“客戶”自己選擇一個對稱加密算法和一個密鑰,把這個對稱加密算法和密鑰一起用公鑰加密后發(fā)送給“服務(wù)器”仰剿。注意创淡,由于對稱加密算法和密鑰是用公鑰加密的,就算這個加密后的內(nèi)容被“黑客”截獲了南吮,由于沒有私鑰琳彩,“黑客”也無從知道對稱加密算法和密鑰的內(nèi)容。

由于是用公鑰加密的部凑,只有私鑰能夠解密露乏,這樣就可以保證只有服務(wù)器可以知道對稱加密算法和密鑰,而其它人不可能知道(這個對稱加密算法和密鑰是“客戶”自己選擇的涂邀,所以“客戶”自己當(dāng)然知道如何解密加密)瘟仿。這樣“服務(wù)器”和“客戶”就可以用對稱加密算法和密鑰來加密通信的內(nèi)容了。

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

因?yàn)樗借€只有“服務(wù)器”擁有劳较,因此“客戶”可以通過判斷對方是否有私鑰來判斷對方是否是“服務(wù)器”。

客戶端通過RSA的掩護(hù)浩聋,安全的和服務(wù)器商量好一個對稱加密算法和密鑰來保證后面通信過程內(nèi)容的安全观蜗。

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

到這里梧兼,“客戶”就可以確認(rèn)“服務(wù)器”的身份放吩,并且雙方的通信內(nèi)容可以進(jìn)行加密,其他人就算截獲了通信內(nèi)容羽杰,也無法解密屎慢。的確,好像通信的過程是比較安全了忽洛。

但是這里還留有一個問題腻惠,在最開始我們就說過,“服務(wù)器”要對外發(fā)布公鑰欲虚,那“服務(wù)器”如何把公鑰發(fā)送給“客戶”呢集灌?我們第一反應(yīng)可能會想到以下的兩個方法:

把公鑰放到互聯(lián)網(wǎng)的某個地方的一個下載地址,事先給“客戶”去下載复哆。

每次和“客戶”開始通信時欣喧,“服務(wù)器”把公鑰發(fā)給“客戶”。

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

對于1)方法唆阿,“客戶”無法確定這個下載地址是不是“服務(wù)器”發(fā)布的,你憑什么就相信這個地址下載的東西就是“服務(wù)器”發(fā)布的而不是別人偽造的呢锈锤,萬一下載到一個假的怎么辦驯鳖?另外要所有的“客戶”都在通信前事先去下載公鑰也很不現(xiàn)實(shí)。

對于2)方法久免,也有問題浅辙,因?yàn)槿魏稳硕伎梢宰约荷梢粚€和私鑰,他只要向“客戶”發(fā)送他自己的私鑰就可以冒充“服務(wù)器”了阎姥。示意如下:

“客戶”->“黑客”:你好? ? ? ? ? //黑客截獲“客戶”發(fā)給“服務(wù)器”的消息

“黑客”->“客戶”:你好记舆,我是服務(wù)器,這個是我的公鑰? ? //黑客自己生成一對公鑰和私鑰呼巴,把公鑰發(fā)給“客戶”泽腮,自己保留私鑰

“客戶”->“黑客”:向我證明你就是服務(wù)器

“黑客”->“客戶”:你好,我是服務(wù)器 {你好衣赶,我是服務(wù)器}[黑客自己的私鑰|RSA]? ? ? //客戶收到“黑客”用私鑰加密的信息后诊赊,是可以用“黑客”發(fā)給自己的公鑰解密的,從而會誤認(rèn)為“黑客”是“服務(wù)器”

因此“黑客”只需要自己生成一對公鑰和私鑰屑埋,然后把公鑰發(fā)送給“客戶”豪筝,自己保留私鑰痰滋,這樣由于“客戶”可以用黑客的公鑰解密黑客的私鑰加密的內(nèi)容摘能,“客戶”就會相信“黑客”是“服務(wù)器”续崖,從而導(dǎo)致了安全問題。這里問題的根源就在于团搞,大家都可以生成公鑰严望、私鑰對,無法確認(rèn)公鑰對到底是誰的逻恐。 如果能夠確定公鑰到底是誰的像吻,就不會有這個問題了。例如复隆,如果收到“黑客”冒充“服務(wù)器”發(fā)過來的公鑰拨匆,經(jīng)過某種檢查,如果能夠發(fā)現(xiàn)這個公鑰不是“服務(wù)器”的就好了挽拂。

為了解決這個問題惭每,數(shù)字證書出現(xiàn)了,它可以解決我們上面的問題亏栈。先大概看下什么是數(shù)字證書台腥,一個證書包含下面的具體內(nèi)容:

證書的發(fā)布機(jī)構(gòu)

證書的有效期

公鑰

證書所有者(Subject)

簽名所使用的算法

指紋以及指紋算法

證書的內(nèi)容的詳細(xì)解釋會在后面詳細(xì)解釋,這里先只需要搞清楚一點(diǎn)绒北,數(shù)字證書可以保證數(shù)字證書里的公鑰確實(shí)是這個證書的所有者(Subject)的黎侈,或者證書可以用來確認(rèn)對方的身份。也就是說闷游,我們拿到一個數(shù)字證書峻汉,我們可以判斷出這個數(shù)字證書到底是誰的。至于是如何判斷的脐往,后面會在詳細(xì)討論數(shù)字證書時詳細(xì)解釋【慵茫現(xiàn)在把前面的通信過程使用數(shù)字證書修改為如下:

2.5 第五回合:

“客戶”->“服務(wù)器”:你好

“服務(wù)器”->“客戶”:你好,我是服務(wù)器钙勃,這里是我的數(shù)字證書? ? ? ? //這里用證書代替了公鑰

“客戶”->“服務(wù)器”:向我證明你就是服務(wù)器

“服務(wù)器”->“客戶”:你好蛛碌,我是服務(wù)器 {你好,我是服務(wù)器}[私鑰|RSA]

注意辖源,上面第二次通信蔚携,“服務(wù)器”把自己的證書發(fā)給了“客戶”,而不是發(fā)送公鑰克饶≡脱眩“客戶”可以根據(jù)證書校驗(yàn)這個證書到底是不是“服務(wù)器”的,也就是能校驗(yàn)這個證書的所有者是不是“服務(wù)器”矾湃,從而確認(rèn)這個證書中的公鑰的確是“服務(wù)器”的亡脑。后面的過程和以前是一樣,“客戶”讓“服務(wù)器”證明自己的身份,“服務(wù)器”用私鑰加密一段內(nèi)容連同明文一起發(fā)給“客戶”霉咨,“客戶”把加密內(nèi)容用數(shù)字證書中的公鑰解密后和明文對比蛙紫,如果一致,那么對方就確實(shí)是“服務(wù)器”途戒,然后雙方協(xié)商一個對稱加密來保證通信過程的安全坑傅。到這里,整個過程就完整了喷斋,我們回顧一下:

2.6 完整過程:

step1: “客戶”向服務(wù)端發(fā)送一個通信請求

“客戶”->“服務(wù)器”:你好

step2: “服務(wù)器”向客戶發(fā)送自己的數(shù)字證書唁毒。證書中有一個公鑰用來加密信息,私鑰由“服務(wù)器”持有

“服務(wù)器”->“客戶”:你好星爪,我是服務(wù)器浆西,這里是我的數(shù)字證書

step3: “客戶”收到“服務(wù)器”的證書后,它會去驗(yàn)證這個數(shù)字證書到底是不是“服務(wù)器”的顽腾,數(shù)字證書有沒有什么問題室谚,數(shù)字證書如果檢查沒有問題,就說明數(shù)字證書中的公鑰確實(shí)是“服務(wù)器”的崔泵。檢查數(shù)字證書后秒赤,“客戶”會發(fā)送一個隨機(jī)的字符串給“服務(wù)器”用私鑰去加密,服務(wù)器把加密的結(jié)果返回給“客戶”憎瘸,“客戶”用公鑰解密這個返回結(jié)果入篮,如果解密結(jié)果與之前生成的隨機(jī)字符串一致,那說明對方確實(shí)是私鑰的持有者幌甘,或者說對方確實(shí)是“服務(wù)器”潮售。

“客戶”->“服務(wù)器”:向我證明你就是服務(wù)器,這是一個隨機(jī)字符串? ? //前面的例子中為了方便解釋锅风,用的是“你好”等內(nèi)容酥诽,實(shí)際情況下一般是隨機(jī)生成的一個字符串。

“服務(wù)器”->“客戶”:{一個隨機(jī)字符串}[私鑰|RSA]

step4: 驗(yàn)證“服務(wù)器”的身份后皱埠,“客戶”生成一個對稱加密算法和密鑰肮帐,用于后面的通信的加密和解密。這個對稱加密算法和密鑰边器,“客戶”會用公鑰加密后發(fā)送給“服務(wù)器”训枢,別人截獲了也沒用,因?yàn)橹挥小胺?wù)器”手中有可以解密的私鑰忘巧。這樣恒界,后面“服務(wù)器”和“客戶”就都可以用對稱加密算法來加密和解密通信內(nèi)容了。

“服務(wù)器”->“客戶”:{OK砚嘴,已經(jīng)收到你發(fā)來的對稱加密算法和密鑰十酣!有什么可以幫到你的涩拙?}[密鑰|對稱加密算法]

“客戶”->“服務(wù)器”:{我的帳號是aaa,密碼是123耸采,把我的余額的信息發(fā)給我看看}[密鑰|對稱加密算法]

“服務(wù)器”->“客戶”:{你好兴泥,你的余額是100元}[密鑰|對稱加密算法]

…… //繼續(xù)其它的通信

2.7 其它問題:

上面的過程已經(jīng)十分接近HTTPS的真實(shí)通信過程了,完全可以按照這個過程去理解HTTPS的工作原理洋幻。但是我為了方便解釋,上面有些細(xì)節(jié)沒有說到翅娶,有興趣的人可以看下這部分的內(nèi)容文留。可以跳過不看竭沫,無關(guān)緊要燥翅。

【問題1】

上面的通信過程中說到,在檢查完證書后蜕提,“客戶”發(fā)送一個隨機(jī)的字符串給“服務(wù)器”去用私鑰加密森书,以便判斷對方是否真的持有私鑰。但是有一個問題谎势,“黑客”也可以發(fā)送一個字符串給“服務(wù)器”去加密并且得到加密后的內(nèi)容凛膏,這樣對于“服務(wù)器”來說是不安全的,因?yàn)楹诳涂梢园l(fā)送一些簡單的有規(guī)律的字符串給“服務(wù)器”加密脏榆,從而尋找加密的規(guī)律猖毫,有可能威脅到私鑰的安全。所以說须喂,“服務(wù)器”隨隨便便用私鑰去加密一個來路不明的字符串并把結(jié)果發(fā)送給對方是不安全的吁断。

〖解決方法〗

每次收到“客戶”發(fā)來的要加密的的字符串時,“服務(wù)器”并不是真正的加密這個字符串本身坞生,而是把這個字符串進(jìn)行一個hash計算仔役,加密這個字符串的hash值(不加密原來的字符串)后發(fā)送給“客戶”,“客戶”收到后解密這個hash值并自己計算字符串的hash值然后進(jìn)行對比是否一致是己。也就是說又兵,“服務(wù)器”不直接加密收到的字符串,而是加密這個字符串的一個hash值卒废,這樣就避免了加密那些有規(guī)律的字符串寒波,從而降低被破解的機(jī)率∩埽“客戶”自己發(fā)送的字符串俄烁,因此它自己可以計算字符串的hash值,然后再把“服務(wù)器”發(fā)送過來的加密的hash值和自己計算的進(jìn)行對比级野,同樣也能確定對方是否是“服務(wù)器”页屠。

【問題2】

在雙方的通信過程中粹胯,“黑客”可以截獲發(fā)送的加密了的內(nèi)容,雖然他無法解密這個內(nèi)容辰企,但是他可以搗亂风纠,例如把信息原封不動的發(fā)送多次,擾亂通信過程牢贸。

〖解決方法〗

可以給通信的內(nèi)容加上一個序號或者一個隨機(jī)的值竹观,如果“客戶”或者“服務(wù)器”接收到的信息中有之前出現(xiàn)過的序號或者隨機(jī)值,那么說明有人在通信過程中重發(fā)信息內(nèi)容進(jìn)行搗亂潜索,雙方會立刻停止通信臭增。有人可能會問,如果有人一直這么搗亂怎么辦竹习?那不是無法通信了誊抛? 答案是的確是這樣的,例如有人控制了你連接互聯(lián)網(wǎng)的路由器整陌,他的確可以針對你拗窃。但是一些重要的應(yīng)用,例如軍隊(duì)或者政府的內(nèi)部網(wǎng)絡(luò)泌辫,它們都不使用我們平時使用的公網(wǎng)随夸,因此一般人不會破壞到他們的通信。

【問題3】

在雙方的通信過程中震放,“黑客”除了簡單的重復(fù)發(fā)送截獲的消息之外逃魄,還可以修改截獲后的密文修改后再發(fā)送,因?yàn)樾薷牡氖敲芪睦浇粒m然不能完全控制消息解密后的內(nèi)容伍俘,但是仍然會破壞解密后的密文。因此發(fā)送過程如果黑客對密文進(jìn)行了修改勉躺,“客戶”和“服務(wù)器”是無法判斷密文是否被修改的癌瘾。雖然不一定能達(dá)到目的,但是“黑客”可以一直這樣碰碰運(yùn)氣饵溅。

〖解決方法〗

在每次發(fā)送信息時妨退,先對信息的內(nèi)容進(jìn)行一個hash計算得出一個hash值,將信息的內(nèi)容和這個hash值一起加密后發(fā)送蜕企。接收方在收到后進(jìn)行解密得到明文的內(nèi)容和hash值咬荷,然后接收方再自己對收到信息內(nèi)容做一次hash計算,與收到的hash值進(jìn)行對比看是否匹配轻掩,如果匹配就說明信息在傳輸過程中沒有被修改過幸乒。如果不匹配說明中途有人故意對加密數(shù)據(jù)進(jìn)行了修改,立刻中斷通話過程后做其它處理唇牧。

3 證書的構(gòu)成和原理

3.1 證書的構(gòu)成和原理

之前已經(jīng)大概說了一個證書由什么構(gòu)成罕扎,但是沒有仔細(xì)進(jìn)行介紹聚唐,這里對證書的內(nèi)容做一個詳細(xì)的介紹。先看下一個證書到底是個什么東西腔召,在windows下查看一個證書時杆查,界面是這樣的,我們主要關(guān)注一下Details Tab頁臀蛛,其中的內(nèi)容比較長亲桦,我滾動內(nèi)容后后抓了三個圖,把完整的信息顯示出來:

certificateDetails

里面的內(nèi)容比較多——Version浊仆、Serial number客峭、Signature algorithm 等等,挑幾個重要的解釋一下氧卧。

◆Issuer (證書的發(fā)布機(jī)構(gòu))

指出是什么機(jī)構(gòu)發(fā)布的這個證書桃笙,也就是指明這個證書是哪個公司創(chuàng)建的(只是創(chuàng)建證書氏堤,不是指證書的使用者)沙绝。對于上面的這個證書來說,就是指"SecureTrust CA"這個機(jī)構(gòu)鼠锈。

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

也就是證書的有效時間闪檬,或者說證書的使用期限。 過了有效期限购笆,證書就會作廢粗悯,不能使用了。

◆Public key (公鑰)

這個我們在前面介紹公鑰密碼體制時介紹過同欠,公鑰是用來對消息進(jìn)行加密的样傍,第2章的例子中經(jīng)常用到的。這個數(shù)字證書的公鑰是2048位的铺遂,它的值可以在圖的中間的那個對話框中看得到衫哥,是很長的一串?dāng)?shù)字。

◆Subject (主題)

這個證書是發(fā)布給誰的襟锐,或者說證書的所有者撤逢,一般是某個人或者某個公司名稱、機(jī)構(gòu)的名稱粮坞、公司網(wǎng)站的網(wǎng)址等蚊荣。 對于這里的證書來說,證書的所有者是Trustwave這個公司莫杈。

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

就是指的這個數(shù)字證書的數(shù)字簽名所使用的加密算法互例,這樣就可以使用證書發(fā)布機(jī)構(gòu)的證書里面的公鑰,根據(jù)這個算法對指紋進(jìn)行解密筝闹。指紋的加密結(jié)果就是數(shù)字簽名(第1.5節(jié)中解釋過數(shù)字簽名)敲霍。

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

這個是用來保證證書的完整性的俊马,也就是說確保證書沒有被修改過,這東西的作用和2.7中說到的第3個問題類似肩杈。 其原理就是在發(fā)布證書時柴我,發(fā)布者根據(jù)指紋算法(一個hash算法)計算整個證書的hash值(指紋)并和證書放在一起,使用者在打開證書時扩然,自己也根據(jù)指紋算法計算一下證書的hash值(指紋)艘儒,如果和剛開始的值對得上,就說明證書沒有被修改過夫偶,因?yàn)樽C書的內(nèi)容被修改后界睁,根據(jù)證書的內(nèi)容計算的出的hash值(指紋)是會變化的。 注意兵拢,這個指紋會使用"SecureTrust CA"這個證書機(jī)構(gòu)的私鑰用簽名算法(Signature algorithm)加密后和證書放在一起翻斟。

注意,為了保證安全说铃,在證書的發(fā)布機(jī)構(gòu)發(fā)布證書時访惜,證書的指紋和指紋算法,都會加密后再和證書放到一起發(fā)布腻扇,以防有人修改指紋后偽造相應(yīng)的數(shù)字證書债热。這里問題又來了,證書的指紋和指紋算法用什么加密呢幼苛?他們是用證書發(fā)布機(jī)構(gòu)的私鑰進(jìn)行加密的窒篱。可以用證書發(fā)布機(jī)構(gòu)的公鑰對指紋和指紋算法解密舶沿,也就是說證書發(fā)布機(jī)構(gòu)除了給別人發(fā)布證書外墙杯,他自己本身也有自己的證書。證書發(fā)布機(jī)構(gòu)的證書是哪里來的呢括荡?高镐?瑟慈?這個證書發(fā)布機(jī)構(gòu)的數(shù)字證書(一般由他自己生成)在我們的操作系統(tǒng)剛安裝好時(例如windows xp等操作系統(tǒng))朋凉,這些證書發(fā)布機(jī)構(gòu)的數(shù)字證書就已經(jīng)被微軟(或者其它操作系統(tǒng)的開發(fā)機(jī)構(gòu))安裝在操作系統(tǒng)中了,微軟等公司會根據(jù)一些權(quán)威安全機(jī)構(gòu)的評估選取一些信譽(yù)很好并且通過一定的安全認(rèn)證的證書發(fā)布機(jī)構(gòu)顽冶,把這些證書發(fā)布機(jī)構(gòu)的證書默認(rèn)就安裝在操作系統(tǒng)里面了召夹,并且設(shè)置為操作系統(tǒng)信任的數(shù)字證書岩喷。這些證書發(fā)布機(jī)構(gòu)自己持有與他自己的數(shù)字證書對應(yīng)的私鑰,他會用這個私鑰加密所有他發(fā)布的證書的指紋作為數(shù)字簽名监憎。

3.2 如何向證書的發(fā)布機(jī)構(gòu)去申請證書

舉個例子方便大家理解纱意,假設(shè)我們公司"ABC Company"花了1000塊錢,向一個證書發(fā)布機(jī)構(gòu)"SecureTrust CA"為我們自己的公司"ABC Company"申請了一張證書鲸阔,注意偷霉,這個證書發(fā)布機(jī)構(gòu)"SecureTrust CA"是一個大家公認(rèn)并被一些權(quán)威機(jī)構(gòu)接受的證書發(fā)布機(jī)構(gòu)迄委,我們的操作系統(tǒng)里面已經(jīng)安裝了"SecureTrust CA"的證書。"SecureTrust CA"在給我們發(fā)布證書時类少,把Issuer,Public key,Subject,Valid from,Valid to等信息以明文的形式寫到證書里面叙身,然后用一個指紋算法計算出這些數(shù)字證書內(nèi)容的一個指紋,并把指紋和指紋算法用自己的私鑰進(jìn)行加密硫狞,然后和證書的內(nèi)容一起發(fā)布信轿,同時"SecureTrust CA"還會給一個我們公司"ABC Company"的私鑰給到我們。我們花了1000塊錢買的這個證書的內(nèi)容如下:

×××××××××××××××證書內(nèi)容開始×××××××××××××××××

Issuer : SecureTrust CA

Subject : ABC Company

Valid from : 某個日期

Valid to: 某個日期

Public Key : 一串很長的數(shù)字

…… 其它的一些證書內(nèi)容……

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

×××××××××××××××證書內(nèi)容結(jié)束×××××××××××××××××

**? ? ? ? ? ? ? // 記不記得前面的約定泣侮?{} 表示RSA加密后的內(nèi)容即彪,[ | ]表示用什么密鑰和算法進(jìn)行加密**

我們"ABC Company"申請到這個證書后,我們把證書投入使用活尊,我們在通信過程開始時會把證書發(fā)給對方隶校,對方如何檢查這個證書的確是合法的并且是我們"ABC Company"公司的證書呢?首先應(yīng)用程序(對方通信用的程序酬凳,例如IE惠况、OUTLook等)讀取證書中的Issuer(發(fā)布機(jī)構(gòu))為"SecureTrust CA" 遭庶,然后會在操作系統(tǒng)中受信任的發(fā)布機(jī)構(gòu)的證書中去找"SecureTrust CA"的證書宁仔,如果找不到,那說明證書的發(fā)布機(jī)構(gòu)是個水貨發(fā)布機(jī)構(gòu)峦睡,證書可能有問題翎苫,程序會給出一個錯誤信息。 如果在系統(tǒng)中找到了"SecureTrust CA"的證書榨了,那么應(yīng)用程序就會從證書中取出"SecureTrust CA"的公鑰煎谍,然后對我們"ABC Company"公司的證書里面的指紋和指紋算法用這個公鑰進(jìn)行解密,然后使用這個指紋算法計算"ABC Company"證書的指紋龙屉,將這個計算的指紋與放在證書中的指紋對比呐粘,如果一致,說明"ABC Company"的證書肯定沒有被修改過并且證書是"SecureTrust CA" 發(fā)布的转捕,證書中的公鑰肯定是"ABC Company"的作岖。對方然后就可以放心的使用這個公鑰和我們"ABC Company"進(jìn)行通信了。

★這個部分非常重要五芝,一定要理解痘儡,您可以重新回顧一下之前的兩章“1、基礎(chǔ)知識”和“ 2枢步、一個加密通信過程的演化”沉删,然后再來理解這部分的內(nèi)容渐尿。如果您把這節(jié)的內(nèi)容看了幾遍還沒有搞懂證書的工作原理,您可以留言指出我沒有說清楚的內(nèi)容矾瑰,我好方便進(jìn)行修正砖茸。

3.3 證書的發(fā)布機(jī)構(gòu)

前面已經(jīng)初步介紹了一下證書發(fā)布機(jī)構(gòu),這里再深入討論一下殴穴。

其實(shí)所有的公司都可以發(fā)布證書渔彰,我們自己也可以去注冊一家公司來專門給別人發(fā)布證書。但是很明顯推正,我們自己的專門發(fā)布證書的公司是不會被那些國際上的權(quán)威機(jī)構(gòu)認(rèn)可的恍涂,人家怎么知道你是不是個狗屁皮包公司?因此微軟在它的操作系統(tǒng)中植榕,并不會信任我們這個證書發(fā)布機(jī)構(gòu)再沧,當(dāng)應(yīng)用程序在檢查證書的合法信的時候,一看證書的發(fā)布機(jī)構(gòu)并不是操作系統(tǒng)所信任的發(fā)布機(jī)構(gòu)尊残,就會拋出錯誤信息炒瘸。也就是說windows操作系統(tǒng)中不會預(yù)先安裝好我們這個證書發(fā)布機(jī)構(gòu)的證書,不信任我們這個發(fā)布機(jī)構(gòu)寝衫。

不受信任的證書發(fā)布機(jī)構(gòu)的危害

為什么一個證書發(fā)布機(jī)構(gòu)受不受信任這么重要顷扩?我們舉個例子。假設(shè)我們開了一個狗屁公司來為別人發(fā)布證書慰毅,并且我和微軟有一腿隘截,微軟在他們的操作系統(tǒng)中把我設(shè)置為了受信任的證書發(fā)布機(jī)構(gòu)。現(xiàn)在如果有個小公司叫Wicrosoft 花了10塊錢讓我為他們公司申請了一個證書汹胃,并且公司慢慢壯大婶芭,證書的應(yīng)用范圍也越來越廣。然后有個奸商的公司JS Company想冒充Wicrosoft着饥,于是給了我¥10000犀农,讓我為他們頒布一個證書,但是證書的名字(Subject)要寫Wicrosoft宰掉,假如我為了這¥10000呵哨,真的把證書給了他們,那么他們以后就可以使用這個證書來冒充Wicrosoft了轨奄。

如果是一個優(yōu)秀的證書發(fā)布機(jī)構(gòu)孟害,比如你要向他申請一個名字叫Wicrosoft的證書,它會讓你提供很多資料證明你確實(shí)可以代表Wicrosoft這個公司戚绕,也就是說他回去核實(shí)你的身份纹坐。證書發(fā)布機(jī)構(gòu)是要為他發(fā)布出的證書負(fù)法律責(zé)任的。

到這里,你可能會想耘子,TMD果漾,那我們自己就不能發(fā)布證書嗎?就一定要花錢去申請谷誓?當(dāng)然不是绒障,我們自己也可以成立證書發(fā)布機(jī)構(gòu),但是需要通過一些安全認(rèn)證等等捍歪,只是有點(diǎn)麻煩户辱。另外,如果數(shù)字證書只是要在公司內(nèi)部使用糙臼,公司可以自己給自己生成一個證書庐镐,在公司的所有機(jī)器上把這個證書設(shè)置為操作系統(tǒng)信任的證書發(fā)布機(jī)構(gòu)的證書(這句話仔細(xì)看清楚,有點(diǎn)繞口)变逃,這樣以后公司發(fā)布的證書在公司內(nèi)部的所有機(jī)器上就可以通過驗(yàn)證了(在發(fā)布證書時必逆,把這些證書的Issuer(發(fā)布機(jī)構(gòu))設(shè)置為我們自己的證書發(fā)布機(jī)構(gòu)的證書的Subject(主題)就可以了)。但是這只限于內(nèi)部應(yīng)用揽乱,因?yàn)橹挥形覀児咀约旱臋C(jī)器上設(shè)置了信任我們自己這個所謂的證書發(fā)布機(jī)構(gòu)名眉,而其它機(jī)器上并沒有事先信任我們這個證書發(fā)布機(jī)構(gòu),所以在其它機(jī)器上凰棉,我們發(fā)布的證書就無法通過安全驗(yàn)證损拢。

4 在windows中對數(shù)字證書進(jìn)行管理

4.1 查看、刪除撒犀、安裝 數(shù)字證書

我們在上一章中說到了福压,我們的操作系統(tǒng)中會預(yù)先安裝好一些證書發(fā)布機(jī)構(gòu)的證書,我們看下在windows中如何找到這些證書绘证,步驟如下:

1)開始菜單->運(yùn)行隧膏,輸入mmc哗讥,回車

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

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

4)在彈出的對對話框中選擇 certificates 后點(diǎn)擊 Add 按鈕

具體的步驟如下圖所示:

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

My user account

Service account

Computer account

可以選擇第一或者第三個選項(xiàng)杆煞,用來查看當(dāng)前用戶的證書或整個計算里面安裝的證書魏宽。我們這里就默認(rèn)選擇第一個,平時一般安裝證書的時候都會給所有用戶安裝决乎,所以選擇第一個和第三個選項(xiàng)看到的證書會差不多队询。我們在左邊的導(dǎo)航樹中選中受信任的證書發(fā)布機(jī)構(gòu)(Trusted Root Certificate Authorities),然后點(diǎn)擊下面的證書(Certificates)构诚,在右邊的區(qū)域中就可以看到所有的受信任的證書發(fā)布機(jī)構(gòu)的證書蚌斩。

trustedcaAuth

注意上面的圖片中,右邊我們選中的這個證書發(fā)布機(jī)構(gòu)"SecureTrust CA"范嘱,我們前面在第3章3.2節(jié)中舉例子的時候送膳,就是去向這個證書發(fā)布機(jī)構(gòu)申請的證書员魏,由于我們申請的證書是這個機(jī)構(gòu)發(fā)布的,所以應(yīng)用程序在檢查我們的證書的發(fā)布機(jī)構(gòu)時(會檢查我們證書的簽名叠聋,確認(rèn)是該機(jī)構(gòu)發(fā)布的證書)撕阎,就會發(fā)現(xiàn)是可以信任的證書發(fā)布機(jī)構(gòu),從而就會相信我們證書的真實(shí)性碌补。

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

數(shù)字證書的安裝也比較簡單厦章,直接雙擊數(shù)字證書文件镇匀,會打開數(shù)字證書,對話框下面會有一個Install Certificate按鈕袜啃,點(diǎn)擊后就可以根據(jù)向?qū)нM(jìn)行安裝坑律,如下圖所示:

installCertificate

這個證書是我自己生成的測試證書,在證書的導(dǎo)入向?qū)Ю锩婺抑瑁鼤屇氵x擇導(dǎo)入到什么位置晃择,如果是一個我們自己信任的證書發(fā)布機(jī)構(gòu)自己的證書,只要導(dǎo)入到Certificate Authorities就可以了也物。Trusted Root Certificate Authorities, Intermediate Certification Authorities, Third-Party Root Certification Authorities 都是可以的宫屠,他們只是對證書的發(fā)布機(jī)構(gòu)做了一個分類,還有一些其它的證書類型滑蚯,例如Personal(個人證書)等等浪蹂,具體就不介紹了。安裝的時候一般來說可以用默認(rèn)的選擇項(xiàng)一直"下一步"到底告材。

4.2 如何自己創(chuàng)建證書

每個證書發(fā)布機(jī)構(gòu)都有自己的用來創(chuàng)建證書的工具坤次,當(dāng)然,具體他們怎么去創(chuàng)建一個證書的我也不太清楚斥赋,不同類型的證書都有一定的格式和規(guī)范缰猴,我沒有仔細(xì)去研究過這部分內(nèi)容。 微軟為我們提供了一個用來創(chuàng)建證書的工具makecert.exe疤剑,在安裝Visual Studio的時候會安裝上滑绒。如果沒有安裝也無所謂,可以上網(wǎng)去下一個隘膘,搜索makecert就可以了疑故。可以直接從我的博客下載弯菊,這是鏈接纵势。

向一些正規(guī)的證書發(fā)布機(jī)構(gòu)申請證書一般是要收費(fèi)的(因?yàn)閯e人要花時間檢查你的身份,確認(rèn)有沒有同名的證書等等),這里我們看下如何自己創(chuàng)建一個證書钦铁,為后面在IIS中配置Https做準(zhǔn)備扫茅。

我們用到的是makecert這個工具,微軟有很詳細(xì)的使用幫助育瓜,我這里只做一個簡單的解釋葫隙,詳細(xì)的各種參數(shù)和使用方法請查看MSDN的makecert的幫助。但是里面有些參數(shù)說得不夠清楚躏仇,而且還有遺漏的恋脚,可以參看我后面的解釋作為一個補(bǔ)充。

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

makecert.exe test.cer

上面的命令會在makecert.exe所在的目錄生成一個證書文件test.cer的數(shù)字證書文件焰手≡忝瑁可以雙擊證書打開,看看證書的內(nèi)容如下:

testCertificate1

證書的發(fā)布機(jī)構(gòu)是"Root Agency"书妻,證書的主題(證書發(fā)布給誰)是"Joe’s-Software-Emporium"船响,因?yàn)槲覀儧]有指定把證書發(fā)布給誰,makecert自己給我們隨便生成了一個公司的名字躲履。另外還指定了公鑰见间、簽名算法(用來解密簽名)、指紋和指紋算法等工猜。

注意米诉,因?yàn)檫@個證書是由微軟的工具生成的,嚴(yán)格來說它沒什么發(fā)布機(jī)構(gòu)篷帅,所以微軟虛擬了一個叫做"Root Agency"的發(fā)布機(jī)構(gòu)史侣,默認(rèn)情況下,windows里面安裝了這個所謂的證書發(fā)布機(jī)構(gòu)的證書魏身,但是這證書默認(rèn)情況下不是受信任的惊橱,原因很簡單,這樣做大家都可以用makecert來制作合法的數(shù)字證書了箭昵。如果我們自己硬是要税朴,也可以把它設(shè)置為受信任的。

下面我們看下其它的參數(shù)宙枷,比如我們要給網(wǎng)站www.jefferysun.com生成一個證書MyCA.cer掉房,假設(shè)我們把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的常用參數(shù)的意思:

-n指定主題的名字慰丛,這個是有固定的格式的, CN=主題名字 瘾杭,CN應(yīng)該是Certificate Name的縮寫诅病。我這里的主題的名字就是我們的IIS所在機(jī)器的IP。這里可以指定一些主題的其它附加信息,例如 O= *** 表示組織信息等等贤笆。

-r創(chuàng)建自簽署證書蝇棉,意思就是說在生成證書時,將證書的發(fā)布機(jī)構(gòu)設(shè)置為自己芥永。

-pe將所生成的私鑰標(biāo)記為可導(dǎo)出篡殷。注意,服務(wù)器發(fā)送證書給客戶端的時候埋涧,客戶端只能從證書里面獲取公鑰板辽,私鑰是無法獲取的。如果我們指定了這個參數(shù)棘催,證書在安裝在機(jī)器上后劲弦,我們還可以從證書中導(dǎo)出私鑰,默認(rèn)情況下是不能導(dǎo)出私鑰的醇坝。正規(guī)的途徑發(fā)布的證書邑跪,是不可能讓你導(dǎo)出私鑰的。

-b –e證書的有效期

-ss證書的存儲名稱呼猪,就是windows證書存儲區(qū)的目錄名画畅,如果不存在在的話就創(chuàng)建一個。

-sr證書的存儲位置宋距,只有currentuser(默認(rèn)值)或 localmachine兩個值夜赵。

-sv指定保存私鑰的文件,文件里面除了包含私鑰外乡革,其實(shí)也包含了證書寇僧。這個文件是需要保密的,這個文件在服務(wù)端配置時是需要用到的沸版。

這個CN=10.30.146.206要與自己的服務(wù)器相對應(yīng)嘁傀,要不然在配置HTTPS的時候會出現(xiàn)錯誤

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

-in指定證書發(fā)布機(jī)構(gòu)的名稱

-len這個參數(shù)在中文的幫助文檔中好像沒有提到,但是這個其實(shí)很重要蕾殴,用于指定公鑰的位數(shù)笑撞,越大越安全,默認(rèn)值是1024钓觉,推薦2048茴肥。我試了下,這個不為1024的倍數(shù)也是可以的荡灾。

生成證書后可以進(jìn)行安裝瓤狐,安裝過程可以參看4.1節(jié)瞬铸。

SSH登錄方式2017/02/21補(bǔ)充例子

SSH登錄方式主要分為兩種:

用戶名密碼驗(yàn)證方式

828019-20170104111525691-1181039165.png

說明:

(1) 當(dāng)客戶端發(fā)起ssh請求,服務(wù)器會把自己的公鑰發(fā)送給用戶础锐;

(2) 用戶會根據(jù)服務(wù)器發(fā)來的公鑰對密碼進(jìn)行加密嗓节;

(3) 加密后的信息回傳給服務(wù)器,服務(wù)器用自己的私鑰解密皆警,如果密碼正確拦宣,則用戶登錄成功。

基于密鑰的登錄方式

說明:

(1) 首先在客戶端生成一對密鑰(ssh-keygen)信姓;

(2) 并將客戶端的公鑰ssh-copy-id 拷貝到服務(wù)端鸵隧;

(3) 當(dāng)客戶端再次發(fā)送一個連接請求,包括ip财破、用戶名掰派;

(4) 服務(wù)端得到客戶端的請求后,會到authorized_keys中查找左痢,如果有響應(yīng)的IP和用戶靡羡,就會隨機(jī)生成一個字符串,例如:qwer俊性;

(5) 服務(wù)端將使用客戶端拷貝過來的公鑰進(jìn)行加密略步,然后發(fā)送給客戶端;

(6) 得到服務(wù)端發(fā)來的消息后定页,客戶端會使用私鑰進(jìn)行解密趟薄,然后將解密后的字符串發(fā)送給服務(wù)端;

(7) 服務(wù)端接受到客戶端發(fā)來的字符串后典徊,跟之前的字符串進(jìn)行對比杭煎,如果一致,就允許免密碼登錄卒落。

自建CA 為服務(wù)器部署https(轉(zhuǎn)載)

生成密鑰羡铲、證書

第一步,為服務(wù)器端和客戶端準(zhǔn)備公鑰儡毕、私鑰

# 生成服務(wù)器端私鑰openssl genrsa -outserver.key1024# 生成服務(wù)器端公鑰openssl rsa -inserver.key -pubout -outserver.pem# 生成客戶端私鑰openssl genrsa -outclient.key1024# 生成客戶端公鑰openssl rsa -inclient.key -pubout -outclient.pem

第二步也切,生成 CA 證書

# 生成CA私鑰opensslgenrsa-outca.key1024#X.509CertificateSigningRequest(CSR)Management.opensslreq-new-keyca.key-outca.csr#X.509CertificateDataManagement.opensslx509-req-inca.csr-signkeyca.key-outca.crt

在執(zhí)行第二步時會出現(xiàn):

?? keys? openssl req -new -key ca.key -out ca.csrYou are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Nameora DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter'.', the field will be left blank.Country Name (2letter code) [AU]:CNStateorProvince Name (full name) [Some-State]:ZhejiangLocality Name (eg, city) []:HangzhouOrganization Name (eg, company) [Internet Widgits Pty Ltd]:MyCAOrganizational Unit Name (eg, section) []:Common Name (e.g. server FQDNorYOUR name) []:localhostEmail Address []:

注意,這里的 Organization Name (eg, company) [Internet Widgits Pty Ltd]: 后面生成客戶端和服務(wù)器端證書的時候也需要填寫腰湾,不要寫成一樣的@资选!费坊!可以隨意寫如:My CA, My Server, My Client倒槐。

然后 Common Name (e.g. server FQDN or YOUR name) []: 這一項(xiàng),是最后可以訪問的域名葵萎,我這里為了方便測試导犹,寫成 localhost唱凯,如果是為了給我的網(wǎng)站生成證書羡忘,需要寫成 barretlee.com谎痢。

第三步,生成服務(wù)器端證書和客戶端證書

# 服務(wù)器端需要向 CA 機(jī)構(gòu)申請簽名證書卷雕,在申請簽名證書之前依然是創(chuàng)建自己的 CSR 文件openssl req -new -key server.key -outserver.csr# 向自己的 CA 機(jī)構(gòu)申請證書节猿,簽名過程需要 CA 的證書和私鑰參與,最終頒發(fā)一個帶有 CA 簽名的證書openssl x509 -req -CA ca.crt -CAkeyca.key -CAcreateserial-inserver.csr -outserver.crt# client 端openssl req -new -key client.key -outclient.csr# client 端到 CA 簽名openssl x509 -req -CA ca.crt -CAkeyca.key -CAcreateserial-inclient.csr -outclient.crt

如果你對計算機(jī)底層同樣感興趣漫雕,不妨讀讀字符編碼演變史一文滨嘱。

作者:NinthDay

鏈接:http://www.reibang.com/p/671ebeddcf60

來源:簡書

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)浸间,非商業(yè)轉(zhuǎn)載請注明出處太雨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市魁蒜,隨后出現(xiàn)的幾起案子囊扳,更是在濱河造成了極大的恐慌,老刑警劉巖兜看,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锥咸,死亡現(xiàn)場離奇詭異,居然都是意外死亡细移,警方通過查閱死者的電腦和手機(jī)搏予,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弧轧,“玉大人雪侥,你說我怎么就攤上這事【铮” “怎么了速缨?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捺典。 經(jīng)常有香客問我鸟廓,道長,這世上最難降的妖魔是什么襟己? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任引谜,我火速辦了婚禮,結(jié)果婚禮上擎浴,老公的妹妹穿的比我還像新娘员咽。我一直安慰自己,他們只是感情好贮预,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布贝室。 她就那樣靜靜地躺著契讲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滑频。 梳的紋絲不亂的頭發(fā)上捡偏,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音峡迷,去河邊找鬼银伟。 笑死,一個胖子當(dāng)著我的面吹牛绘搞,可吹牛的內(nèi)容都是我干的彤避。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼夯辖,長吁一口氣:“原來是場噩夢啊……” “哼琉预!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒿褂,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤圆米,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贮缅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榨咐,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年谴供,在試婚紗的時候發(fā)現(xiàn)自己被綠了块茁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡桂肌,死狀恐怖数焊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情崎场,我是刑警寧澤佩耳,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站谭跨,受9級特大地震影響干厚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜螃宙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一蛮瞄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谆扎,春花似錦挂捅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽状土。三九已至,卻和暖如春伺糠,著一層夾襖步出監(jiān)牢的瞬間蒙谓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工退盯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彼乌,地道東北人泻肯。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓渊迁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灶挟。 傳聞我的和親對象是個殘疾皇子琉朽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容