日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

使用X.509数字证书加密解密实务(一)-- 证书的获得和管理

發(fā)布時(shí)間:2023/12/9 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用X.509数字证书加密解密实务(一)-- 证书的获得和管理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、?????? 獲得證書... 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)證書的CAwww.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ā)者的密鑰類型,必須是 signatureexchange 或一個(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 #12PKCS#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.0myX509Certificate2類代表了證書。

//從證書文件載入證書,如果含有私鑰的,需要提供保存證書時(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.0X509Store類表示證書存儲(chǔ)區(qū),前面討論過(guò)證書存儲(chǔ)區(qū),證書存儲(chǔ)區(qū)實(shí)際是個(gè)層次結(jié)構(gòu),第一層是存儲(chǔ)位置storeLocation,第二個(gè)層次是存儲(chǔ)區(qū)storeNameX509Store實(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。