http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html
數字證書(也稱作數字證書)將身份綁定到一對可以用來加密和簽名數字信息的電子密鑰。數字證書能夠驗證一個人使用給定密鑰的權利,這有助於防止有人利用假密鑰冒充其他用戶。數字證書與加密一起使用,可以提供一個更加完整的解決方案,確保交易中各方的身份。
一、 獲得證書
1、 從CA獲得
如果是商業應用最好從證書的簽發機構CA獲得證書,比如VeriSign,這樣的大的CA簽發的證書已經被一些系統默認為可信任的證書簽發機構,它所簽發的證書也是被信任的。但是這樣的證書需要購買。
如果不是商業應用,這里推薦一個可以免費申請證書的CA:www.cacert.org
2、 從windows2003證書服務中獲得
在windows2003中安裝證書服務器,windows2003服務器即可當做一個小型的CA,可以申請簽發證書。
3、 使用makecert工具獲得
微軟在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
二、 證書的保存
1、 保存在證書存儲區
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 證書存儲區。
2、 以文件形式保存
作為文件形式存在的證書一般有這幾種格式:
2.1. 帶有私鑰的證書
由Public Key Cryptography Standards #12,PKCS#12標准定義,包含了公鑰和私鑰的二進制格式的證書形式,以pfx作為證書文件后綴名。
2.2. 二進制編碼的證書
證書中沒有私鑰,DER 編碼二進制格式的證書文件,以cer作為證書文件后綴名。
2.3. Base64編碼的證書
證書中沒有私鑰,BASE64 編碼格式的證書文件,也是以cer作為證書文件后綴名。
3、 存儲區中的證書跟證書文件相互轉換
3.1. 使用工具相互轉換
Windows提供了內置的工具可以完成數字證書從文件形式導入到證書存儲區,從證書存儲區導出為證書文件的功能。
3.1.1 從證書文件導入證書存儲區
在資源管理器中,找到你要導入的證書文件,右鍵點擊pfx或者cer格式的證書(這里以上面用makecert生成的MyTestCert證書為例),選擇“安裝”,證書導入向導:
Figure 2. 證書導入向導
下一步,顯示要導入證書文件的路徑,確認即可,再下一步。
如果是導入pfx含有私鑰的證書,需要提供密碼:
Figure 3. 導入pfx時需要密碼
pfx證書含有私鑰,在保存為證書文件時設置有私鑰密碼,以保護私鑰的安全,所以這一步需要提供保存證書時設置的私鑰密鑰。
如果選擇了“標識此密鑰為可導出”,導入到證書存儲區的證書以后還能導出含有私鑰的證書,否則只能導出不含私鑰的證書。
再下一步,如果是導入cer證書,導入向導開始后就直接到了這一步。
Figure 4. 選擇證書存儲區
可以根據證書的類型自動存放到合適的區域,也可以自己選擇存儲區,一般選個人存儲區。
導入完成。查看證書管理中證書已經導入:
Figure 5. 查看導入的證書1
雙擊這個MyTestCert證書:
Figure 6. 查看導入的證書2
這是證書的具體信息,可以看見這個證書包含有私鑰。如果導入的是cer證書,證書中不含有私鑰的,那么這里不會顯示有相應的私鑰。
3.1.2 從證書存儲區導出為證書文件
把上面導入到證書存儲區的證書再導出為證書文件。
在MyTestCert證書上點擊右鍵 à 所有任務 à 導入…,證書導出向導運行:
Figure 7. 證書導出向導
這里要導出的MyTestCert證書是含有私鑰的證書,所以向導首先要求選擇導出的證書是否連同私鑰一同導出。如果選要導出私鑰,下一步:
Figure 8. 含私鑰pfx格式證書選項
選擇導出含私鑰的證書生成pfx格式的證書。這里是些導出pfx證書的選項。
如果選擇了不導出私鑰或者選擇導出的證書本身就不含有私鑰,那么這一步只能選不含私鑰的證書格式(導入私鑰的選項是暗的):
Figure 9. 不含私鑰cer格式證書選項
這里是導出不含私鑰證書的選項,一般導出為cer證書。
DER編碼,就是導出的證書是二進制格式存儲的證書。
Base64編碼,就是把證書的二進制編碼轉成base64的編碼后存儲的證書。
下一步,如果是導出含私鑰的證書,需要提供私鑰保護密碼:
Figure 10. 導出含私鑰的證書需要私鑰保護密碼
下一步,提供證書文件的路徑:
Figure 11. 指定導出證書的路徑
導出證書完成。
3.2. 使用代碼相互轉換
除了使用windows提供的工具交互操作導入或者導出證書,也可以在程序中使用代碼進行證書的導入和導出操作,以適應在應用系統中對證書進行操作的需求。
下面通過代碼完成上面使用工具導入證書文件,然后把導入的證書導出為證書文件的的同樣功能。
3.2.1 從證書文件導入證書存儲區
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();
這樣,證書導入到了當前用戶的個人證書存儲區內。
3.2.2 從證書存儲區導出為證書文件
再將上面導入到當前用戶的個人證書存儲區內的證書導出為證書文件:
//新建指向當前用戶,個人證書存貯區的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);