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);