原文地址: 不詳
文中首先解釋了加密解密的一些基礎知識和概念捶障,然后通過一個加密通信過程的例子說明了加密算法
的作用僧须,以及數(shù)字證書的出現(xiàn)所起的作用。接著對數(shù)字證書做一個詳細的解釋项炼,并討論一下windows中數(shù)字證書的管理担平,最后演示使用makecert生成數(shù)字證書。如果發(fā)現(xiàn)文中有錯誤的地方锭部,或者有什么地方說得不夠清楚暂论,歡迎指出!
1空免、基礎知識
這部分內(nèi)容主要解釋一些概念和術語,最好是先理解這部分內(nèi)容盆耽。
1.1蹋砚、公鑰密碼體制(public-key cryptography)
公鑰密碼體制分為三個部分扼菠,公鑰、私鑰坝咐、加密解密算法循榆,它的加密解密過程如下:
- 加密:通過加密算法和公鑰對內(nèi)容(或者說明文)進行加密,得到密文墨坚。加密過程需要用到公鑰秧饮。
- 解密:通過解密算法和私鑰對密文進行解密,得到明文泽篮。解密過程需要用到解密算法和私鑰盗尸。
注意,由公鑰加密的內(nèi)容帽撑,只能由私鑰進行解密泼各,也就是說,由公鑰加密的內(nèi)容亏拉,如果不知道私鑰扣蜻,是無法解密的。
公鑰密碼體制的公鑰和算法都是公開的(這是為什么叫公鑰密碼體制的原因)及塘,私鑰是保密的莽使。大家都以使用公鑰進行加密,但是只有私鑰的持有者才能解密笙僚。在實際的使用中芳肌,有需要的人會生成一對公鑰和私鑰,把公鑰發(fā)布出去給別人使用味咳,自己保留私鑰庇勃。
1.2、對稱加密算法(symmetric key algorithms)
在對稱加密算法中槽驶,加密使用的密鑰和解密使用的密鑰是相同的责嚷。也就是說,加密和解密都是使用的同一個密鑰掂铐。因此對稱加密算法要保證安全性的話罕拂,密鑰要做好保密,只能讓使用的人知道全陨,不能對外公開爆班。這個和上面的公鑰密碼體制有所不同,公鑰密碼體制中加密是用公鑰辱姨,解密使用私鑰柿菩,而對稱加密算法中,加密和解密都是使用同一個密鑰雨涛,不區(qū)分公鑰和私鑰枢舶。
// 密鑰懦胞,一般就是一個字符串或數(shù)字,在加密或者解密時傳遞給加密/解密算法凉泄。前面在公鑰密碼體制中說到的公鑰躏尉、私鑰就是密鑰,公鑰是加密使用的密鑰后众,私鑰是解密使用的密鑰胀糜。
1.3、非對稱加密算法(asymmetric key algorithms)
在非對稱加密算法中蒂誉,加密使用的密鑰和解密使用的密鑰是不相同的教藻。前面所說的公鑰密碼體制就是一種非對稱加密算法,他的公鑰和是私鑰是不能相同的拗盒,也就是說加密使用的密鑰和解密使用的密鑰不同怖竭,因此它是一個非對稱加密算法。
1.4陡蝇、RSA簡介
RSA是一種公鑰密碼體制痊臭,現(xiàn)在使用得很廣泛。如果對RSA本身有興趣的登夫,后面看我有沒有時間寫個RSA的具體介紹广匙。
RSA密碼體制是一種公鑰密碼體制,公鑰公開恼策,私鑰保密鸦致,它的加密解密算法是公開的。 由公鑰加密的內(nèi)容可以并且只能由私鑰進行解密涣楷,并且由私鑰加密的內(nèi)容可以并且只能由公鑰進行解密分唾。也就是說,RSA的這一對公鑰狮斗、私鑰都可以用來加密和解密绽乔,并且一方加密的內(nèi)容可以由并且只能由對方進行解密
。
1.5碳褒、簽名和加密
我們說加密折砸,是指對某個內(nèi)容加密,加密后的內(nèi)容還可以通過解密進行還原沙峻。 比如我們把一封郵件進行加密睦授,加密后的內(nèi)容在網(wǎng)絡上進行傳輸,接收者在收到后摔寨,通過解密可以還原郵件的真實內(nèi)容去枷。
這里主要解釋一下簽名,簽名就是在信息的后面再加上一段內(nèi)容,可以證明信息沒有被修改過删顶,怎么樣可以達到這個效果呢疗隶?一般是對信息做一個hash計算得到一個hash值,注意翼闹,這個過程是不可逆
的,也就是說無法通過hash值得出原來的信息內(nèi)容蒋纬。在把信息發(fā)送出去時猎荠,把這個hash值加密后做為一個簽名和信息一起發(fā)出去。 接收方在收到信息后蜀备,會重新計算信息的hash值关摇,并和信息所附帶的hash值(解密后)進行對比,如果一致碾阁,就說明信息的內(nèi)容沒有被修改過输虱,因為這里hash計算可以保證不同的內(nèi)容一定會得到不同的hash值
,所以只要內(nèi)容一被修改脂凶,根據(jù)信息內(nèi)容計算的hash值就會變化宪睹。當然,不懷好意的人也可以修改**信息內(nèi)容的同時也修改hash值蚕钦,從而讓它們可以相匹配亭病,為了防止這種情況,hash值一般都會加密后(也就是簽名)再和信息一起發(fā)送嘶居,以保證這個hash值不被修改罪帖。至于如何讓別人可以解密這個簽名,這個過程涉及到數(shù)字證書等概念邮屁,我們后面在說到數(shù)字證書時再詳細說明整袁,這里您先只需先理解簽名的這個概念。
2佑吝、一個加密通信過程的演化
我們來看一個例子坐昙,現(xiàn)在假設“服務器”和“客戶”要在網(wǎng)絡上通信,并且他們打算使用RSA(參看前面的RSA簡介)來對通信進行加密以保證談話內(nèi)容的安全迹蛤。由于是使用RSA這種公鑰密碼體制民珍,“服務器”需要對外發(fā)布公鑰(算法不需要公布,RSA的算法大家都知道)盗飒,自己留著私鑰嚷量。“客戶”通過某些途徑拿到了“服務器”發(fā)布的公鑰逆趣,客戶并不知道私鑰蝶溶。“客戶”具體是通過什么途徑獲取公鑰的,我們后面再來說明抖所,下面看一下雙方如何進行保密的通信:
2.1 第一回合:
“客戶”->“服務器”:你好
“服務器”->“客戶”:你好梨州,我是服務器
“客戶”->“服務器”:?田轧?暴匠??
因為消息是在網(wǎng)絡上傳輸?shù)纳嫡常腥丝梢悦俺渥约菏恰胺掌鳌眮硐蚩蛻舭l(fā)送信息每窖。例如上面的消息可以被黑客截獲如下:
“客戶”->“服務器”:你好
“服務器”->“客戶”:你好,我是服務器
“客戶”->“黑客”:你好 // 黑客在“客戶”和“服務器”之間的某個路由器上截獲“客戶”發(fā)給服務器的信息弦悉,然后自己冒充“服務器”
“黑客”->“客戶”:你好窒典,我是服務器
因此“客戶”在接到消息后,并不能肯定這個消息就是由“服務器”發(fā)出的稽莉,某些“黑客”也可以冒充“服務器”發(fā)出這個消息瀑志。如何確定信息是由“服務器”發(fā)過來的呢?有一個解決方法污秆,因為只有服務器有私鑰劈猪,所以如果只要能夠確認對方有私鑰,那么對方就是“服務器”良拼。因此通信過程可以改進為如下:
2.2 第二回合:
“客戶”->“服務器”:你好
“服務器”->“客戶”:你好岸霹,我是服務器
“客戶”->“服務器”:向我證明你就是服務器
“服務器”->“客戶”:你好,我是服務器 {你好将饺,我是服務器}[私鑰|RSA]
// 注意這里約定一下贡避,{} 表示RSA加密后的內(nèi)容,[ | ]表示用什么密鑰和算法進行加密予弧,后面的示例中都用這種表示方式刮吧,例如上面的 {你好,我是服務器}[私鑰|RSA] 就表示用私鑰對“你好掖蛤,我是服務器”進行加密后的結果杀捻。
為了向“客戶”證明自己是“服務器”舍咖, “服務器”把一個字符串用自己的私鑰加密麻削,把明文和加密后的密文一起發(fā)給“客戶”。對于這里的例子來說顿锰,就是把字符串 “你好器赞,我是服務器”和這個字符串用私鑰加密后的內(nèi)容 {你好垢袱,我是服務器}[私鑰|RSA] 發(fā)給客戶。
“客戶”收到信息后港柜,她用自己持有的公鑰解密密文请契,和明文進行對比咳榜,如果一致,說明信息的確是由服務器發(fā)過來的爽锥。也就是說“客戶”把這個內(nèi)容用公鑰進行解密,然后和對比臣樱。因為由“服務器”用私鑰加密后的內(nèi)容,公鑰進行解密腮考,私鑰只有“服務器”持有擎淤,所以如果解密出來的內(nèi)容是能夠對得上的,那說明信息一定是從“服務器”發(fā)過來的秸仙。
假設“黑客”想冒充“服務器”:
**“黑客”->“客戶”:你好,我是服務器**
**“客戶”->“黑客”:向我證明你就是服務器**
//這里黑客無法冒充桩盲,因為他不知道**私鑰**寂纪,無法用**私鑰**加密某個字符串后發(fā)送給客戶去驗證。
**“黑客”->“客戶”:你好赌结,我是服務器 {你好捞蛋,我是服務器}[?柬姚?拟杉?|RSA]**
“客戶”->“黑客”:?量承?搬设??
由于“黑客”沒有“服務器”的私鑰撕捍,因此它發(fā)送過去的內(nèi)容拿穴,“客戶”是無法通過服務器的公鑰解密的,因此可以認定對方是個冒牌貨忧风!
到這里為止默色,“客戶”就可以確認“服務器”的身份了,可以放心和“服務器”進行通信狮腿,但是這里有一個問題腿宰,通信的內(nèi)容在網(wǎng)絡上還是無法保密。為什么無法保密呢缘厢?通信過程不是可以用公鑰吃度、私鑰加密嗎?其實用RSA的私鑰和公鑰是不行的贴硫,我們來具體分析下過程规肴,看下面的演示:
2.3 第三回合:
“客戶”->“服務器”:你好
“服務器”->“客戶”:你好,我是服務器
“客戶”->“服務器”:向我證明你就是服務器
“服務器”->“客戶”:你好,我是服務器 {你好拖刃,我是服務器}[私鑰|RSA]
“客戶”->“服務器”:{我的帳號是aaa删壮,密碼是123,把我的余額的信息發(fā)給我看看}[公鑰|RSA]
“服務器”->“客戶”:{你的余額是100元}[私鑰|RSA]
注意上面的的信息 {你的余額是100元}[私鑰]兑牡,這個是“服務器”用私鑰加密后的內(nèi)容央碟,但是我們之前說了,公鑰是發(fā)布出去的均函,因此所有的人都知道公鑰亿虽,所以除了“客戶”,其它的人也可以用公鑰對{你的余額是100元}[私鑰]進行解密苞也。所以如果“服務器”用私鑰加密發(fā)給“客戶”洛勉,這個信息是無法保密的,因為只要有公鑰就可以解密這內(nèi)容如迟。然而“服務器”也不能用公鑰對發(fā)送的內(nèi)容進行加密收毫,因為“客戶”沒有私鑰,發(fā)送個“客戶”也解密不了殷勘。
這樣問題就又來了此再,那又如何解決呢?在實際的應用過程玲销,一般是通過引入對稱加密來解決這個問題输拇,看下面的演示:
2.4 第四回合:
“客戶”->“服務器”:你好
“服務器”->“客戶”:你好,我是服務器
“客戶”->“服務器”:向我證明你就是服務器
“服務器”->“客戶”:你好贤斜,我是服務器 {你好策吠,我是服務器}[私鑰|RSA]
//藍色字體的部分是對稱加密的算法和密鑰的具體內(nèi)容,客戶把它們發(fā)送給服務器瘩绒。
“客戶”->“服務器”:{我們后面的通信過程奴曙,用對稱加密來進行,這里是對稱加密算法和密鑰}[公鑰|RSA]
“服務器”->“客戶”:{OK草讶,收到洽糟!}[密鑰|對稱加密算法]
“客戶”->“服務器”:{我的帳號是aaa,密碼是123堕战,把我的余額的信息發(fā)給我看看}[密鑰|對稱加密算法]
“服務器”->“客戶”:{你的余額是100元}[密鑰|對稱加密算法]
在上面的通信過程中坤溃,“客戶”在確認了“服務器”的身份后,“客戶”自己選擇一個對稱加密算法和一個密鑰嘱丢,把這個對稱加密算法和密鑰一起用公鑰加密后發(fā)送給“服務器”薪介。注意,由于對稱加密算法和密鑰是用公鑰加密的越驻,就算這個加密后的內(nèi)容被“黑客”截獲了汁政,由于沒有私鑰道偷,“黑客”也無從知道對稱加密算法和密鑰的內(nèi)容。
由于是用公鑰加密的记劈,只有私鑰能夠解密勺鸦,這樣就可以保證只有服務器可以知道對稱加密算法和密鑰,而其它人不可能知道(這個對稱加密算法和密鑰是“客戶”自己選擇的目木,所以“客戶”自己當然知道如何解密加密)换途。這樣“服務器”和“客戶”就可以用對稱加密算法和密鑰來加密通信的內(nèi)容了。
總結一下刽射,RSA加密算法在這個通信過程中所起到的作用主要有兩個:
如果這里您理解了為什么不用RSA去加密通信過程,而是要再確定一個對稱加密算法來保證通信過程的安全摹恰,那么就說明前面的內(nèi)容您已經(jīng)理解了辫继。(如果不清楚,再看下2.3和2.4戒祠,如果還是不清楚,那應該是我們說清楚速种,您可以留言提問姜盈。)
到這里,“客戶”就可以確認“服務器”的身份配阵,并且雙方的通信內(nèi)容可以進行加密馏颂,其他人就算截獲了通信內(nèi)容,也無法解密棋傍。的確救拉,好像通信的過程是比較安全了。
但是這里還留有一個問題瘫拣,在最開始我們就說過亿絮,“服務器”要對外發(fā)布公鑰,那“服務器”如何把公鑰發(fā)送給“客戶”呢麸拄?我們第一反應可能會想到以下的兩個方法:
a)把公鑰放到互聯(lián)網(wǎng)的某個地方的一個下載地址派昧,事先給“客戶”去下載。
b)每次和“客戶”開始通信時拢切,“服務器”把公鑰發(fā)給“客戶”蒂萎。
但是這個兩個方法都有一定的問題,
對于a)方法淮椰,“客戶”無法確定這個下載地址是不是“服務器”發(fā)布的五慈,你憑什么就相信這個地址下載的東西就是“服務器”發(fā)布的而不是別人偽造的呢纳寂,萬一下載到一個假的怎么辦?另外要所有的“客戶”都在通信前事先去下載公鑰也很不現(xiàn)實泻拦。
對于b)方法毙芜,也有問題,因為任何人都可以自己生成一對公鑰和私鑰聪轿,他只要向“客戶”發(fā)送他自己的私鑰就可以冒充“服務器”了爷肝。示意如下:
//黑客截獲“客戶”發(fā)給“服務器”的消息
“客戶”->“黑客”:你好
//黑客自己生成一對公鑰和私鑰,把公鑰發(fā)給“客戶”陆错,自己保留私鑰
“黑客”->“客戶”:你好灯抛,我是服務器,這個是我的公鑰
“客戶”->“黑客”:向我證明你就是服務器
//客戶收到“黑客”用私鑰加密的信息后音瓷,是可以用“黑客”發(fā)給自己的公鑰解密的对嚼,從而會誤認為“黑客”是“服務器”
“黑客”->“客戶”:你好,我是服務器 {你好绳慎,我是服務器}[黑客自己的私鑰|RSA]
因此“黑客”只需要自己生成一對公鑰和私鑰纵竖,然后把公鑰發(fā)送給“客戶”,自己保留私鑰杏愤,這樣由于“客戶”可以用黑客的公鑰解密黑客的私鑰加密的內(nèi)容靡砌,“客戶”就會相信“黑客”是“服務器”,從而導致了安全問題珊楼。 如果能夠確定公鑰到底是誰的,就不會有這個問題了已慢。例如曲聂,如果收到“黑客”冒充“服務器”發(fā)過來的公鑰,經(jīng)過某種檢查佑惠,如果能夠發(fā)現(xiàn)這個公鑰不是“服務器”的就好了朋腋。
為了解決這個問題,數(shù)字證書出現(xiàn)了膜楷,它可以解決我們上面的問題乍丈。先大概看下什么是數(shù)字證書,一個證書包含下面的具體內(nèi)容:
- 證書的發(fā)布機構
- 證書的有效期
- 公鑰
- 證書所有者(Subject)
- 簽名所使用的算法
- 指紋以及指紋算法
證書的內(nèi)容的詳細解釋會在后面詳細解釋把将,這里先只需要搞清楚一點轻专,察蹲。也就是說请垛,我們拿到一個數(shù)字證書催训,我們可以判斷出這個數(shù)字證書到底是誰的。至于是如何判斷的宗收,后面會在詳細討論數(shù)字證書時詳細解釋÷茫現(xiàn)在把前面的通信過程使用數(shù)字證書修改為如下:
2.5 第五回合:
“客戶”->“服務器”:你好
“服務器”->“客戶”:你好,我是服務器混稽,這里是我的數(shù)字證書 //這里用證書代替了公鑰
“客戶”->“服務器”:向我證明你就是服務器
“服務器”->“客戶”:你好采驻,我是服務器 {你好,我是服務器}[私鑰|RSA]
注意匈勋,上面第二次通信礼旅,“服務器”把自己的證書發(fā)給了“客戶”,而不是發(fā)送公鑰洽洁《幌担“客戶”可以根據(jù)證書校驗這個證書到底是不是“服務器”的,也就是能校驗這個證書的所有者是不是“服務器”饿自,從而確認這個證書中的公鑰的確是“服務器”的汰翠。后面的過程和以前是一樣,“客戶”讓“服務器”證明自己的身份昭雌,“服務器”用私鑰加密一段內(nèi)容連同明文一起發(fā)給“客戶”复唤,“客戶”把加密內(nèi)容用數(shù)字證書中的公鑰解密后和明文對比,如果一致烛卧,那么對方就確實是“服務器”佛纫,然后雙方協(xié)商一個對稱加密來保證通信過程的安全。到這里唱星,整個過程就完整了雳旅,我們回顧一下:
2.6 完整過程:
step1: “客戶”向服務端發(fā)送一個通信請求
“客戶”->“服務器”:你好
step2: “服務器”向客戶發(fā)送自己的數(shù)字證書跟磨。證書中有一個公鑰用來加密信息间聊,私鑰由“服務器”持有
“服務器”->“客戶”:你好,我是服務器抵拘,這里是我的數(shù)字證書
step3: “客戶”收到“服務器”的證書后哎榴,它會去驗證這個數(shù)字證書到底是不是“服務器”的,數(shù)字證書有沒有什么問題僵蛛,數(shù)字證書如果檢查沒有問題尚蝌,就說明數(shù)字證書中的公鑰確實是“服務器”的。檢查數(shù)字證書后充尉,“客戶”會發(fā)送一個隨機的字符串給“服務器”用私鑰去加密飘言,服務器把加密的結果返回給“客戶”,“客戶”用公鑰解密這個返回結果驼侠,如果解密結果與之前生成的隨機字符串一致姿鸿,那說明對方確實是私鑰的持有者谆吴,或者說對方確實是“服務器”。
//前面的例子中為了方便解釋苛预,用的是“你好”等內(nèi)容句狼,實際情況下一般是隨機生成的一個字符串。
“客戶”->“服務器”:向我證明你就是服務器热某,這是一個隨機字符串
“服務器”->“客戶”:{一個隨機字符串}[私鑰|RSA]
step4: 驗證“服務器”的身份后腻菇,“客戶”生成一個對稱加密算法和密鑰,用于后面的通信的加密和解密昔馋。這個對稱加密算法和密鑰筹吐,“客戶”會用公鑰加密后發(fā)送給“服務器”,別人截獲了也沒用绒极,因為只有“服務器”手中有可以解密的私鑰骏令。這樣,后面“服務器”和“客戶”就都可以用對稱加密算法來加密和解密通信內(nèi)容了垄提。
“服務器”->“客戶”:{OK榔袋,已經(jīng)收到你發(fā)來的對稱加密算法和密鑰!有什么可以幫到你的铡俐?}[密鑰|對稱加密算法]
“客戶”->“服務器”:{我的帳號是aaa凰兑,密碼是123,把我的余額的信息發(fā)給我看看}[密鑰|對稱加密算法]
“服務器”->“客戶”:{你好审丘,你的余額是100元}[密鑰|對稱加密算法]
…… //繼續(xù)其它的通信
2.7 其它問題:
上面的過程已經(jīng)十分接近HTTPS的真實通信過程了吏够,完全可以按照這個過程去理解HTTPS的工作原理。但是我為了方便解釋滩报,上面有些細節(jié)沒有說到锅知,有興趣的人可以看下這部分的內(nèi)容∨Ъ兀可以跳過不看售睹,無關緊要。
上面的通信過程中說到可训,在檢查完證書后昌妹,“客戶”發(fā)送一個隨機的字符串給“服務器”去用私鑰加密,以便判斷對方是否真的持有私鑰握截。但是有一個問題飞崖,“黑客”也可以發(fā)送一個字符串給“服務器”去加密并且得到加密后的內(nèi)容,這樣對于“服務器”來說是不安全的谨胞,因為黑客可以發(fā)送一些簡單的有規(guī)律的字符串給“服務器”加密固歪,從而尋找加密的規(guī)律,有可能威脅到私鑰的安全胯努。所以說牢裳,“服務器”隨隨便便用私鑰去加密一個來路不明的字符串并把結果發(fā)送給對方是不安全的术瓮。
每次收到“客戶”發(fā)來的要加密的的字符串時,“服務器”并不是真正的加密這個字符串本身贰健,而是把這個字符串進行一個hash計算胞四,加密這個字符串的hash值(不加密原來的字符串)后發(fā)送給“客戶”,“客戶”收到后解密這個hash值并自己計算字符串的hash值然后進行對比是否一致伶椿。也就是說辜伟,“服務器”不直接加密收到的字符串,而是加密這個字符串的一個hash值脊另,這樣就避免了加密那些有規(guī)律的字符串导狡,從而降低被破解的機率≠送矗“客戶”自己發(fā)送的字符串旱捧,因此它自己可以計算字符串的hash值,然后再把“服務器”發(fā)送過來的加密的hash值和自己計算的進行對比踩麦,同樣也能確定對方是否是“服務器”枚赡。
在雙方的通信過程中,“黑客”可以截獲發(fā)送的加密了的內(nèi)容谓谦,雖然他無法解密這個內(nèi)容贫橙,但是他可以搗亂,例如把信息原封不動的發(fā)送多次反粥,擾亂通信過程卢肃。
可以給通信的內(nèi)容加上一個序號或者一個隨機的值,如果“客戶”或者“服務器”接收到的信息中有之前出現(xiàn)過的序號或者隨機值才顿,那么說明有人在通信過程中重發(fā)信息內(nèi)容進行搗亂莫湘,雙方會立刻停止通信。有人可能會問郑气,如果有人一直這么搗亂怎么辦幅垮?那不是無法通信了? 答案是的確是這樣的竣贪,例如有人控制了你連接互聯(lián)網(wǎng)的路由器军洼,他的確可以針對你巩螃。但是一些重要的應用演怎,例如軍隊或者政府的內(nèi)部網(wǎng)絡,它們都不使用我們平時使用的公網(wǎng)避乏,因此一般人不會破壞到他們的通信爷耀。
在雙方的通信過程中,“黑客”除了簡單的重復發(fā)送截獲的消息之外拍皮,還可以修改截獲后的密文修改后再發(fā)送歹叮,因為修改的是密文跑杭,雖然不能完全控制消息解密后的內(nèi)容,但是仍然會破壞解密后的密文咆耿。因此發(fā)送過程如果黑客對密文進行了修改德谅,“客戶”和“服務器”是無法判斷密文是否被修改的。雖然不一定能達到目的萨螺,但是“黑客”可以一直這樣碰碰運氣窄做。
在每次發(fā)送信息時,先對信息的內(nèi)容進行一個hash計算得出一個hash值慰技,將信息的內(nèi)容和這個hash值一起加密后發(fā)送椭盏。接收方在收到后進行解密得到明文的內(nèi)容和hash值,然后接收方再自己對收到信息內(nèi)容做一次hash計算吻商,與收到的hash值進行對比看是否匹配掏颊,如果匹配就說明信息在傳輸過程中沒有被修改過。如果不匹配說明中途有人故意對加密數(shù)據(jù)進行了修改艾帐,立刻中斷通話過程后做其它處理乌叶。
3. 證書的構成和原理
3.1 證書的構成和原理
之前已經(jīng)大概說了一個證書由什么構成,但是沒有仔細進行介紹柒爸,這里對證書的內(nèi)容做一個詳細的介紹枉昏。先看下一個證書到底是個什么東西,在windows下查看一個證書時揍鸟,界面是這樣的兄裂,我們主要關注一下Details Tab頁,其中的內(nèi)容比較長阳藻,我滾動內(nèi)容后后抓了三個圖晰奖,把完整的信息顯示出來:
里面的內(nèi)容比較多——Version、Serial number腥泥、Signature algorithm 等等匾南,挑幾個重要的解釋一下。
◆Issuer (證書的發(fā)布機構)
指出是什么機構發(fā)布的這個證書蛔外,也就是指明這個證書是哪個公司創(chuàng)建的(只是創(chuàng)建證書蛆楞,不是指證書的使用者)。對于上面的這個證書來說夹厌,就是指"SecureTrust CA"這個機構豹爹。
◆Valid from , Valid to (證書的有效期)
也就是證書的有效時間,或者說證書的使用期限矛纹。 過了有效期限臂聋,證書就會作廢,不能使用了。
◆Public key (公鑰)
這個我們在前面介紹公鑰密碼體制時介紹過孩等,公鑰是用來對消息進行加密的艾君,第2章的例子中經(jīng)常用到的。這個數(shù)字證書的公鑰是2048位的肄方,它的值可以在圖的中間的那個對話框中看得到冰垄,是很長的一串數(shù)字。
◆Subject (主題)
這個證書是發(fā)布給誰的权她,或者說證書的所有者播演,一般是某個人或者某個公司名稱、機構的名稱伴奥、公司網(wǎng)站的網(wǎng)址等写烤。 對于這里的證書來說,證書的所有者是Trustwave這個公司拾徙。
◆Signature algorithm (簽名所使用的算法)
就是指的這個數(shù)字證書的數(shù)字簽名所使用的加密算法洲炊,這樣就可以使用證書發(fā)布機構的證書里面的公鑰,根據(jù)這個算法對指紋進行解密尼啡。指紋的加密結果就是數(shù)字簽名(第1.5節(jié)中解釋過數(shù)字簽名)暂衡。
◆Thumbprint, Thumbprint algorithm (指紋以及指紋算法)
這個是用來保證證書的完整性的,也就是說確保證書沒有被修改過崖瞭,這東西的作用和2.7中說到的第3個問題類似狂巢。 其原理就是在發(fā)布證書時,發(fā)布者根據(jù)指紋算法(一個hash算法)計算整個證書的hash值(指紋)并和證書放在一起书聚,使用者在打開證書時唧领,自己也根據(jù)指紋算法計算一下證書的hash值(指紋),如果和剛開始的值對得上雌续,就說明證書沒有被修改過斩个,因為證書的內(nèi)容被修改后,根據(jù)證書的內(nèi)容計算的出的hash值(指紋)是會變化的驯杜。 注意受啥,這個指紋會使用"SecureTrust CA"這個證書機構的私鑰用簽名算法(Signature algorithm)加密后和證書放在一起。
注意鸽心,為了保證安全滚局,在證書的發(fā)布機構發(fā)布證書時,證書的指紋和指紋算法顽频,都會加密后再和證書放到一起發(fā)布藤肢,以防有人修改指紋后偽造相應的數(shù)字證書。這里問題又來了冲九,證書的指紋和指紋算法用什么加密呢谤草?他們是用證書發(fā)布機構的私鑰進行加密的≥杭椋可以用證書發(fā)布機構的公鑰對指紋和指紋算法解密丑孩,也就是說證書發(fā)布機構除了給別人發(fā)布證書外壹瘟,他自己本身也有自己的證書纫事。證書發(fā)布機構的證書是哪里來的呢岁经?碟摆?凌停?這個證書發(fā)布機構的數(shù)字證書(一般由他自己生成)在我們的操作系統(tǒng)剛安裝好時(例如windows xp等操作系統(tǒng))屯远,這些證書發(fā)布機構的數(shù)字證書就已經(jīng)被微軟(或者其它操作系統(tǒng)的開發(fā)機構)安裝在操作系統(tǒng)中了慰丛,微軟等公司會根據(jù)一些權威安全機構的評估選取一些信譽很好并且通過一定的安全認證的證書發(fā)布機構擎析,把這些證書發(fā)布機構的證書默認就安裝在操作系統(tǒng)里面了览妖,并且設置為操作系統(tǒng)信任的數(shù)字證書轧拄。這些證書發(fā)布機構自己持有與他自己的數(shù)字證書對應的私鑰,他會用這個私鑰加密所有他發(fā)布的證書的指紋作為數(shù)字簽名讽膏。
3.2 如何向證書的發(fā)布機構去申請證書
舉個例子方便大家理解檩电,假設我們公司"ABC Company"花了1000塊錢,向一個證書發(fā)布機構"SecureTrust CA"為我們自己的公司"ABC Company"申請了一張證書府树,注意俐末,這個證書發(fā)布機構"SecureTrust CA"是一個大家公認并被一些權威機構接受的證書發(fā)布機構,我們的操作系統(tǒng)里面已經(jīng)安裝了"SecureTrust CA"的證書奄侠。"SecureTrust CA"在給我們發(fā)布證書時卓箫,把Issuer,Public key,Subject,Valid from,Valid to等信息以明文的形式寫到證書里面,然后用一個指紋算法計算出這些數(shù)字證書內(nèi)容的一個指紋垄潮,并把指紋和指紋算法用自己的私鑰進行加密烹卒,然后和證書的內(nèi)容一起發(fā)布,同時"SecureTrust CA"還會給一個我們公司"ABC Company"的私鑰給到我們弯洗。我們花了1000塊錢買的這個證書的內(nèi)容如下:
//這個就是"SecureTrust CA"對這個證書的一個數(shù)字簽名甫题,表示這個證書確實是他發(fā)布的,有什么問題他會負責(收了我們1000塊涂召,出了問題肯定要負責任的)
我們"ABC Company"申請到這個證書后果正,我們把證書投入使用炎码,我們在通信過程開始時會把證書發(fā)給對方,對方如何檢查這個證書的確是合法的并且是我們"ABC Company"公司的證書呢秋泳?首先應用程序(對方通信用的程序潦闲,例如IE、OUTLook等)讀取證書中的Issuer(發(fā)布機構)為"SecureTrust CA" 迫皱,然后會在操作系統(tǒng)中受信任的發(fā)布機構的證書中去找"SecureTrust CA"的證書歉闰,如果找不到辖众,那說明證書的發(fā)布機構是個水貨發(fā)布機構,證書可能有問題和敬,程序會給出一個錯誤信息凹炸。 如果在系統(tǒng)中找到了"SecureTrust CA"的證書,那么應用程序就會從證書中取出"SecureTrust CA"的公鑰昼弟,然后對我們"ABC Company"公司的證書里面的指紋和指紋算法用這個公鑰進行解密啤它,然后使用這個指紋算法計算"ABC Company"證書的指紋,將這個計算的指紋與放在證書中的指紋對比舱痘,如果一致变骡,說明"ABC Company"的證書肯定沒有被修改過并且證書是"SecureTrust CA" 發(fā)布的,證書中的公鑰肯定是"ABC Company"的芭逝。
對方然后就可以放心的使用這個公鑰和我們"ABC Company"進行通信了塌碌。
3.3 證書的發(fā)布機構
前面已經(jīng)初步介紹了一下證書發(fā)布機構,這里再深入討論一下某弦。
其實所有的公司都可以發(fā)布證書桐汤,我們自己也可以去注冊一家公司來專門給別人發(fā)布證書。但是很明顯靶壮,我們自己的專門發(fā)布證書的公司是不會被那些國際上的權威機構認可的怔毛,人家怎么知道你是不是個狗屁皮包公司?因此微軟在它的操作系統(tǒng)中腾降,并不會信任我們這個證書發(fā)布機構拣度,當應用程序在檢查證書的合法信的時候,一看證書的發(fā)布機構并不是操作系統(tǒng)所信任的發(fā)布機構螃壤,就會拋出錯誤信息抗果。也就是說windows操作系統(tǒng)中不會預先安裝好我們這個證書發(fā)布機構的證書,不信任我們這個發(fā)布機構奸晴。
不受信任的證書發(fā)布機構的危害
為什么一個證書發(fā)布機構受不受信任這么重要冤馏?我們舉個例子。假設我們開了一個狗屁公司來為別人發(fā)布證書寄啼,并且我和微軟有一腿逮光,微軟在他們的操作系統(tǒng)中把我設置為了受信任的證書發(fā)布機構〈現(xiàn)在如果有個小公司叫Wicrosoft 花了10塊錢讓我為他們公司申請了一個證書,并且公司慢慢壯大涕刚,證書的應用范圍也越來越廣嗡综。然后有個奸商的公司JS Company想冒充Wicrosoft,于是給了我¥10000副女,讓我為他們頒布一個證書蛤高,但是證書的名字(Subject)要寫Wicrosoft蚣旱,假如我為了這¥10000碑幅,真的把證書給了他們,那么他們以后就可以使用這個證書來冒充Wicrosoft了塞绿。
如果是一個優(yōu)秀的證書發(fā)布機構沟涨,比如你要向他申請一個名字叫Wicrosoft的證書,它會讓你提供很多資料證明你確實可以代表Wicrosoft這個公司异吻,也就是說他回去核實你的身份裹赴。證書發(fā)布機構是要為他發(fā)布出的證書負法律責任的。
到這里诀浪,你可能會想棋返,TMD,那我們自己就不能發(fā)布證書嗎雷猪?就一定要花錢去申請睛竣?當然不是,我們自己也可以成立證書發(fā)布機構求摇,但是需要通過一些安全認證等等射沟,只是有點麻煩。另外与境,如果數(shù)字證書只是要在公司內(nèi)部使用验夯,公司可以自己給自己生成一個證書,在公司的所有機器上把這個證書設置為操作系統(tǒng)信任的證書發(fā)布機構的證書(這句話仔細看清楚摔刁,有點繞口)挥转,這樣以后公司發(fā)布的證書在公司內(nèi)部的所有機器上就可以通過驗證了(在發(fā)布證書時,把這些證書的Issuer(發(fā)布機構)設置為我們自己的證書發(fā)布機構的證書的Subject(主題)就可以了)共屈。但是這只限于內(nèi)部應用扁位,因為只有我們公司自己的機器上設置了信任我們自己這個所謂的證書發(fā)布機構,而其它機器上并沒有事先信任我們這個證書發(fā)布機構趁俊,所以在其它機器上域仇,我們發(fā)布的證書就無法通過安全驗證。
4. 在windows中對數(shù)字證書進行管理
4.1 查看寺擂、刪除暇务、安裝 數(shù)字證書
我們在上一章中說到了泼掠,我們的操作系統(tǒng)中會預先安裝好一些證書發(fā)布機構的證書,我們看下在windows中如何找到這些證書垦细,步驟如下:
1)開始菜單->運行择镇,輸入mmc,回車
2)在打開的窗口中選擇 File-> Add/Remove Snap-in…
3)然后在彈出的對話框的 Standalone Tab頁里面點擊 Add… 按鈕
4)在彈出的對對話框中選擇 certificates 后點擊 Add 按鈕
具體的步驟如下圖所示:
上面的步驟結束后括改,會又彈出一個對話框腻豌,里面有三個單選按鈕如下:
- My user account
- Service account
- Computer account
可以選擇第一或者第三個選項,用來查看當前用戶的證書或整個計算里面安裝的證書嘱能。我們這里就默認選擇第一個吝梅,平時一般安裝證書的時候都會給所有用戶安裝,所以選擇第一個和第三個選項看到的證書會差不多惹骂。我們在左邊的導航樹中選中受信任的證書發(fā)布機構(Trusted Root Certificate Authorities)苏携,然后點擊下面的證書(Certificates),在右邊的區(qū)域中就可以看到所有的受信任的證書發(fā)布機構的證書对粪。
注意上面的圖片中右冻,右邊我們選中的這個證書發(fā)布機構"SecureTrust CA",我們前面在第3章3.2節(jié)中舉例子的時候著拭,就是去向這個證書發(fā)布機構申請的證書纱扭,由于我們申請的證書是這個機構發(fā)布的,所以應用程序在檢查我們的證書的發(fā)布機構時(會檢查我們證書的簽名儡遮,確認是該機構發(fā)布的證書)乳蛾,就會發(fā)現(xiàn)是可以信任的證書發(fā)布機構,從而就會相信我們證書的真實性峦萎。
刪除數(shù)字證書很簡單屡久,直接在右邊的列表中右鍵然后刪除就可以了。
數(shù)字證書的安裝也比較簡單爱榔,直接雙擊數(shù)字證書文件被环,會打開數(shù)字證書,對話框下面會有一個Install Certificate按鈕详幽,點擊后就可以根據(jù)向導進行安裝筛欢,如下圖所示:
這個證書是我自己生成的測試證書,在證書的導入向導里面唇聘,它會讓你選擇導入到什么位置版姑,如果是一個我們自己信任的證書發(fā)布機構自己的證書,只要導入到Certificate Authorities就可以了迟郎。Trusted Root Certificate Authorities, Intermediate Certification Authorities, Third-Party Root Certification Authorities 都是可以的剥险,他們只是對證書的發(fā)布機構做了一個分類,還有一些其它的證書類型宪肖,例如Personal(個人證書)等等表制,具體就不介紹了健爬。安裝的時候一般來說可以用默認的選擇項一直"下一步"到底。
4.2 如何自己創(chuàng)建證書
每個證書發(fā)布機構都有自己的用來創(chuàng)建證書的工具么介,當然娜遵,具體他們怎么去創(chuàng)建一個證書的我也不太清楚,不同類型的證書都有一定的格式和規(guī)范壤短,我沒有仔細去研究過這部分內(nèi)容设拟。 微軟為我們提供了一個用來創(chuàng)建證書的工具makecert.exe,在安裝Visual Studio的時候會安裝上久脯。如果沒有安裝也無所謂纳胧,可以上網(wǎng)去下一個,搜索makecert就可以了桶现《阊牛可以直接從我的博客下載鼎姊,這是鏈接骡和。
向一些正規(guī)的證書發(fā)布機構申請證書一般是要收費的(因為別人要花時間檢查你的身份,確認有沒有同名的證書等等)相寇,這里我們看下如何自己創(chuàng)建一個證書慰于,為后面在IIS中配置Https做準備。
我們用到的是makecert這個工具唤衫,微軟有很詳細的使用幫助婆赠,我這里只做一個簡單的解釋,詳細的各種參數(shù)和使用方法請查看MSDN的makecert的幫助佳励。但是里面有些參數(shù)說得不夠清楚休里,而且還有遺漏的,可以參看我后面的解釋作為一個補充赃承。
先看下makecert最簡單的使用方式:
上面的命令會在makecert.exe所在的目錄生成一個證書文件test.cer的數(shù)字證書文件妙黍。可以雙擊證書打開瞧剖,看看證書的內(nèi)容如下:
證書的發(fā)布機構是"Root Agency"拭嫁,證書的主題(證書發(fā)布給誰)是"Joe’s-Software-Emporium",因為我們沒有指定把證書發(fā)布給誰抓于,makecert自己給我們隨便生成了一個公司的名字做粤。另外還指定了公鑰、簽名算法(用來解密簽名)捉撮、指紋和指紋算法等怕品。
,因為這個證書是由微軟的工具生成的巾遭,嚴格來說它沒什么發(fā)布機構肉康,所以微軟虛擬了一個叫做"Root Agency"的發(fā)布機構修己,默認情況下,windows里面安裝了這個所謂的證書發(fā)布機構的證書迎罗,但是這證書默認情況下不是受信任的睬愤,原因很簡單,這樣做大家都可以用makecert來制作合法的數(shù)字證書了纹安。如果我們自己硬是要尤辱,也可以把它設置為受信任的。
下面我們看下其它的參數(shù)厢岂,比如我們要給網(wǎng)站 www.jefferysun.com 生成一個證書MyCA.cer光督,假設我們把makecert.exe放在C:盤下,命令行如下:
解釋一下makecert的常用參數(shù)的意思:
-n 指定主題的名字塔粒,這個是有固定的格式的结借, CN=主題名字 ,CN應該是Certificate Name的縮寫卒茬。我這里的主題的名字就是我們的IIS所在機器的IP船老。這里可以指定一些主題的其它附加信息,例如 O= *** 表示組織信息等等圃酵。
-r 創(chuàng)建自簽署證書柳畔,意思就是說在生成證書時,將證書的發(fā)布機構設置為自己郭赐。
-pe 將所生成的私鑰標記為可導出薪韩。注意,服務器發(fā)送證書給客戶端的時候捌锭,客戶端只能從證書里面獲取公鑰俘陷,私鑰是無法獲取的。如果我們指定了這個參數(shù)观谦,證書在安裝在機器上后拉盾,我們還可以從證書中導出私鑰,默認情況下是不能導出私鑰的坎匿。正規(guī)的途徑發(fā)布的證書盾剩,是不可能讓你導出私鑰的。
-b –e 證書的有效期
-ss 證書的存儲名稱替蔬,就是windows證書存儲區(qū)的目錄名告私,如果不存在在的話就創(chuàng)建一個。
-sr 證書的存儲位置承桥,只有currentuser(默認值)或 localmachine兩個值驻粟。
-sv 指定保存私鑰的文件,文件里面除了包含私鑰外,其實也包含了證書蜀撑。這個文件是需要保密的挤巡,這個文件在服務端配置時是需要用到的。
這個CN=10.30.146.206要與自己的服務器相對應酷麦,要不然在配置HTTPS的時候會出現(xiàn)錯誤
-a 指定簽名算法矿卑,必須是md5或rsa1。(還記得簽名算法的作用不沃饶?可以看一下3章的第1節(jié)中關于簽名算法的介紹)
-in 指定證書發(fā)布機構的名稱
-len 這個參數(shù)在中文的幫助文檔中好像沒有提到母廷,但是這個其實很重要,用于指定公鑰的位數(shù)糊肤,越大越安全琴昆,默認值是1024,推薦2048馆揉。我試了下业舍,這個不為1024的倍數(shù)也是可以的。
生成證書后可以進行安裝升酣,安裝過程可以參看4.1節(jié)舷暮。