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

一、       获得证书... 2

1        CA获得... 2

2        windows2003证书服务中获得... 2

3        使用makecert工具获得... 2

二、       证书的保存... 2

1        保存在证书存储区... 2

2        以文件形式保存... 4

2.1.       带有私钥的证书... 4

2.2.       二进制编码的证书... 4

2.3.       Base64编码的证书... 4

3        存储区中的证书跟证书文件相互转换... 4

3.1.       使用工具相互转换... 4

3.1.1    从证书文件导入证书存储区... 4

3.1.2    从证书存储区导出为证书文件... 7

3.2.       使用代码相互转换... 10

3.2.1    从证书文件导入证书存储区... 10

3.2.2    从证书存储区导出为证书文件... 11

 


 

数字证书(也称作数字证书)将身份绑定到一对可以用来加密和签名数字信息的电子密钥。数字证书能够验证一个人使用给定密钥的权利,这有助于防止有人利用假密钥冒充其他用户。数字证书与加密一起使用,可以提供一个更加完整的解决方案,确保交易中各方的身份。

一、  获得证书

1、 CA获得

如果是商业应用最好从证书的签发机构CA获得证书,比如VeriSign,这样的大的CA签发的证书已经被一些系统默认为可信任的证书签发机构,它所签发的证书也是被信任的。但是这样的证书需要购买。

如果不是商业应用,这里推荐一个可以免费申请证书的CAwww.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 --         指定颁发者的密钥类型,必须是 signatureexchange 或一个表示提供程序类型的整数。默认情况下,可传入 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 #12PKCS#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.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 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);

转载于:https://www.cnblogs.com/chnking/archive/2007/08/18/860983.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM分析

在运行java进程是,可以通过jps命令查看进程PID,使用java的同居jmap命令可以得到jvm的dump文件; 在网上找了两种方式获取dump文件 获取JVM的dump文件的两种方式:转载来源https://www.cnblogs.com/liu-ke/p/6622350.html【流柯】 1.…

linux组类型,LINUX用户以及用户组

转载博文:https://blog.csdn.net/xietansheng/article/details/800446200、用户、组、文件权限 常用命令:类型举例用户who, whoami, su, useradd, userdel, passwd, usermod, /etc/passwd组groupadd, groupdel, groupmod, /etc/group文件chmod, chown, chgrp其他sudo, exitPS:1…

linux安装Git依赖的包出错,技术|Linux有问必答:如何在Linux上安装Git

问题: 我尝试从一个Git公共仓库克隆项目,但出现了这样的错误提示:“git: command not found”。 请问我该如何在某某发行版上安装Git?Git是一个流行的开源版本控制系统(VCS),最初是为Linux环境开发的。跟CVS或者SVN这些版本控制系…

1社会心理学---感知情境

1小便池放一只苍蝇减少百分之八十的人不文明行为 2电梯中所有人背靠有人就会背靠 3结论 4社会心理学

史上最扯Java图形绘制(J2SE)之一JAVA动画效果

史上最扯Java图形绘制(J2SE)之一JAVA动画效果 很多主一听说Java界面,一水的头大外带血压高,兄弟我倒觉得没什么必要。其实Java这东西吧,就简便性和其初衷而言,真他妈就在GUI 这地界是有优势的,单…

linux 3.11 虚拟摄像头 驱动,摄像头万能驱动-万能视频驱动-摄像头万能驱动下载 v2011.3官方版-完美下载...

摄像头万能驱动收录了N多常用驱动,且适用于80%的摄像头,如:华硕、罗技、创新、联想、戴尔等品牌,智能化的摄像头设备识别和驱动安装,小白也能操作,同时摄像头万能驱动也是装机人员必备驱动盘,一…

linux mate eth0已下线,Linux Mint 18 Cinnamon 版和 MATE 版已经可以下载了

在今天早些时候,Linux Mint[1] 项目负责人 Clement Lefebvre 将 ISO 镜像放到了网上,它首先出现在了爱尔兰的镜像网站[2],看起来已经是最终的产品形态了。截止到写这篇文章时,在 Linux Mint 网站上还没有发布官方通告,…

使用脚本动态操作 SVG 文档

本教程适用于那些希望使用可伸缩向量图形(SVG)创建交互式 SVG 图形的开发人员。它讨论了使用ECMAScript(JavaScript)对现有的 SVG 图像进行实时操作得技术。本文主要介绍在 SVG 中通过编程实现动态操作 SVG 图像的知识。 SVG 图像…

linux 安装vs2017,vs2017安装 CMake安装

apt安装cmakesudo apt install cmake这种方式安装方便,缺点是如果想要自己交叉编译Android平台的opencv会提示版本太低,因为ubuntu16.04源里的cmake版...lj4021598062017年07月30日 23:2484191.下载安装程序,地址为,下载Unix/Linux Source (has \n line …

asp.net 导出word excel 当前上下文中不存在名称“Encoding”报错问题

web页面<% Page Language"C#" EnableEventValidation"false" AutoEventWireup"true" CodeBehind"CheapMaterialManageSet.aspx.cs" Inherits"AssetsManager.DeskWeb.BaseDOC.CheapMaterialManageSet" %>using System.…