使用X.509數(shù)字證書加密解密實(shí)務(wù)(一)-- 證書的獲得和管理 - Focus on bi...
一、 獲得證書... 2
1、 從CA獲得... 2
2、 從windows2003證書服務(wù)中獲得... 2
3、 使用makecert工具獲得... 2
二、 證書的保存... 2
1、 保存在證書存儲(chǔ)區(qū)... 2
2、 以文件形式保存... 4
2.1. 帶有私鑰的證書... 4
2.2. 二進(jìn)制編碼的證書... 4
2.3. Base64編碼的證書... 4
3、 存儲(chǔ)區(qū)中的證書跟證書文件相互轉(zhuǎn)換... 4
3.1. 使用工具相互轉(zhuǎn)換... 4
3.1.1 從證書文件導(dǎo)入證書存儲(chǔ)區(qū)... 4
3.1.2 從證書存儲(chǔ)區(qū)導(dǎo)出為證書文件... 7
3.2. 使用代碼相互轉(zhuǎn)換... 10
3.2.1 從證書文件導(dǎo)入證書存儲(chǔ)區(qū)... 10
3.2.2 從證書存儲(chǔ)區(qū)導(dǎo)出為證書文件... 11
數(shù)字證書(也稱作數(shù)字證書)將身份綁定到一對(duì)可以用來(lái)加密和簽名數(shù)字信息的電子密鑰。數(shù)字證書能夠驗(yàn)證一個(gè)人使用給定密鑰的權(quán)利,這有助于防止有人利用假密鑰冒充其他用戶。數(shù)字證書與加密一起使用,可以提供一個(gè)更加完整的解決方案,確保交易中各方的身份。
CA獲得
如果是商業(yè)應(yīng)用最好從證書的簽發(fā)機(jī)構(gòu)CA獲得證書,比如VeriSign,這樣的大的CA簽發(fā)的證書已經(jīng)被一些系統(tǒng)默認(rèn)為可信任的證書簽發(fā)機(jī)構(gòu),它所簽發(fā)的證書也是被信任的。但是這樣的證書需要購(gòu)買。
如果不是商業(yè)應(yīng)用,這里推薦一個(gè)可以免費(fèi)申請(qǐng)證書的CA:
www.cacert.org
windows2003證書服務(wù)中獲得
在windows2003中安裝證書服務(wù)器,windows2003服務(wù)器即可當(dāng)做一個(gè)小型的CA,可以申請(qǐng)簽發(fā)證書。
makecert工具獲得
微軟在framework SDK中提供了一個(gè)生成X.509數(shù)字證書的命令行工具M(jìn)akecert.exe。
Makecert生成證書被保存到命令中指定的證書存儲(chǔ)區(qū)。
比如使用下面這個(gè)命令生成一個(gè)證書:
makecert -sr CurrentUser -ss My -n CN=MyTestCert -sky exchange -pe
參數(shù)說(shuō)明:
-sr CurrentUser -- 指定主題的證書存儲(chǔ)位置。Location 可以是 currentuser(默認(rèn)值)或 localmachine
-ss My -- 指定主題的證書存儲(chǔ)名稱,輸出證書即存儲(chǔ)在那里。My表示保存在“個(gè)人”
-n CN=MyTestCert -- 指定主題的證書名稱。此名稱必須符合 X.500 標(biāo)準(zhǔn)。最簡(jiǎn)單的方法是在雙引號(hào)中指定此名稱,并加上前綴 CN=;例如,"CN=myName"。
-sky exchange -- 指定頒發(fā)者的密鑰類型,必須是 signature、exchange 或一個(gè)表示提供程序類型的整數(shù)。默認(rèn)情況下,可傳入 1 表示交換密鑰,傳入 2 表示簽名密鑰。
-pe -- 將所生成的私鑰標(biāo)記為可導(dǎo)出。這樣可將私鑰包括在證書中。
這個(gè)命令生成一個(gè)名字為MyTestCert的證書,被保存到了當(dāng)前用戶的個(gè)人證書存儲(chǔ)區(qū)內(nèi)。
Makecert命令的詳細(xì)說(shuō)明請(qǐng)參看微軟Makecert.exe工具的文檔:
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cptools/html/cpgrfcertificatecreationtoolmakecertexe.asp
Makecert命令生成的證書被保存在證書存儲(chǔ)區(qū)。證書存儲(chǔ)區(qū)是系統(tǒng)中一個(gè)特殊區(qū)域,專門用來(lái)保存X.509數(shù)字證書。
可以在MMC的證書管理單元中對(duì)證書存儲(chǔ)區(qū)進(jìn)行管理。Windows沒有給我們準(zhǔn)備好直接的管理證書的入口。自己在MMC中添加,步驟如下:
l 開始 à 運(yùn)行 à MMC,打開一個(gè)空的MMC控制臺(tái)。
l 在控制臺(tái)菜單,文件 à 添加/刪除管理單元 à 添加按鈕 à 選”證書” à 添加 à 選”我的用戶賬戶” à 關(guān)閉 à 確定
l 在控制臺(tái)菜單,文件 à 添加/刪除管理單元 à 添加按鈕 à 選”證書” à 添加 à 選”計(jì)算機(jī)賬戶” à 關(guān)閉 à 確定
完成后,在MMC控制臺(tái)中有了兩個(gè)MMC管理單元
Figure 1.證書管理
添加完證書管理單元后可以保存一下這個(gè)MMC控制臺(tái)的設(shè)置,方便以后再次使用。在文件菜單中選“保存”,比如可以保存為“證書.msc”。
這兩個(gè)管理單元分別對(duì)應(yīng)證書的兩類存儲(chǔ)位置:
當(dāng)前用戶(CurrentUser) -- 當(dāng)前用戶使用的 X.509 證書存儲(chǔ)區(qū)。
本地計(jì)算機(jī)(LocalMachine) -- 分配給本地計(jì)算機(jī)的 X.509 證書存儲(chǔ)區(qū)。
每個(gè)存儲(chǔ)位置下面的子目錄代表證書的存儲(chǔ)區(qū),預(yù)設(shè)了以下存儲(chǔ)區(qū):
AddressBook
其他用戶的 X.509 證書存儲(chǔ)區(qū)。
AuthRoot
第三方證書頒發(fā)機(jī)構(gòu) (CA) 的 X.509 證書存儲(chǔ)區(qū)。
CertificateAuthority
中間證書頒發(fā)機(jī)構(gòu) (CA) 的 X.509 證書存儲(chǔ)區(qū)。
Disallowed
吊銷的證書的 X.509 證書存儲(chǔ)區(qū)。
My
個(gè)人證書的 X.509 證書存儲(chǔ)區(qū)。
Root
受信任的根證書頒發(fā)機(jī)構(gòu) (CA) 的 X.509 證書存儲(chǔ)區(qū)。
TrustedPeople
直接受信任的人和資源的 X.509 證書存儲(chǔ)區(qū)。
TrustedPublisher
直接受信任的發(fā)行者的 X.509 證書存儲(chǔ)區(qū)。
作為文件形式存在的證書一般有這幾種格式:
由Public Key Cryptography Standards #12,PKCS#12標(biāo)準(zhǔn)定義,包含了公鑰和私鑰的二進(jìn)制格式的證書形式,以pfx作為證書文件后綴名。
證書中沒有私鑰,DER 編碼二進(jìn)制格式的證書文件,以cer作為證書文件后綴名。
編碼的證書
證書中沒有私鑰,BASE64 編碼格式的證書文件,也是以cer作為證書文件后綴名。
Windows提供了內(nèi)置的工具可以完成數(shù)字證書從文件形式導(dǎo)入到證書存儲(chǔ)區(qū),從證書存儲(chǔ)區(qū)導(dǎo)出為證書文件的功能。
在資源管理器中,找到你要導(dǎo)入的證書文件,右鍵點(diǎn)擊pfx或者cer格式的證書(這里以上面用makecert生成的MyTestCert證書為例),選擇“安裝”,證書導(dǎo)入向?qū)В?div style="height:15px;">
Figure 2. 證書導(dǎo)入向?qū)?div style="height:15px;">
下一步,顯示要導(dǎo)入證書文件的路徑,確認(rèn)即可,再下一步。
如果是導(dǎo)入pfx含有私鑰的證書,需要提供密碼:
Figure 3. 導(dǎo)入pfx時(shí)需要密碼
pfx證書含有私鑰,在保存為證書文件時(shí)設(shè)置有私鑰密碼,以保護(hù)私鑰的安全,所以這一步需要提供保存證書時(shí)設(shè)置的私鑰密鑰。
如果選擇了“標(biāo)識(shí)此密鑰為可導(dǎo)出”,導(dǎo)入到證書存儲(chǔ)區(qū)的證書以后還能導(dǎo)出含有私鑰的證書,否則只能導(dǎo)出不含私鑰的證書。
再下一步,如果是導(dǎo)入cer證書,導(dǎo)入向?qū)ч_始后就直接到了這一步。
Figure 4. 選擇證書存儲(chǔ)區(qū)
可以根據(jù)證書的類型自動(dòng)存放到合適的區(qū)域,也可以自己選擇存儲(chǔ)區(qū),一般選個(gè)人存儲(chǔ)區(qū)。
導(dǎo)入完成。查看證書管理中證書已經(jīng)導(dǎo)入:
Figure 5. 查看導(dǎo)入的證書1
雙擊這個(gè)MyTestCert證書:
Figure 6. 查看導(dǎo)入的證書2
這是證書的具體信息,可以看見這個(gè)證書包含有私鑰。如果導(dǎo)入的是cer證書,證書中不含有私鑰的,那么這里不會(huì)顯示有相應(yīng)的私鑰。
把上面導(dǎo)入到證書存儲(chǔ)區(qū)的證書再導(dǎo)出為證書文件。
在MyTestCert證書上點(diǎn)擊右鍵 à 所有任務(wù) à 導(dǎo)入…,證書導(dǎo)出向?qū)н\(yùn)行:
Figure 7. 證書導(dǎo)出向?qū)?div style="height:15px;">
這里要導(dǎo)出的MyTestCert證書是含有私鑰的證書,所以向?qū)紫纫筮x擇導(dǎo)出的證書是否連同私鑰一同導(dǎo)出。如果選要導(dǎo)出私鑰,下一步:
Figure 8. 含私鑰pfx格式證書選項(xiàng)
選擇導(dǎo)出含私鑰的證書生成pfx格式的證書。這里是些導(dǎo)出pfx證書的選項(xiàng)。
如果選擇了不導(dǎo)出私鑰或者選擇導(dǎo)出的證書本身就不含有私鑰,那么這一步只能選不含私鑰的證書格式(導(dǎo)入私鑰的選項(xiàng)是暗的):
Figure 9. 不含私鑰cer格式證書選項(xiàng)
這里是導(dǎo)出不含私鑰證書的選項(xiàng),一般導(dǎo)出為cer證書。
DER編碼,就是導(dǎo)出的證書是二進(jìn)制格式存儲(chǔ)的證書。
Base64編碼,就是把證書的二進(jìn)制編碼轉(zhuǎn)成base64的編碼后存儲(chǔ)的證書。
下一步,如果是導(dǎo)出含私鑰的證書,需要提供私鑰保護(hù)密碼:
Figure 10. 導(dǎo)出含私鑰的證書需要私鑰保護(hù)密碼
下一步,提供證書文件的路徑:
Figure 11. 指定導(dǎo)出證書的路徑
導(dǎo)出證書完成。
除了使用windows提供的工具交互操作導(dǎo)入或者導(dǎo)出證書,也可以在程序中使用代碼進(jìn)行證書的導(dǎo)入和導(dǎo)出操作,以適應(yīng)在應(yīng)用系統(tǒng)中對(duì)證書進(jìn)行操作的需求。
下面通過(guò)代碼完成上面使用工具導(dǎo)入證書文件,然后把導(dǎo)入的證書導(dǎo)出為證書文件的的同樣功能。
l 讀取證書放入證書對(duì)象
Framework2.0中myX509Certificate2類代表了證書。
//從證書文件載入證書,如果含有私鑰的,需要提供保存證書時(shí)設(shè)置的密碼
X509Certificate2 myX509Certificate2 = new X509Certificate2(
@"C:\Samples\PartnerAEncryptMsg\MyTestCert.pfx", //證書路徑
"password", //證書的私鑰保護(hù)密碼
X509KeyStorageFlags.Exportable //表示此證書的私鑰以后還可以導(dǎo)出
);
X509Certificate2構(gòu)造函數(shù)中X509KeyStorageFlags.Exportable參數(shù),相當(dāng)于在工具交互導(dǎo)入證書時(shí)選擇了“標(biāo)識(shí)此密鑰為可導(dǎo)出”,如果構(gòu)造函數(shù)中不加這個(gè)參數(shù),證書的私鑰將不可導(dǎo)出。
以后不管這個(gè)證書被導(dǎo)入到哪個(gè)存儲(chǔ)位,默認(rèn)的私鑰都被保存到CurrentUser,如果需要把私鑰保存到LocalMachine,第三個(gè)參數(shù)應(yīng)該是這樣:X509KeyStorageFlags.Exportable| X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet
l 建立相應(yīng)的存儲(chǔ)區(qū)對(duì)象并保存證書
Framework2.0中X509Store類表示證書存儲(chǔ)區(qū),前面討論過(guò)證書存儲(chǔ)區(qū),證書存儲(chǔ)區(qū)實(shí)際是個(gè)層次結(jié)構(gòu),第一層是存儲(chǔ)位置storeLocation,第二個(gè)層次是存儲(chǔ)區(qū)storeName,X509Store實(shí)際上代表的是某個(gè)存儲(chǔ)位置下的某個(gè)存儲(chǔ)區(qū)。
新建一個(gè)存儲(chǔ)區(qū)X509Store并把上面的證書對(duì)象存入其中:
//新建指向當(dāng)前用戶,個(gè)人證書存貯區(qū)的X509Store對(duì)象
X509Store store = new X509Store(StoreName.My,StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
store.Add(myX509Certificate2);
store.Close();
這樣,證書導(dǎo)入到了當(dāng)前用戶的個(gè)人證書存儲(chǔ)區(qū)內(nèi)。
再將上面導(dǎo)入到當(dāng)前用戶的個(gè)人證書存儲(chǔ)區(qū)內(nèi)的證書導(dǎo)出為證書文件:
//新建指向當(dāng)前用戶,個(gè)人證書存貯區(qū)的X509Store對(duì)象
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
//輪詢存儲(chǔ)區(qū)中的所有證書
foreach(X509Certificate2 myX509Certificate2 in store.Certificates)
{
//將證書的名稱跟要導(dǎo)出的證書MyTestCert比較,找到要導(dǎo)出的證書
if (myX509Certificate2.Subject == "CN=MyTestCert")
{
//證書導(dǎo)出到byte[]中,password為私鑰保護(hù)密碼
byte[] CertByte = myX509Certificate2.Export(X509ContentType.Pfx,"password");
//將證書的字節(jié)流寫入到證書文件
FileStream fStream = new FileStream(
@"C:\Samples\PartnerAEncryptMsg\MyTestCert_Exp.pfx",
FileMode.Create,
FileAccess.Write);
fStream.Write(CertByte, 0, CertByte.Length);
fStream.Close();
}
}
store.Close();
注意X509Certificate2類的Export方法,第一個(gè)參數(shù)X509ContentType.Pfx表示要導(dǎo)出為含有私鑰的pfx證書形式,第二個(gè)參數(shù)為私鑰保護(hù)密碼。
如果要導(dǎo)出為不含私鑰的cer證書,第一個(gè)參數(shù)使用X509ContentType.Cert,表示導(dǎo)出為不含私鑰的cer證書,也就不需要密碼了
byte[] CertByte = myX509Certificate2.Export(X509ContentType.Cert);
0
0
0(請(qǐng)您對(duì)文章做出評(píng)價(jià))