使用X.509数字证书加密解密实务(一)-- 证书的获得和管理
一、?????? 獲得證書... 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è)更加完整的解決方案,確保交易中各方的身份。
一、? 獲得證書
1、 從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
2、 從windows2003證書服務(wù)中獲得
在windows2003中安裝證書服務(wù)器,windows2003服務(wù)器即可當(dāng)做一個(gè)小型的CA,可以申請(qǐng)簽發(fā)證書。
3、 使用makecert工具獲得
微軟在framework SDK中提供了一個(gè)生成X.509數(shù)字證書的命令行工具Makecert.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二、? 證書的保存
1、 保存在證書存儲(chǔ)區(qū)
Makecert命令生成的證書被保存在證書存儲(chǔ)區(qū)。證書存儲(chǔ)區(qū)是系統(tǒng)中一個(gè)特殊區(qū)域,專門用來(lái)保存X.509數(shù)字證書。
可以在MMC的證書管理單元中對(duì)證書存儲(chǔ)區(qū)進(jìn)行管理。Windows沒(méi)有給我們準(zhǔn)備好直接的管理證書的入口。自己在MMC中添加,步驟如下:
l???????? 開(kāi)始 à 運(yùn)行 à MMC,打開(kāi)一個(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ū)。? |
?
??2、 以文件形式保存
作為文件形式存在的證書一般有這幾種格式:
2.1.??????? 帶有私鑰的證書
由Public Key Cryptography Standards #12,PKCS#12標(biāo)準(zhǔn)定義,包含了公鑰和私鑰的二進(jìn)制格式的證書形式,以pfx作為證書文件后綴名。
2.2.??????? 二進(jìn)制編碼的證書
證書中沒(méi)有私鑰,DER 編碼二進(jìn)制格式的證書文件,以cer作為證書文件后綴名。
2.3.??????? Base64編碼的證書
證書中沒(méi)有私鑰,BASE64 編碼格式的證書文件,也是以cer作為證書文件后綴名。
3、 存儲(chǔ)區(qū)中的證書跟證書文件相互轉(zhuǎn)換
3.1.??????? 使用工具相互轉(zhuǎn)換
Windows提供了內(nèi)置的工具可以完成數(shù)字證書從文件形式導(dǎo)入到證書存儲(chǔ)區(qū),從證書存儲(chǔ)區(qū)導(dǎo)出為證書文件的功能。
3.1.1?? 從證書文件導(dǎo)入證書存儲(chǔ)區(qū)
在資源管理器中,找到你要導(dǎo)入的證書文件,右鍵點(diǎn)擊pfx或者cer格式的證書(這里以上面用makecert生成的MyTestCert證書為例),選擇“安裝”,證書導(dǎo)入向?qū)?#xff1a;
Figure 2. 證書導(dǎo)入向?qū)?/span>
?
下一步,顯示要導(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ū)ч_(kāi)始后就直接到了這一步。
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
?
這是證書的具體信息,可以看見(jiàn)這個(gè)證書包含有私鑰。如果導(dǎo)入的是cer證書,證書中不含有私鑰的,那么這里不會(huì)顯示有相應(yīng)的私鑰。
?
3.1.2?? 從證書存儲(chǔ)區(qū)導(dǎo)出為證書文件
把上面導(dǎo)入到證書存儲(chǔ)區(qū)的證書再導(dǎo)出為證書文件。
在MyTestCert證書上點(diǎn)擊右鍵 à 所有任務(wù) à 導(dǎo)入…,證書導(dǎo)出向?qū)н\(yùn)行:
Figure 7. 證書導(dǎo)出向?qū)?/span>
?
這里要導(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)出證書完成。
?
3.2.??????? 使用代碼相互轉(zhuǎn)換
除了使用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)出為證書文件的的同樣功能。
3.2.1?? 從證書文件導(dǎo)入證書存儲(chǔ)區(qū)
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)。
3.2.2?? 從證書存儲(chǔ)區(qū)導(dǎo)出為證書文件
再將上面導(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);
轉(zhuǎn)載于:https://www.cnblogs.com/chnking/archive/2007/08/18/860983.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的使用X.509数字证书加密解密实务(一)-- 证书的获得和管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python 垃圾回收详解
- 下一篇: “玩转课堂”基本构想