已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文详细和大家讲下.NET中如何操作数字证书,包括如何生成证书、编程操作证书、创建发行者证书等等步骤。.NET为我们提供了操作数字证书的两个主要的类,分为为:System.Security.Cryptography.X509Certificates.X509Certificate2类,每个这个类的实例可以表示一个证书;System.Security.Cryptography.X509Certificates.X509Store类,可以对保存在计算机安全区域内的证书进行add/remove/get操作。另外我们可以使用System.Security.Cryptography.X509Certificates.X509Certificate2UI类来显示证书消息的对话框,它就是在IE中的证书查看器的.NE实现。生成证书在介绍以上类的使用方法之前,我们先要拥有一个数字证书,获取数字证书有三种方法,一是从CA机构申请,二是自己搭建服务器发布证书,三是使用makecert.exe来生成一个证书文件。这里我们使用makecert.exe来生成一个证书文件,用来测试。启动VS2010的命令行,输入对应参数,生成名为TestCertificates的证书文件。如图6-28所示。图6-28 生成证书makecert.exe的参数读者可以查看帮助,这里只解释图6-28中的参数。makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=MyServerCert -sky exchange pe参数说明:-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 操作本地证书文件1. classOperCert 2. 3. internalstaticbyteReadFile(stringfileName) 4. 5. FileStreamf=newFileStream(fileName,FileMode.Open,FileAccess.Read); 6. intsize=(int)f.Length; 7. bytedata=newbytesize; 8. size=f.Read(data,0,size); 9. f.Close(); 10. returndata; 11. 12. staticvoidMain(stringargs) 13. 14. try15. 16. X509Certificate2x509=newX509Certificate2(); 17. byterawData=ReadFile(e:test.cer); 18. x509.Import(rawData); 19. Console.WriteLine(0Subject:10,Environment.NewLine,x509.Subject); 20. Console.WriteLine(0Issuer:10,Environment.NewLine,x509.Issuer); 21. Console.WriteLine(0Version:10,Environment.NewLine,x509.Version); 22. Console.WriteLine(0ValidDate:10,Environment.NewLine,x509.NotBefore); 23. Console.WriteLine(0ExpiryDate:10,Environment.NewLine,x509.NotAfter); 24. Console.WriteLine(0Thumbprint:10,Environment.NewLine,x509.Thumbprint); 25. Console.WriteLine(0SerialNumber:10,Environment.NewLine,x509.SerialNumber); 26. Console.WriteLine(0FriendlyName:10,Environment.NewLine,x509.PublicKey.Oid.FriendlyName); 27. Console.WriteLine(0PublicKeyFormat:10,Environment.NewLine,x509.PublicKey.EncodedKeyValue.Format(true); 28. Console.WriteLine(0RawDataLength:10,Environment.NewLine,x509.RawData.Length); 29. Console.WriteLine(0Certificatetostring:10,Environment.NewLine,x509.ToString(true); 30. Console.WriteLine(0CertificatetoXMLString:10,Environment.NewLine,x509.PublicKey.Key.ToXmlString(false); 31. X509Storestore=newX509Store(); 32. store.Open(OpenFlags.MaxAllowed); 33. store.Add(x509); 34. store.Close(); 35. 36. catch(Exceptione) 37. 38. Console.WriteLine(Error:+e.Message); 39. 40. 41. 代码清单6-17演示了如何读取本地证书文件的方法。静态方法ReadFile用来从本地磁盘中读取证书文件到byte数组中。主要的操作都在Main方法中。X509Certificate2 x509 = new X509Certificate2()一句使用无参数的构造函数初始化X509Certificate2类的实例x509。然后我们使用x509.Import(rawData)语句将byte数组导入到当前证书实例。接下来是输出该证书的信息。输出信息之后,我们看下面的四行代码:1. X509Storestore=newX509Store(); 2. store.Open(OpenFlags.MaxAllowed); 3. store.Add(x509); 4. store.Close();首先我们初始化一个X509Store类的实例store,然后使用Open方法打开存储区,添加上面读取的证书到存储区。X509Certificate2一共提供了14个构造函数供我们使用,这里就不一一介绍了。我们也可以通过X509Certificate2类的构造函数直接导入本地的证书文件,可以使用代码清单6-18所示的方式。代码清单6-18 使用构造函数导入证书文件1. X509Certificate2myX509Certificate2=newX509Certificate2( 2. e:MyTestCert.pfx,/证书路径 3. password,/证书的私钥保护密码 4. X509KeyStorageFlags.Exportable/表示此证书的私钥以后还可以导出 5. );代码清单6-18给出了如何导入带私钥保护密码的证书的方法。X509KeyStorageFlags 枚举用来标识X.509 证书的私钥导出到何处以及如何导出。该枚举的成员说明如表6-1所示。表6-1 X509KeyStorageFlags 枚举说明成员名称说明DefaultKeySet使用默认的密钥集。用户密钥集通常为默认值。UserKeySet私钥存储在当前用户存储区而不是本地计算机存储区。既使证书指定密钥应存储在本地计算机存储区,私钥也会存储到当前用户存储区。MachineKeySet私钥存储在本地计算机存储区而不是当前用户存储区。Exportable导入的密钥被标记为可导出。UserProtected通过对话框或其他方法,通知用户密钥被访问。使用的加密服务提供程序 (CSP) 定义确切的行为。PersistKeySet导入证书时会保存与 PFX 文件关联的密钥。那么如何操作存储区中的证书呢,可以使用代码清单6-19的方式。代码清单6-19 操作存储区中的证书1. X509Storestore=newX509Store(StoreName.My,StoreLocation.CurrentUser); 2. store.Open(OpenFlags.ReadOnly); 3. /轮询存储区中的所有证书 4. foreach(X509Certificate2myX509Certificate2instore.Certificates) 5. 6. /将证书的名称跟要导出的证书MyTestCert比较,找到要导出的证书 7. if(myX509Certificate2.Subject=CN=TestCert) 8. 9. /证书导出到byte中,password为私钥保护密码 10. byteCertByte=myX509Certificate2.Export(X509ContentType.Pfx,password); 11. /将证书的字节流写入到证书文件 12. FileStreamfStream=newFileStream( 13. C:SamplesPartnerAEncryptMsgMyTestCert_Exp.pfx, 14. FileMode.Create, 15. FileAccess.Write); 16. fStream.Write(CertByte,0,CertByte.Length); 17. fStream.Close(); 18. 19. 20. 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上找到,我就不在重复了。证书创建工具 (Makecert.exe)NET Framework 工具证书创建工具 (Makecert.exe)证书创建工具生成仅用于测试目的的 X.509 证书。它创建用于数字签名的公钥和私钥对,并将其存储在证书文件中。此工具还将密钥对与指定发行者的名称相关联,并创建一个 X.509 证书,该证书将用户指定的名称绑定到密钥对的公共部分。Makecert.exe 包含基本选项和扩展选项。基本选项是最常用于创建证书的选项。扩展选项提供更多的灵活性。一定不要将此工具生成的证书私钥存储在 .snk 文件中。如果需要存储私钥,则应使用密钥容器。有关如何在密钥容器中存储私钥的更多信息,请参见如何:将非对称密钥存储在密钥容器中。警告应使用证书存储区来安全地存储证书。此工具使用的 .snk 文件以不受保护的方式存储私钥。创建或导入 .snk 文件时,在使用期间应注意保证其安全,并在使用后将其移除。makecert options outputCertificateFile参数说明outputCertificateFile测试 X.509 证书要写入的 .cer 文件的名称。基本选项选项说明-nx509name指定主题的证书名称。此名称必须符合 X.500 标准。最简单的方法是在双引号中指定此名称,并加上前缀CN=;例如,CN=myName。-pe将所生成的私钥标记为可导出。这样可将私钥包括在证书中。-skkeyname指定主题的密钥容器位置,该位置包含私钥。如果密钥容器不存在,系统将创建一个。-srlocation指定主题的证书存储位置。Location可以是currentuser(默认值)或localmachine。-ssstore指定主题的证书存储名称,输出证书即存储在那里。-#number指定一个介于 1 和 2,147,483,647 之间的序列号。默认值是由 Makecert.exe 生成的唯一值。-$authority指定证书的签名权限,必须设置为commercial(对于商业软件发行者使用的证书)或individual(对于个人软件发行者使用的证书)。-?显示此工具的命令语法和基本选项列表。-!显示此工具的命令语法和扩展选项列表。扩展选项选项说明-aalgorithm指定签名算法。必须是md5(默认值)或sha1。-bmm/dd/yyyy指定有效期的开始时间。默认为证书的创建日期。-cycertType指定证书类型。有效值是end(对于最终实体)和authority(对于证书颁发机构)。-dname显示主题的名称。-emm/dd/yyyy指定有效期的结束时间。默认为 12/31/2039 11:59:59 GMT。-ekuoid,oid将用逗号分隔的增强型密钥用法对象标识符 (OID) 列表插入到证书中。-hnumber指定此证书下面的树的最大高度。-icfile指定颁发者的证书文件。-ikkeyName指定颁发者的密钥容器名称。-ikykeytype指定颁发者的密钥类型,必须是signature、exchange或一个表示提供程序类型的整数。默认情况下,可传入1表示交换密钥,传入2表示签名密钥。-inname指定颁发者的证书公用名称。-ipprovider指定颁发者的 CryptoAPI 提供程序名称。-irlocation指定颁发者的证书存储位置。Location可以是currentuser(默认值)或localmachine。-isstore指定颁发者的证书存储名称。-ivpvkFile指定颁发者的 .pvk 私钥文件。-iypvkFile指定颁发者的 CryptoAPI 提供程序类型。-llink到策略信息的链接(例如,一个 URL)。-mnumber以月为单位指定证书有效期的持续时间。-nscp包括 Netscape 客户端身份验证扩展。-r创建自签署证书。-scfile指定主题的证书文件。-skykeytype指定主题的密钥类型,必须是signature、exchange或一个表示提供程序类型的整数。默认情况下,可传入1表示交换密钥,传入2表示签名密钥。-spprovider指定主题的 CryptoAPI 提供程序名称。-svpvkFile指定主题的 .pvk 私钥文件。如果该文件不存在,系统将创建一个。-sytype指定主题的 CryptoAPI 提供程序类型。示例下面的命令创建了一个由默认测试根颁发的测试证书并将其写入testCert.cer。makecert testCert.cer下面的命令创建了一个由默认测试根颁发的证书并将其保存到证书存储区。makecert -ss testCertStore下面的命令创建了一个由默认测试根颁发的证书并将其保存到证书存储区。它将证书显式地放入currentuser存储区。makecert -ss testCertStore -sr currentuser下面的命令使用主题的密钥容器和证书主题的 X.500 名称创建一个测试证书,并将其写入textXYZ.cer。makecert -sk XYZ -n CN=XYZ Company testXYZ.cer 下面的命令创建了一个由默认测试根颁发的证书和一个 .pvk 文件,并将此证书同时输出到存储区和该文件。makecert -sv testCert.pvk -ss testCertStore t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 南充环境集团有限责任公司2025年下半年员工招聘(一)(11人)笔试参考题库附带答案详解(3卷)
- 2025年副高(外科护理)考试真题及答案
- 鸡泽县2025河北鸡泽县委人才工作领导小组博硕引才50名笔试历年参考题库典型考点附带答案详解(3卷合一)
- 江淮十校联考试卷及答案
- 大一骨伤科期末考试题库及答案
- 结构力学期末考试题库及答案
- 服装厂安全生产应急救援预案方案
- 山西省2025山西长治医学院招聘博士研究生40人笔试历年参考题库典型考点附带答案详解(3卷合一)
- 定海区2025年浙江舟山市定海区环境卫生管理中心编外招聘2人笔试历年参考题库典型考点附带答案详解(3卷合一)
- 合肥一中初三试卷及答案
- 毛孔粗大学习课件
- 2023年黄委会事业单位招聘笔试参考题库(共500题)答案详解版
- 高一定语从句课件
- 2023大中型无刷励磁发电机组主励磁机保护技术导则
- 轮状病毒性肠炎护理查房
- 史上最全博易大师指标公式编写教程、指标函数大全、指标代码大全
- 《介入放射学》考试复习题库及答案
- 中国电影史优秀课件
- 重要项目跟踪表
- 阿片类药物合理使用-章杰
- 烟草贷款话术 烟草公司的烟草贷(4篇)
评论
0/150
提交评论