作者:玄魂出处:博客2010-06-23 12:05

http://winsystem.ctocio.com.cn/19/9492019.shtml

.NET为我们提供了操作数字证书的两个主要的类,分为为:

  1. System.Security.Cryptography.X509Certificates.X509Certificate2类, 每个这个类的实例可以表示一个证书;
  2. System.Security.Cryptography.X509Certificates.X509Store类,可以对保存在计算机安全区域内的证书进行add/remove/get操作。

另外我们可以使用System.Security.Cryptography.X509Certificates.X509Certificate2UI类来显示证书消息的对话框,它就是在ie中的证书查看器的.net实现。

  • 生成证书

在介绍以上类的使用方法之前,我们先要拥有一个数字证书,获取数字证书有三种方法,一是从CA机构申请,二是自己搭建服务器发布证书,三是使用makecert.exe来生成一个证书文件。这里我们使用makecert.exe来生成一个证书文件,用来测试。启动VS2010的命令行,输入对应参数,生成名为TestCertificates的证书文件。如图6-28所示。

图6-28 生成证书

makecert.exe的参数读者可以查看帮助,这里只解释图6-28中的参数。

参数说明:

-sr CurrentUser:指定主题的证书存储位置。Location 可以是 currentuser(默认值)或localmachine

-ss MyTestContainer:指定主题的证书存储名称,输出证书即存储在那里。

-n CN=TestCert:指定主题的证书名称。此名称必须符合 X.500 标准。最简单的方法是在双引号中指定此名称,并加上前缀 CN=;例如,"CN=myName"。

-sky exchange:指定颁发者的密钥类型,必须是 signature、exchange 或一个表示提供程序类型的整数。默认情况下,可传入 1 表示交换密钥,传入 2 表示签名密钥。

-pe:将所生成的私钥标记为可导出。这样可将私钥包括在证书中。

生成的密钥文件被保存在了我们指定的MyTestContainer中,但到哪去查看我们的证书呢?Windows没有给我们准备好直接的管理证书的入口,但我们可以在MMC控制台自行添加。

  1. 开始 ? 运行 ? MMC,打开一个空的MMC控制台。
  2. 在控制台菜单,文件 ? 添加/删除管理单元 ? 添加按钮 ? 选"证书" ? 添加 ? 选"我的用户账户" ? 关闭 ? 确定
  3. 在控制台菜单,文件 ? 添加/删除管理单元 ? 添加按钮 ? 选"证书" ? 添加 ? 选"计算机账户" ? 关闭 ? 确定

如图6-29,我们可以查看两个账户的证书管理,在我的账户中可以看到MyTestContainer下的证书TestCert。

图6-29 在MMC控制台查看和管理证书

当然我们也可以将证书文件保存为文件,如图6-30所示。

图6-30 将证书保存为文件

打开E盘,可以看到生成的证书文件。如图6-31所示。

图6-31 生成的证书文件

将证书保存为文件时,我们有三种选择:

  1. 带有私钥的证书

    由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。

  2. 二进制编码的证书

    证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。

  3. Base64编码的证书

    证书中没有私钥,BASE64 编码格式的证书文件,也是以cer作为证书文件后缀名。

右键单击本地的证书文件,我们可以看到安装选项,可以把该证书文件安装到证书存储区。也可在MMC的证书管理台上执行导出任务将存储区的证书导出为文件。这里就不再演示了,读者可以自行实践。

  • 编程操作证书

我们可以通过编程的方式操作操作本地的证书文件和在存储区中的证书。我们以刚才保存在E盘的test.cer文件为例,讲解如何读取本地的证书文件,并将它添加到存储区中。先看代码清单6-17。

代码清单 6-17 操作本地证书文件

class OperCert

{

internal static byte[] ReadFile(string fileName)

{

FileStream f = new FileStream(fileName, FileMode.Open, FileAccess.Read);

int size = (int)f.Length;

byte[] data = new byte[size];

size = f.Read(data, 0, size);

f.Close();

return data;

}

static void Main(string[] args)

{

try

{

X509Certificate2 x509 = new X509Certificate2();

byte[] rawData = ReadFile(@"e:\test.cer");

x509.Import(rawData);

Console.WriteLine("{0}Subject: {1}{0}", Environment.NewLine, x509.Subject);

Console.WriteLine("{0}Issuer: {1}{0}", Environment.NewLine, x509.Issuer);

Console.WriteLine("{0}Version: {1}{0}", Environment.NewLine, x509.Version);

Console.WriteLine("{0}Valid Date: {1}{0}", Environment.NewLine, x509.NotBefore);

Console.WriteLine("{0}Expiry Date: {1}{0}", Environment.NewLine, x509.NotAfter);

Console.WriteLine("{0}Thumbprint: {1}{0}", Environment.NewLine, x509.Thumbprint);

Console.WriteLine("{0}Serial Number: {1}{0}", Environment.NewLine, x509.SerialNumber);

Console.WriteLine("{0}Friendly Name: {1}{0}", Environment.NewLine, x509.PublicKey.Oid.FriendlyName);

Console.WriteLine("{0}Public Key Format: {1}{0}", Environment.NewLine, x509.PublicKey.EncodedKeyValue.Format(true));

Console.WriteLine("{0}Raw Data Length: {1}{0}", Environment.NewLine, x509.RawData.Length);

Console.WriteLine("{0}Certificate to string: {1}{0}", Environment.NewLine, x509.ToString(true));

Console.WriteLine("{0}Certificate to XML String: {1}{0}", Environment.NewLine, x509.PublicKey.Key.ToXmlString(false));

X509Store store = new X509Store();

store.Open(OpenFlags.MaxAllowed);

store.Add(x509);

store.Close();

}

catch (Exception e)

{

Console.WriteLine("Error:"+e.Message);

}

}

}

代码清单6-17演示了如何读取本地证书文件的方法。静态方法ReadFile用来从本地磁盘中读取证书文件到byte数组中。主要的操作都在Main方法中。X509Certificate2 x509 = new X509Certificate2()一句使用无参数的构造函数初始化X509Certificate2类的实例x509。然后我们使用x509.Import(rawData)语句将byte数组导入到当前证书实例。接下来是输出该证书的信息。

输出信息之后,我们看下面的四行代码:

X509Store store = new X509Store();

store.Open(OpenFlags.MaxAllowed);

store.Add(x509);

store.Close();

首先我们初始化一个X509Store类的实例store,然后使用Open方法打开存储区,添加上面读取的证书到存储区。

X509Certificate2一共提供了14个构造函数供我们使用,这里就不一一介绍了。我们也可以通过X509Certificate2类的构造函数直接导入本地的证书文件,可以使用代码清单6-18所示的方式。

代码清单6-18 使用构造函数导入证书文件

X509Certificate2 myX509Certificate2 = new X509Certificate2(

@"e:\MyTestCert.pfx", //证书路径

"password", //证书的私钥保护密码

X509KeyStorageFlags.Exportable //表示此证书的私钥以后还可以导出

);

代码清单6-18给出了如何导入带私钥保护密码的证书的方法。X509KeyStorageFlags 枚举用来标识X.509 证书的私钥导出到何处以及如何导出。该枚举的成员说明如表6-1所示。

表6-1 X509KeyStorageFlags 枚举说明


成员名称

说明

DefaultKeySet

使用默认的密钥集。用户密钥集通常为默认值。

UserKeySet

私钥存储在当前用户存储区而不是本地计算机存储区。既使证书指定密钥应存储在本地计算机存储区,私钥也会存储到当前用户存储区。

MachineKeySet

私钥存储在本地计算机存储区而不是当前用户存储区。

Exportable

导入的密钥被标记为可导出。

UserProtected

通过对话框或其他方法,通知用户密钥被访问。使用的加密服务提供程序 (CSP) 定义确切的行为。

PersistKeySet

导入证书时会保存与 PFX 文件关联的密钥。

那么如何操作存储区中的证书呢,可以使用代码清单6-19的方式。

代码清单6-19 操作存储区中的证书

X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);

store.Open(OpenFlags.ReadOnly);

//轮询存储区中的所有证书

foreach(X509Certificate2 myX509Certificate2 in store.Certificates)

{

//将证书的名称跟要导出的证书MyTestCert比较,找到要导出的证书

if (myX509Certificate2.Subject == "CN=TestCert")

{

//证书导出到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();

代码清单6-19首先声明X509Store类的实例store,使用了两个参数的构造函数,第一个参数是存储容器的名称,StoreName枚举只能枚举系统默认的存储区名称。第二个参数是StoreLocation枚举,用来标识是本机证书还是当前用户证书。导出容器证书使用的是Export方法。第一个参数X509ContentType.Pfx表示要导出为含有私钥的pfx证书形式,第二个参数为私钥保护密码。如果要导出为不含私钥的cer证书,第一个参数使用X509ContentType.Cert,表示导出为不含私钥的cer证书,也就不需要密码了。

  • 创建发行者证书

发行者证书是验证发行者可靠性的证书文件,保护证书发行者的签名。我们可以从证书颁发机构获得该文件。做为程序测试,我们可以使用Cert2spc.exe来生成发行者证书。从命令行启动该程序,如图6-32所示。

图6-32 生成SPC文件

如图6-32,我们使用Cert2spc.exe以test.cer为参数生成目标为tset.spc的发行者证书,如果存在多个证书文件,可以作为参数以空格隔开生成统一的发行者证书。

  • 使用证书对文件签名

签名工具 (SignTool.exe) 是一个命令行工具,用于对文件进行数字签名,验证文件或时间戳文件中的签名。我们可以对cab文件、dll文件或者其他文件进行签名,从互联网访问这些文件的时候就需要安装和验证证书。该工具详细的说明读者可以从MSDN上找到,我就不在重复了。

转: 在.NET中操作数字证书的更多相关文章

  1. 在.NET中操作数字证书(新手教程)

    .NET为我们提供了操作数字证书的两个主要的类,分为为: System.Security.Cryptography.X509Certificates.X509Certificate2类, 每个这个类的 ...

  2. [转载]JavaEE学习篇之——网络传输数据中的密码学知识以及Tomcat中配置数字证书EE

    原文链接:http://blog.csdn.net/jiangwei0910410003/article/details/21716557 今天是学习JavaWeb的第二天,我们来了解什么呢?就了解一 ...

  3. RSA原理、ssl认证、Tomcat中配置数字证书以及网络传输数据中的密码学知识

      情形一:接口的加.解密与加.验签 rsa不是只有加密解密,除此外还有加签和验签.之前一直误以为加密就是加签,解密就是验签.这是错误的! 正确的理解是: 数据传输的机密性:公钥加密私钥解密是密送,保 ...

  4. JavaWeb学习篇之----Tomcat中配置数字证书以及网络传输数据中的密码学知识

    今天是学习JavaWeb的第二天,我们来了解什么呢?就了解一下Tomcat中配置数字证书的相关内容,但是在说这部分内容的时候,我们貌似得先说一下数字证书的相关概念,那说到数字证书的时候我们还得了解一些 ...

  5. 转: 如何从keystore file中查看数字证书信息

    转: http://www.shuziqianming.com/201302/certificate-information-in-a-keystore-file/ 如何从keystore file中 ...

  6. 在IIS站点中使用数字证书

    1. SSL解析(内容来自百度百科) SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安 ...

  7. 【转】NET中管理数字证书(Digital Certificate)的一些类

    http://blog.csdn.net/bat800/article/details/2314510 http://blog.csdn.net/zjlovety/article/details/72 ...

  8. https原理及其中所包含的对称加密、非对称加密、数字证书、数字签名

    声明:本文章已授权公众号Hollis转载,如需转载请标明转载自https://www.cnblogs.com/wutianqi/p/10654245.html(安静的boy) 一.为什么要使用http ...

  9. 数字证书简介及Java编码实现

    1.数字证书简介 数字证书具备常规加密解密必要的信息,包含签名算法,可用于网络数据加密解密交互,标识网络用户(计算机)身份.数字证书为发布公钥提供了一种简便的途径,其数字证书则成为加密算法以及公钥的载 ...

随机推荐

  1. USB接口介绍

        USB设备系统分为两个部分,USB Host端和USB Device端,以USB接口的U盘为例子,U盘自身是一个USB Device,PC机的USB接口以及相关的控制电路为USB Host部分 ...

  2. 利用rsyslog 对linux 操作进行审计

    环境:客户端和服务端都需要安装rsyslog服务 rsyslog  server端 cd /etc/rsyslog.d/ cat server.conf $ModLoad imtcp $InputTC ...

  3. WP开发笔记——去除 HTML 标签

    获取到一段HTML类型的信息,显示在WP的webbrowser控件中,如果不加处理的话,会显示出各种神烦的HTML标签. 这时,需要我们将这HTML类型的信息进行处理去除HTML标签后再显示出来,这里 ...

  4. 第一行代码 Android 第二版到货啦

    今日android第一行代码[第二版]已到,收获的季节到了 先看一下封面 书签: 以后就把空闲时间送给它吧 先来看一下本书的目录: 第1章 开始启程--你的第1行Android代码 第2章 先从看得到 ...

  5. Amazon Kinesis Producer Library 使用记录

    Amazon Kinesis 是一种托管的服务,用于有弹性与扩展性的实时处理大规模的流数据.该服务收集大数据记录流,多个可在 Amazon EC2 实例上运行的数据处理应用程序随后可实时使用此流. 在 ...

  6. spring与MyBatis结合

    下面将介绍使用spring+mybatis的开发样例: 首先,笔者创建的是一个maven工程,在开发先先导入相关的依赖jar: pom.xml: <dependencies> <de ...

  7. postgreSQL数据库(索引、视图)

    索引的含义与特点 索引是一个单独的.存储在磁盘上的数据库结构,它们包含对数据所有记录的引用指针,postgresql列类型都可以被索引,对相关列索引是提高查询操作效率的最佳途径.例如,查询select ...

  8. Ubuntu下Apache+php+mysql网站架设详解

    目录 1 基础 2 安装 2.1 安装LAMP 2.2 图形化管理软件(可选) 2.2.1 安装webmin 2.2.2 安装phpmyadmin 3 配置文件路径 3.1 常用命令 3.2 配置ap ...

  9. [转]教大家如何打造使用Tcpview(tcp查看器

    原文地址:教大家如何打造使用Tcpview(tcp查看器)作者:jybasenet3   一玩 VS 对战平台的同学有一次发现了一个可以踢人的方法,就是用 TcpView 把那个连 接关掉.后来VS ...

  10. 微软职位内部推荐-Sr SDE for Win Apps Ecosystem

    微软近期Open的职位: Job posting title: Senior Software Design Engineer Location: China, Beijing Level: 63 D ...