使用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 从证书存储区导出为证书文件
[color=red]转自[url]http://blog.sina.com.cn/s/blog_6168ee920100jsqv.html[/url][/color]


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

一、 获得证书
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
解决:解决x509证书无法验证IP的错误 当使用IP地址作为服务器的主机名(hostname)时,例如在域名解析尚未完成或者在开发和测试环境中使用IP地址进行访问时,可能会遇到"cannot validate certificate for IP"的错误。在上面的示例中,我们创建了一个自定义的Transport,并设置了TLSClientConfig的InsecureSkipVerify字段为true,这将禁用主机名验证。然而,需要谨慎使用这种方法,并确保在生产环境中使用正确的域名进行验证,以确保通信的安全性。如有其他疑问,请随时提问。 阅读详情

相关推荐

Material Studio 2024安装避坑指南:从证书配置到权限设置的完整解决方案

本文详细解析了Material Studio 2024的安装流程,从环境准备到权限优化的完整解决方案。针对证书配置、系统权限和计算服务等常见问题,提供了12个关键风险点的避坑指南,帮助科研工作者高效完成安装,提升材料模拟工作的效率。

moon9的博客 774

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

使用X.509数字证书加密解密实务(一)-- 证书的获得和管理一、       获得证书... 21、        从CA获得... 22、        从windows2003证书服务中获得... 23、        使用makecert工具获得... 2二、       证书的保存... 21、        保存在证书存储区... 22、       

948

国密套件ECC-SM2-SM4-CBC-SM3和ECDHE-SM2-WITH-SM4-SM3

双方交换各自的公钥,最后A计算点(x1,y1) = d1Q2,B计算点(x2,y2) = d2Q1,由于椭圆曲线上是可以满足乘法交换和结合律,所以 d1Q2 = d1d2G = d2d1G = d2Q1 ,因此双方的 x 坐标是一样的,所以它是共享密钥,也就是会话密钥。4、客户端和服务端分别使用工作密钥,计算主密钥,客户端随机数,服务端随机数,字符串常量"key expansion",经PRF计算生成工作密钥。工作密钥包括加密密钥和校验密钥,具体密钥长度由选择的密码算法决定。客户端支持的压缩算法列表。

Java学习笔记 3784

X509证书 指定了无效的提供程序类型解决方法

第一种解决办法: IIS 应用程序池–选中你网站的所配置的应用程序池–右键 选择 “高级配置” –将“加载用户配置文件” 设置为True 第二种解决办法: 在加载证书方法时使用以下方法,请注意第三个参数 X509Certificate2 cer = new X509Certificate2(cerPath, password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorage

mo_jinxun的专栏 1125

霍尔编码器 vs 磁编码器:如何为你的电机控制项目选择最佳传感器(附实战对比)

本文深入对比了霍尔编码器和磁编码器在电机控制项目中的应用,从技术原理、性能参数、成本效益到实际场景选择提供了全面分析。通过实验室测试和项目案例,帮助工程师根据精度、环境抗性和预算选择最佳传感器方案,特别适合机器人、伺服驱动等领域的开发者参考。

weixin_28312391的博客 353

分享一下使用Xilinx FPGA驱动MIPI DSI LCD屏的心路历程

分享一下调试用Xilinx FPGA驱动MIPI DSI LCD屏的心路历程,看到的朋友们,可以避免继续踩坑。

haoxingheng的专栏 5016

手动获取我们所感兴趣网站X.509证书的一般方法

怎样手动获取我们所感兴趣网站的公钥证书? 本文由优快云-蚍蜉撼青松【主页:http://blog.csdn.net/howeverpf】原创,转载请注明出处!  一、通过抓包从网络协议数据流中获取        因为不管怎么说,在SSL协议的握手阶段,服务器必然会向客户端/浏览器发送自己的证书,所以我要详细说的这第一种获取证书的方法就是通过抓包从网络协议数据流中获取,这是一种通用性非常好的...

平凡之路 8657

跟着Cell学单细胞转录组分析(五):单细胞转录组marker基因鉴定及细胞群注释

书接上回(跟着Cell学单细胞转录组分析(四):单细胞转录组测序UMAP降维聚类)。完成数据降维和细胞聚类后,最主要的环节和工作就是确定各个细胞群,明确是什么类型的细胞,正群的细胞定群很关键,涉及到整个研究,所以这一步宁愿多费时间,也不要出错。当然,这也不是一蹴而就的,需要反复的确认。 要确定各个群是什么细胞,首先需要了解细胞群的marker基因,因为不同类型的细胞突出 表达的基因也是不同的。这里使用FindAllMarkers鉴定各个细胞群的高表达基因。 DefaultAssay(scedata)

qq_42090739的博客 1万+

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

转自:http://www.cnblogs.com/chnking/archive/2007/08/18/860983.html 使用X.509数字证书加密解密实务(一)-- 证书的获得和管理 一、 获得证书 1、 从CA获得 2、 从windows2003证书服务中获得 3、 使用makecert工具获得 二、...

weixin_30446613的博客 123

声纹识别实战:用Python从零搭建一个简易声纹验证系统(附完整代码)

本文是一份详细的声纹识别实战指南,教你使用Python从零搭建一个简易的声纹验证系统。文章涵盖了从音频采集、预处理、MFCC特征提取,到基于高斯混合模型(GMM)的建模与验证全流程,并提供了完整的代码实现,帮助开发者快速掌握这项生物特征识别核心技术。

ik6789012的博客 232

Detector-Free SfM 项目复现完整指南:从环境搭建到代码解析与可视化

本文提供了Detector-Free SfM项目的完整复现指南,涵盖技术背景、环境配置、代码解析和可视化方案。重点包括: 技术背景:Detector-Free SfM通过两阶段策略(粗重建+迭代精化)解决了传统SfM在弱纹理区域的瓶颈问题,采用深度学习匹配器替代传统特征点检测。 环境配置: 详细硬件要求与推荐配置(GPU/CPU/内存) 完整的Ubuntu系统设置步骤 Conda环境创建与依赖安装流程 关键组件安装指南(PyTorch、COLMAP等) 常见错误解决方案 项目特点: 支持多种Detector

huanghm88的专栏 121
上一篇: WiMAX基础知识之OFDMA
下一篇: 使用X.509数字证书加密解密实务(二)-- 使用RSA证书
basin6421
博客等级 码龄18年 5粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值