RSA数字证书管理分为以下几个部分:

1:在存储区内创建数字证书;

2:导出数字证书私钥;

3:导出数字证书公钥;

4:导入数字证书;

5:读取数字证书。

1:在.net开发环境中,在证书存储区内创建数字证书

数字证书生成,需要指定证书主题,以及本机makecert.exe程序路径,因为证书制作实际上还是用makecert.exe来生成的。生成数字证书代码 如下:

         /// <summary>
         /// 根据指定的证书名和makecert全路径生成证书(包含公钥和私钥,并保存在MY存储区)
         /// </summary>
         /// <param name="subjectName"></param>
         /// <param name="makecertPath"></param>
         /// <returns></returns>
         public static bool CreateCertWithPrivateKey(string subjectName, string makecertPath)
         {
             subjectName = "CN=" + subjectName;
             string param = " -pe -ss my -n \"" + subjectName + "\" ";
             try
             {
                 Process p = Process.Start(makecertPath, param);
                 p.WaitForExit();
                 p.Close();
             }
             catch (Exception e)
             {
                 return false;
             }
             return true;
         }    

2:导出数字证书公钥

导出数字证书的公钥(cer)需要指定需要导出的证书主题,并指定路径,从系统证书存储区导出cer公钥文件,代码如下:

         /// <summary>
         /// 从WINDOWS证书存储区的个人MY区找到主题为subjectName的证书,并导出为CER文件
         /// </summary>
         /// <param name="subjectName"></param>
         /// <param name="cerFileName"></param>
         /// <returns></returns>
         public static bool ExportToCerFile(string subjectName, string cerFileName)
         {
             subjectName = "CN=" + subjectName;
             var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
             store.Open(OpenFlags.ReadWrite);
             var storecollection = store.Certificates;
             foreach (var x509 in storecollection)
             {
                 if (x509.Subject == subjectName)
                 {
                     Debug.Print(string.Format("certificate name: {0}", x509.Subject));
                     //byte[] pfxByte = x509.Export(X509ContentType.Pfx, password);
                     byte[] cerByte = x509.Export(X509ContentType.Cert);
                     using (var fileStream = new FileStream(cerFileName, FileMode.Create))
                     {
                         // Write the data to the file, byte by byte.
                         ; i < cerByte.Length; i++)
                             fileStream.WriteByte(cerByte[i]);
                         // Set the stream position to the beginning of the file.
                         fileStream.Seek(, SeekOrigin.Begin);
                         // Read and verify the data.
                         ; i < fileStream.Length; i++)
                         {
                             if (cerByte[i] != fileStream.ReadByte())
                             {
                                 fileStream.Close();
                                 return false;
                             }
                         }
                         fileStream.Close();
                     }
                 }
             }
             store.Close();
             store = null;
             storecollection = null;
             return true;
         }

3:导出数字证书私钥

导出数字证书的私钥(pfx)需要指定需要导出的证书主题,私钥证书密码,以及保存路径,从系统证书存储区导出pfx私钥文件,代码如下:

         /// <summary>
         /// 从WINDOWS证书存储区的个人MY区找到主题为subjectName的证书,
         /// 并导出为pfx文件,同时为其指定一个密码
         /// 并将证书从个人区删除(如果isDelFromstore为true)
         /// </summary>
         /// <param name="subjectName">证书主题,不包含CN=</param>
         /// <param name="pfxFileName">pfx文件名</param>
         /// <param name="password">pfx文件密码</param>
         /// <param name="isDelFromStore">是否从存储区删除</param>
         /// <returns></returns>
         public static bool ExportToPfxFile(string subjectName, string pfxFileName,
             string password, bool isDelFromStore)
         {
             subjectName = "CN=" + subjectName;
             var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
             store.Open(OpenFlags.ReadWrite);
             var storecollection = store.Certificates;
             foreach (var x509 in storecollection)
             {
                 if (x509.Subject == subjectName)
                 {
                     Debug.Print(string.Format("certificate name: {0}", x509.Subject));

                     byte[] pfxByte = x509.Export(X509ContentType.Pfx, password);
                     using (var fileStream = new FileStream(pfxFileName, FileMode.Create))
                     {
                         // Write the data to the file, byte by byte.
                         ; i < pfxByte.Length; i++)
                             fileStream.WriteByte(pfxByte[i]);
                         // Set the stream position to the beginning of the file.
                         fileStream.Seek(, SeekOrigin.Begin);
                         // Read and verify the data.
                         ; i < fileStream.Length; i++)
                         {
                             if (pfxByte[i] != fileStream.ReadByte())
                             {
                                 fileStream.Close();
                                 return false;
                             }
                         }
                         fileStream.Close();
                     }
                     if (isDelFromStore == true)
                         store.Remove(x509);
                 }
             }
             store.Close();
             store = null;
             storecollection = null;
             return true;
         }

4:导入数字证书

在获取了数字证书的公钥与私钥文件之后,

服务器端导入pfx数字证书(私钥),在客户端导入cer数字证书(公钥)。具体导入注意事项如下:

1:数字证书(cer,pfx)导入的存储位置选择“本地计算机”;

2:私钥证书(pfx)导入需要输入数字证书生成密码,并且勾选”标志此密钥为可导出的密钥…“复选框;

3:指定证书导入位置,浏览选择项:“可信任人”选项;

服务器端及客户端均按照上述流程导入即可。

5:读取数字证书

读取私钥证书:

         /// <summary>
         /// 根据私钥证书得到证书实体,得到实体后可以根据其公钥和私钥进行加解密
         /// 加解密函数使用DEncrypt的RSACryption类
         /// </summary>
         /// <param name="pfxFileName"></param>
         /// <param name="password"></param>
         /// <returns></returns>
         public static X509Certificate2 GetCertificateFromPfxFile(string pfxFileName,
             string password)
         {
             try
             {
                 return new X509Certificate2(pfxFileName, password, X509KeyStorageFlags.Exportable);
             }
             catch (Exception e)
             {
                 return null;
             }
         }

读取公钥证书:

         /// <summary>
         /// 根据公钥证书,返回证书实体
         /// </summary>
         /// <param name="cerPath"></param>
         public static X509Certificate2 GetCertFromCerFile(string cerPath)
         {
             try
             {
                 return new X509Certificate2(cerPath);
             }
             catch (Exception e)
             {
                 return null;
             }
         }

RSA数字证书管理的更多相关文章

  1. Fabric CA/数字证书管理

    MSP(Membership Service Provider)成员管理服务提供商 名词: 1.CSR(Cerificate Signing Request):证书签署请求文件 CSR里包含申请者的 ...

  2. 数字证书管理工具keytool常用命令介绍

    需要给一个apk加签名,用到了keytool这个工具,下面转载一篇介绍keytool的文章 http://blog.chinaunix.net/uid-17102734-id-2830223.html ...

  3. 数字证书管理工具openssl和keytool的区别

    1. 用SSL进行双向身份验证意思就是在客户机连接服务器时,链接双方都要对彼此的数字证书进行验证,保证这是经过授权的才能够连接(我们链接一般的SSL时采用的是单向验证,客户机只验证服务器的证书,服务器 ...

  4. 第十四章 数字签名算法--RSA

    注意:本节内容主要参考自 <Java加密与解密的艺术(第2版)>第9章“带密钥的消息摘要算法--数字签名算法” <大型分布式网站架构(设计与实践)>第3章“互联网安全架构” 1 ...

  5. 数字签名算法rsa

    数字签名算法消息传递模型 由消息发送方构建密钥对,这里由甲方完成. 由消息发送方公布公钥至消息接收方,这里由甲方将公钥公布给乙方. 注意如加密算法区别,这里甲方使用私钥对数据签名,数据与签名形成一则消 ...

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

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

  7. 数字签名、数字证书的原理以及证书的获得java版

    数字签名原理简介(附数字证书) 首先要了解什么叫对称加密和非对称加密,消息摘要这些知识. 1. 非对称加密 在通信双方,如果使用非对称加密,一般遵从这样的原则:公钥加密,私钥解密.同时,一般一个密钥加 ...

  8. 基于开源CA系统ejbca community 6.3.1.1构建私有CA管理数字证书

    最后更新于2017年01月24日 一.为什么 为什么写这篇文章?ca是什么?数字证书是什么?ejbca又是什么? 让我们从http与https说起.http是超文本传输协议(HyperText Tra ...

  9. ECDSA数字签名算法

    一.ECDSA概述 椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟.ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准.它在 ...

随机推荐

  1. [No000053]我25岁了,是应该继续挣钱,还是选择自己的爱好?--正好庆祝自己25岁生日

    你所问的问题正是问题所在.停止做出重大决策,专注于缩小你想到达的地位与你之间的差距. 成功的生活并非由简单而鲜明的决定组成,它们更像这幅图: 但悲伤的是,太多人的状态类似于这幅图: 我知道这听上去很显 ...

  2. Java—Servlet开发

    Servlet API中有4个java包: javax.servlet:包含定义Servlet与Servlet容器之间契约的类与接口. javax.servlet.http:包含定义HTTPServl ...

  3. iOS Block 内存管理的探讨

    在很多情况下Block是造成程序循环引用内存泄漏的元凶.下面我们就讲解一下block对内存管理的影响.在讲解之前.希望大家对block有一定的了解.如果大家还不是太清楚block的实现原理.希望大家可 ...

  4. Python的高级特性9:蹩脚的多态

    学习了java再来看python的多态,总感觉怪怪的,很蹩脚.. 1.python的父类根本不能调用子类的方法,只能蹩脚的依靠重写方法,然后在运行时去调用,实现伪多态... 2.所谓的鸭子类型看起来很 ...

  5. 叫板OpenStack:用Docker实现私有云

    看到各大厂商的云主机,会不会觉得高大上?目前大公司的主流方案是OpenStack,比如某个公司的私有云

  6. CefSharp的引用、配置、实例

    CefSharp的引用.配置.实例与报错排除(源码) Winform下CefSharp的引用.配置.实例与报错排除 本文详细介绍了CefSharp在vs2013..net4.0环境下,创建Winfro ...

  7. spring 3.2.x + struts2 + mybatis 3.x + logback 整合配置

    与前面的一篇mybatis 3.2.7 与 spring mvc 3.x.logback整合 相比,只是web层的MVC前端框架,从spring mvc转换成struts 2.x系列,变化并不大 一. ...

  8. 批处理将字符串输出到Windows剪贴板

    批处理将字符串输出到Windows剪贴板 2016-06-30 23:29 339人阅读 评论(0) 收藏 举报 版权声明:作者:N3verL4nd 出处:http://blog.csdn.net/x ...

  9. 关于用mybatis调用存储过程时的入参和出参的传递方法

    一.问题描述 a)         目前调用读的存储过程的接口定义一般是:void  ReadDatalogs(Map<String,Object> map);,入参和出参都在这个map里 ...

  10. #CSDN刷票门# 有没有人在恶意刷票?CSDN请告诉我!用24小时监控数据说话!

    特别声明: 此次并非针对其他参与2013中国十大优秀开源项目的同行,体系有漏洞要谴责的是制定规则并从中获益但不作为的权贵,草根们制定不了规则但可发现和利用漏洞,这是程序员应有反叛精神没错.但被作为道具 ...