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

一、       获得证书

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

时间: 2025-01-04 21:29:36

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

使用X.509数字证书加密解密实务(二)-- 使用RSA证书加密敏感数据

一.  使用RSA证书加.解密敏感数据 X.509证书标准支持三种不对称加密算法:RSA, DSA, Diffie-Hellman algorithms.最常用的是RSA算法.所以本文就以前面章节使用makecert工具生成的生成的MyTestCert证书进行加密解密,这个证书具有RSA算法1024位的密钥对. Figure 12. RSA加密解密过程 1. 生成证书.分发证书 证书使用前面“使用makecert工具获得”章节生成的MyTestCert,当然也可以是从商业CA获得的证书. 你获得

使用X.509数字证书加密解密实务(三)-- 使用RSA证书结合对称加密技术加密长数据

本文全部源代码下载:/Files/chnking/EncryptLongData.rar 一.  使用证书结合对称加密算法加.解密长数据 上一章节讨论了如何使用RSA证书加密数据,文中提到:“Dotnet的RSA实现有个特点,它必须要在明文中添加一些随机数,所以明文不能把128字节占满,实际测试,明文最多为117字节,留下的空间用来填充随机数”.也就是说对于1024位密钥的RSA来说,一次只能加密128字节的数据,对于Dotnet的RSA实现更是只能加密117个字节的数据. 这就引出一个问题,超

RSA加密解密及RSA签名和验证及证书

公钥是给别人的 发送密文使用公钥加密 验证签名使用公钥验证 私钥是自己保留的 接受密文使用私钥解密 发送签名使用私钥签名 上述过程逆转是不行的,比如使用私钥加密,使用公钥解密是不行的 证书的制作参考自使用X.509数字证书加密解密实务(一)-- 证书的获得和管理 打开VS开发命令,输入下面的命令: makecert -sr CurrentUser -ss My -n CN=MyTestCert -sky exchange -pe 从证书中读取私钥和公钥: /// <summary> /// 根

RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密

原文:RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密 C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider  DESCryptoServiceProvider 是用于对称加密 RSACryptoServiceProvider是用于非对称加密  对称加密的意思:有一个密钥 相当于加密算法,加密用它来加

Java加密解密与数字证书的操作

1 keytool命令总结 一.创建数字证书 交互模式 使用默认的密钥库.keystore(文件夹是c: Documents and Settingusername)和算法(DSA) keytool -genkey 默认的别名mykey 密钥库中能够存放多个条目(公钥/私钥对和证书),它们在密钥库中以别名(alias)区分. [plain] view plaincopy keytool -genkey -alias mytest -keyalg RSA -keysize 1024 -keysto

基于密钥库和数字证书的加密解密和签名验证操作

package com.szzs; import java.io.FileInputStream; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.cert.Certif

公钥私钥加密解密数字证书数字签名详解

from http://codefine.co/1455.html 首先明确几个基本概念: 1.密钥对,在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的. 2.公钥,公钥用来给数据加密,用公钥加密的数据只能使用私钥解密. 3.私钥,如上,用来解密公钥加密的数据. 4.摘要,对需要传输的文本,做一个HASH计算,一般采用SHA1,SHA2来获得. 5.签名,使用私钥对需要传输的文本的摘要进行加密,得到的密文即被称为该次传输过程的签名.

X.509 数字证书结构和实例

http://www.cppblog.com/sleepwom/archive/2010/07/08/119746.html 一. X.509数字证书的编码 X.509证书的结构是用ASN1(Abstract Syntax Notation One)进行描述数据结构,并使用ASN1语法进行编码. ASN1采用一个个的数据块来描述整个数据结构,每个数据块都有四个部分组成: 1.数据块数据类型标识(一个字节) 数据类型包括简单类型和结构类型. 简单类型是不能再分解类型,如整型(INTERGER).比

加密解密(2)*客户端,服务器,CA(Certificate Authority),公钥,私钥,证书,签名,验证

加密解密(2)*客户端,服务器,CA(Certificate Authority),公钥,私钥,证书,签名,验证 各角色比喻 客户端:通常为请求方,要验证服务器的身份. 服务器:通常为响应方,有时也要验证客户端的身份. C     A :全拼为Certificate Authority,就是第三方验证机构.客户端与服务器只有在CA申请了证书之后才能证明身份合法. 加   密 :客户端或服务器把数据放在箱子里,然后用钥匙(公钥或私钥)将箱子锁上,再放到网络上传输,只有有用钥匙的人才能打开箱子. 根