1、 得到證書... 2html
一、 從CA得到... 2windows
二、 從windows2003證書服務中得到... 2安全
三、 使用makecert工具得到... 2服務器
2、 證書的保存... 2函數
一、 保存在證書存儲區... 2工具
二、 以文件形式保存... 4post
2.1. 帶有私鑰的證書... 4編碼
2.2. 二進制編碼的證書... 4加密
2.3. Base64編碼的證書... 4url
三、 存儲區中的證書跟證書文件相互轉換... 4
3.1. 使用工具相互轉換... 4
3.1.1 從證書文件導入證書存儲區... 4
3.1.2 從證書存儲區導出爲證書文件... 7
3.2. 使用代碼相互轉換... 10
3.2.1 從證書文件導入證書存儲區... 10
3.2.2 從證書存儲區導出爲證書文件... 11
數字證書(也稱做數字證書)將身份綁定到一對能夠用來加密和簽名數字信息的電子密鑰。數字證書可以驗證一我的使用給定密鑰的權利,這有助於防止有人利用假密鑰冒充其餘用戶。數字證書與加密一塊兒使用,能夠提供一個更加完整的解決方案,確保交易中各方的身份。
若是是商業應用最好從證書的簽發機構CA得到證書,好比VeriSign,這樣的大的CA簽發的證書已經被一些系統默認爲可信任的證書籤發機構,它所簽發的證書也是被信任的。可是這樣的證書須要購買。
若是不是商業應用,這裏推薦一個能夠免費申請證書的CA:www.cacert.org
在windows2003中安裝證書服務器,windows2003服務器便可當作一個小型的CA,能夠申請簽發證書。
微軟在framework SDK中提供了一個生成X.509數字證書的命令行工具Makecert.exe。
Makecert生成證書被保存到命令中指定的證書存儲區。
好比使用下面這個命令生成一個證書:
makecert -sr CurrentUser -ss My -n CN=MyTestCert -sky exchange -pe
參數說明:
-sr CurrentUser -- 指定主題的證書存儲位置。Location 能夠是 currentuser(默認值)或 localmachine
-ss My -- 指定主題的證書存儲名稱,輸出證書即存儲在那裏。My表示保存在「我的」
-n CN=MyTestCert -- 指定主題的證書名稱。此名稱必須符合 X.500 標準。最簡單的方法是在雙引號中指定此名稱,並加上前綴 CN=;例如,"CN=myName"。
-sky exchange -- 指定頒發者的密鑰類型,必須是 signature、exchange 或一個表示提供程序類型的整數。默認狀況下,可傳入 1 表示交換密鑰,傳入 2 表示簽名密鑰。
-pe -- 將所生成的私鑰標記爲可導出。這樣可將私鑰包括在證書中。
這個命令生成一個名字爲MyTestCert的證書,被保存到了當前用戶的我的證書存儲區內。
Makecert命令的詳細說明請參看微軟Makecert.exe工具的文檔:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cptools/html/cpgrfcertificatecreationtoolmakecertexe.asp
Makecert命令生成的證書被保存在證書存儲區。證書存儲區是系統中一個特殊區域,專門用來保存X.509數字證書。
能夠在MMC的證書管理單元中對證書存儲區進行管理。Windows沒有給咱們準備好直接的管理證書的入口。本身在MMC中添加,步驟以下:
l 開始 à 運行 à MMC,打開一個空的MMC控制檯。
l 在控制檯菜單,文件 à 添加/刪除管理單元 à 添加按鈕 à 選」證書」 à 添加 à 選」個人用戶帳戶」 à 關閉 à 肯定
l 在控制檯菜單,文件 à 添加/刪除管理單元 à 添加按鈕 à 選」證書」 à 添加 à 選」計算機帳戶」 à 關閉 à 肯定
完成後,在MMC控制檯中有了兩個MMC管理單元
Figure 1.證書管理
添加完證書管理單元后能夠保存一下這個MMC控制檯的設置,方便之後再次使用。在文件菜單中選「保存」,好比能夠保存爲「證書.msc」。
這兩個管理單元分別對應證書的兩類存儲位置:
當前用戶(CurrentUser) -- 當前用戶使用的 X.509 證書存儲區。
本地計算機(LocalMachine) -- 分配給本地計算機的 X.509 證書存儲區。
每一個存儲位置下面的子目錄表明證書的存儲區,預設了如下存儲區:
AddressBook |
其餘用戶的 X.509 證書存儲區。 |
AuthRoot |
第三方證書頒發機構 (CA) 的 X.509 證書存儲區。 |
CertificateAuthority |
中間證書頒發機構 (CA) 的 X.509 證書存儲區。 |
Disallowed |
吊銷的證書的 X.509 證書存儲區。 |
My |
我的證書的 X.509 證書存儲區。 |
Root |
受信任的根證書頒發機構 (CA) 的 X.509 證書存儲區。 |
TrustedPeople |
直接受信任的人和資源的 X.509 證書存儲區。 |
TrustedPublisher |
直接受信任的發行者的 X.509 證書存儲區。 |
做爲文件形式存在的證書通常有這幾種格式:
由Public Key Cryptography Standards #12,PKCS#12標準定義,包含了公鑰和私鑰的二進制格式的證書形式,以pfx做爲證書文件後綴名。
證書中沒有私鑰,DER 編碼二進制格式的證書文件,以cer做爲證書文件後綴名。
證書中沒有私鑰,BASE64 編碼格式的證書文件,也是以cer做爲證書文件後綴名。
Windows提供了內置的工具能夠完成數字證書從文件形式導入到證書存儲區,從證書存儲區導出爲證書文件的功能。
在資源管理器中,找到你要導入的證書文件,右鍵點擊pfx或者cer格式的證書(這裏以上面用makecert生成的MyTestCert證書爲例),選擇「安裝」,證書導入嚮導:
Figure 2. 證書導入嚮導
下一步,顯示要導入證書文件的路徑,確認便可,再下一步。
若是是導入pfx含有私鑰的證書,須要提供密碼:
Figure 3. 導入pfx時須要密碼
pfx證書含有私鑰,在保存爲證書文件時設置有私鑰密碼,以保護私鑰的安全,因此這一步須要提供保存證書時設置的私鑰密鑰。
若是選擇了「標識此密鑰爲可導出」,導入到證書存儲區的證書之後還能導出含有私鑰的證書,不然只能導出不含私鑰的證書。
再下一步,若是是導入cer證書,導入嚮導開始後就直接到了這一步。
Figure 4. 選擇證書存儲區
能夠根據證書的類型自動存放到合適的區域,也能夠本身選擇存儲區,通常選我的存儲區。
導入完成。查看證書管理中證書已經導入:
Figure 5. 查看導入的證書1
雙擊這個MyTestCert證書:
Figure 6. 查看導入的證書2
這是證書的具體信息,能夠看見這個證書包含有私鑰。若是導入的是cer證書,證書中不含有私鑰的,那麼這裏不會顯示有相應的私鑰。
把上面導入到證書存儲區的證書再導出爲證書文件。
在MyTestCert證書上點擊右鍵 à 全部任務 à 導入…,證書導出嚮導運行:
Figure 7. 證書導出嚮導
這裏要導出的MyTestCert證書是含有私鑰的證書,因此嚮導首先要求選擇導出的證書是否連同私鑰一同導出。若是選要導出私鑰,下一步:
Figure 8. 含私鑰pfx格式證書選項
選擇導出含私鑰的證書生成pfx格式的證書。這裏是些導出pfx證書的選項。
若是選擇了不導出私鑰或者選擇導出的證書自己就不含有私鑰,那麼這一步只能選不含私鑰的證書格式(導入私鑰的選項是暗的):
Figure 9. 不含私鑰cer格式證書選項
這裏是導出不含私鑰證書的選項,通常導出爲cer證書。
DER編碼,就是導出的證書是二進制格式存儲的證書。
Base64編碼,就是把證書的二進制編碼轉成base64的編碼後存儲的證書。
下一步,若是是導出含私鑰的證書,須要提供私鑰保護密碼:
Figure 10. 導出含私鑰的證書須要私鑰保護密碼
下一步,提供證書文件的路徑:
Figure 11. 指定導出證書的路徑
導出證書完成。
除了使用windows提供的工具交互操做導入或者導出證書,也能夠在程序中使用代碼進行證書的導入和導出操做,以適應在應用系統中對證書進行操做的需求。
下面經過代碼完成上面使用工具導入證書文件,而後把導入的證書導出爲證書文件的的一樣功能。
l 讀取證書放入證書對象
Framework2.0中myX509Certificate2類表明了證書。
//從證書文件載入證書,若是含有私鑰的,須要提供保存證書時設置的密碼
X509Certificate2 myX509Certificate2 = new X509Certificate2(
@"C:\Samples\PartnerAEncryptMsg\MyTestCert.pfx", //證書路徑
"password", //證書的私鑰保護密碼
X509KeyStorageFlags.Exportable //表示此證書的私鑰之後還能夠導出
);
X509Certificate2構造函數中X509KeyStorageFlags.Exportable參數,至關於在工具交互導入證書時選擇了「標識此密鑰爲可導出」,若是構造函數中不加這個參數,證書的私鑰將不可導出。 之後無論這個證書被導入到哪一個存儲位,默認的私鑰都被保存到CurrentUser,若是須要把私鑰保存到LocalMachine,第三個參數應該是這樣:X509KeyStorageFlags.Exportable| X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet
l 創建相應的存儲區對象並保存證書
Framework2.0中X509Store類表示證書存儲區,前面討論過證書存儲區,證書存儲區實際是個層次結構,第一層是存儲位置storeLocation,第二個層次是存儲區storeName,X509Store實際上表明的是某個存儲位置下的某個存儲區。
新建一個存儲區X509Store並把上面的證書對象存入其中:
//新建指向當前用戶,我的證書存貯區的X509Store對象
X509Store store = new X509Store(StoreName.My,StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
store.Add(myX509Certificate2);
store.Close();
這樣,證書導入到了當前用戶的我的證書存儲區內。
再將上面導入到當前用戶的我的證書存儲區內的證書導出爲證書文件:
//新建指向當前用戶,我的證書存貯區的X509Store對象
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
//輪詢存儲區中的全部證書
foreach(X509Certificate2 myX509Certificate2 in store.Certificates)
{
//將證書的名稱跟要導出的證書MyTestCert比較,找到要導出的證書
if (myX509Certificate2.Subject == "CN=MyTestCert")
{
//證書導出到byte[]中,password爲私鑰保護密碼
byte[] CertByte = myX509Certificate2.Export(X509ContentType.Pfx,"password");
//將證書的字節流寫入到證書文件
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方法,第一個參數X509ContentType.Pfx表示要導出爲含有私鑰的pfx證書形式,第二個參數爲私鑰保護密碼。
若是要導出爲不含私鑰的cer證書,第一個參數使用X509ContentType.Cert,表示導出爲不含私鑰的cer證書,也就不須要密碼了
byte[] CertByte = myX509Certificate2.Export(X509ContentType.Cert);