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

  

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.0myX509Certificate2类代表了证书。

//从证书文件载入证书,如果含有私钥的,需要提供保存证书时设置的密码

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.0X509Store类表示证书存储区,前面讨论过证书存储区,证书存储区实际是个层次结构,第一层是存储位置storeLocation,第二个层次是存储区storeNameX509Store实际上代表的是某个存储位置下的某个存储区。

新建一个存储区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 myX509Certificate 2  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);

你可能感兴趣的:(ca)