標籤:
一、 獲得認證
1、 從CA獲得
2、 從windows2003認證服務中獲得
3、 使用makecert工具獲得
二、 認證的儲存
1、 儲存在憑證存放區區
2、 以檔案形式儲存
2.1. 帶有私密金鑰的認證
2.2. 二進位編碼的認證
2.3. Base64編碼的認證
3、 儲存區中的認證跟認證檔案相互轉換
3.1. 使用工具相互轉換
3.1.1 從認證檔案匯入憑證存放區區
3.1.2 從憑證存放區區匯出為認證檔案
3.2. 使用代碼相互轉換
3.2.1 從認證檔案匯入憑證存放區區
3.2.2 從憑證存放區區匯出為認證檔案
數位憑證(也稱作數位憑證)將身份綁定到一對可以用來加密和簽名數字資訊的電子密鑰。數位憑證能夠驗證一個人使用給定密鑰的權利,這有助於防止有人利用假密鑰冒充其他使用者。數位憑證與加密一起使用,可以提供一個更加完整的解決方案,確保交易中各方的身份。
一、 獲得認證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
二、 認證的儲存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
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();
注意
如果要匯出為不含私密金鑰的cer認證,第一個參數使用X509ContentType.Cert,表示匯出為不含私密金鑰的cer認證,也就不要求輸入密碼了
byte[] CertByte = myX509Certificate2.Export(X509ContentType.Cert);
X509Certificate2類的Export方法,第一個參數X509ContentType.Pfx表示要匯出為含有私密金鑰的pfx認證形式,第二個參數為私密金鑰保護密碼。 建構函式中X509KeyStorageFlags.Exportable參數,相當於在工具互動匯入認證時選擇了“標識此密鑰為可匯出”,如果建構函式中不加這個參數,認證的私密金鑰將不可匯出。
以後不管這個認證被匯入到哪個儲存位,預設的私密金鑰都被儲存到CurrentUser,如果需要把私密金鑰儲存到LocalMachine,第三個參數應該是這樣:X509KeyStorageFlags.Exportable|X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet命令的詳細說明請參看微軟Makecert.exe工具的文檔:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cptools/html/cpgrfcertificatecreationtoolmakecertexe.asp
使用X.509數位憑證加密解密實務(一)-- 認證的獲得和管理