从自签名证书导出pfx和cer证书

完整代码:

  1 public sealed class DataCertificate
  2     {
  3         #region 生成证书
  4         /// <summary>
  5         /// 根据指定的证书名和makecert全路径生成证书(包含公钥和私钥,并保存在MY存储区)
  6         /// </summary>
  7         /// <param name="subjectName"></param>
  8         /// <param name="makecertPath"></param>
  9         /// <returns></returns>
 10         public static bool CreateCertWithPrivateKey(string subjectName, string makecertPath)
 11         {
 12             subjectName = "CN=" + subjectName;
 13             string param = " -pe -ss my -n \"" + subjectName + "\" ";
 14             try
 15             {
 16                 Process p = Process.Start(makecertPath, param);
 17                 p.WaitForExit();
 18                 p.Close();
 19             }
 20             catch (Exception e)
 21             {
 22                 return false;
 23             }
 24             return true;
 25         }
 26         #endregion
 27
 28         #region 文件导入导出
 29         /// <summary>
 30         /// 从WINDOWS证书存储区的个人MY区找到主题为subjectName的证书,
 31         /// 并导出为pfx文件,同时为其指定一个密码
 32         /// 并将证书从个人区删除(如果isDelFromstor为true)
 33         /// </summary>
 34         /// <param name="subjectName">证书主题,不包含CN=</param>
 35         /// <param name="pfxFileName">pfx文件名</param>
 36         /// <param name="password">pfx文件密码</param>
 37         /// <param name="isDelFromStore">是否从存储区删除</param>
 38         /// <returns></returns>
 39         public static bool ExportToPfxFile(string subjectName, string pfxFileName,
 40             string password, bool isDelFromStore)
 41         {
 42             subjectName = "CN=" + subjectName;
 43             X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
 44             store.Open(OpenFlags.ReadWrite);
 45             X509Certificate2Collection storecollection = (X509Certificate2Collection)store.Certificates;
 46             foreach (X509Certificate2 x509 in storecollection)
 47             {
 48                 if (x509.Subject == subjectName)
 49                 {
 50                     Debug.Print(string.Format("certificate name: {0}", x509.Subject));
 51
 52                     byte[] pfxByte = x509.Export(X509ContentType.Pfx, password);
 53                     using (FileStream fileStream = new FileStream(pfxFileName, FileMode.Create))
 54                     {
 55                         // Write the data to the file, byte by byte.
 56                         for (int i = 0; i < pfxByte.Length; i++)
 57                             fileStream.WriteByte(pfxByte[i]);
 58                         // Set the stream position to the beginning of the file.
 59                         fileStream.Seek(0, SeekOrigin.Begin);
 60                         // Read and verify the data.
 61                         for (int i = 0; i < fileStream.Length; i++)
 62                         {
 63                             if (pfxByte[i] != fileStream.ReadByte())
 64                             {
 65                                 fileStream.Close();
 66                                 return false;
 67                             }
 68                         }
 69                         fileStream.Close();
 70                     }
 71                     if (isDelFromStore == true)
 72                         store.Remove(x509);
 73                 }
 74             }
 75             store.Close();
 76             return true;
 77         }
 78         /// <summary>
 79         /// 从WINDOWS证书存储区的个人MY区找到主题为subjectName的证书,
 80         /// 并导出为CER文件(即,只含公钥的)
 81         /// </summary>
 82         /// <param name="subjectName"></param>
 83         /// <param name="cerFileName"></param>
 84         /// <returns></returns>
 85         public static bool ExportToCerFile(string subjectName, string cerFileName)
 86         {
 87             subjectName = "CN=" + subjectName;
 88             X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
 89             store.Open(OpenFlags.ReadWrite);
 90             X509Certificate2Collection storecollection = (X509Certificate2Collection)store.Certificates;
 91             foreach (X509Certificate2 x509 in storecollection)
 92             {
 93                 if (x509.Subject == subjectName)
 94                 {
 95                     Debug.Print(string.Format("certificate name: {0}", x509.Subject));
 96                     //byte[] pfxByte = x509.Export(X509ContentType.Pfx, password);
 97                     byte[] cerByte = x509.Export(X509ContentType.Cert);
 98                     using (FileStream fileStream = new FileStream(cerFileName, FileMode.Create))
 99                     {
100                         // Write the data to the file, byte by byte.
101                         for (int i = 0; i < cerByte.Length; i++)
102                             fileStream.WriteByte(cerByte[i]);
103                         // Set the stream position to the beginning of the file.
104                         fileStream.Seek(0, SeekOrigin.Begin);
105                         // Read and verify the data.
106                         for (int i = 0; i < fileStream.Length; i++)
107                         {
108                             if (cerByte[i] != fileStream.ReadByte())
109                             {
110                                 fileStream.Close();
111                                 return false;
112                             }
113                         }
114                         fileStream.Close();
115                     }
116                 }
117             }
118             store.Close();
119             store = null;
120             storecollection = null;
121             return true;
122         }
123         #endregion
124
125         #region 从证书中获取信息
126         /// <summary>
127         /// 根据私钥证书得到证书实体,得到实体后可以根据其公钥和私钥进行加解密
128         /// 加解密函数使用DEncrypt的RSACryption类
129         /// </summary>
130         /// <param name="pfxFileName"></param>
131         /// <param name="password"></param>
132         /// <returns></returns>
133         public static X509Certificate2 GetCertificateFromPfxFile(string pfxFileName,
134             string password)
135         {
136             try
137             {
138                 return new X509Certificate2(pfxFileName, password, X509KeyStorageFlags.Exportable);
139             }
140             catch (Exception e)
141             {
142                 return null;
143             }
144         }
145         /// <summary>
146         /// 到存储区获取证书
147         /// </summary>
148         /// <param name="subjectName"></param>
149         /// <returns></returns>
150         public static X509Certificate2 GetCertificateFromStore(string subjectName)
151         {
152             subjectName = "CN=" + subjectName;
153             X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
154             store.Open(OpenFlags.ReadWrite);
155             X509Certificate2Collection storecollection = (X509Certificate2Collection)store.Certificates;
156             foreach (X509Certificate2 x509 in storecollection)
157             {
158                 if (x509.Subject == subjectName)
159                 {
160                     return x509;
161                 }
162             }
163             store.Close();
164             store = null;
165             storecollection = null;
166             return null;
167         }
168         /// <summary>
169         /// 根据公钥证书,返回证书实体
170         /// </summary>
171         /// <param name="cerPath"></param>
172         public static X509Certificate2 GetCertFromCerFile(string cerPath)
173         {
174             try
175             {
176                 return new X509Certificate2(cerPath);
177             }
178             catch (Exception e)
179             {
180                 return null;
181             }
182         }
183         #endregion
184     }
时间: 2024-08-24 12:03:17

从自签名证书导出pfx和cer证书的相关文章

详解关于Pfx与cer之间的关系

Pfx与cer均为证书的文件格式,它们之间区别为 1.带有私钥的证书 由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名. 2.二进制编码的证书 证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名. 3.编码的证书 证书中没有私钥, 编码格式的证书文件,也是以cer作为证书文件后缀名. 由定义可以看出,只有pfx格式的数字证书是包含有私钥的,cer格式的

[转载] 创建为ClickOnce清单签名的.pfx格式数字证书

使用vs2013自动创建的.pfx数字证书默认有效期只有一年,并且“颁发者”.“颁发给”均为当前机器名和当前登陆用户名的组合,其实我们完全可以创建更友好的.pfx数字证书. 打开Microsoft .NET Framework 的SDK命令提示,按以下步骤操作: 1.创建一个自我签署的X.509证书(.cer)和一个.pvk私钥文件,用到makecert工具,命令如下: makecert -r -n "CN= sndnvaps " -b 08/31/2015 -e 08/31/2030

如何导出cer证书及证书链的生成

如何导出cer证书的Base64编码信息 1.将证书双击,安装到IE中,如果是个人证书会安装到:在IE的 工具 -> internet选项  -> 内容 -> 证书 -> 个人2.打开IE,在在IE的 工具 -> internet选项  -> 内容 -> 证书 -> 个人 中,找到这张证书,选中它3.点击"导出"按钮4.点击"下一步",再点击"下一步"5.选择"Base64编码X.509(

.P7B 证书转换为 .PFX

.P7B 转换为 .PFX 1.下载openssl工具,(这里以windows系统为例) https://www.chinassl.net/download/d1.html 2.格式转换 P7B (PKCS#7) 一个P7B文件是一个包含证书和证书链的文本文件,但不包含私钥. PFX (PKCS#12) 为存储和传输用户或服务器私钥.公钥和证书指定了一个可移植的格式.它是一种二进制格式,这些文件也称为PFX文件. 转换 P7B 为 PFX 需要注意的是,为了做转换,你必须拥有证书cert.p7b

jks cer 证书生成

jks是java keystore的简称,是java的数字证书库,查看证书私钥需要密码,避免私钥一名文的形式出现在代码中 情景一:客户端签名,服务器验签,确定是否是自己人 使用keytool生成jks,keytool工具在java->jdk->bin目录下,使用命令行,ps:红色部分请自行替换 keytool -genkey -alias 别名 -keyalg RSA -keystore 文件名.jks 经过一番复杂的输入,生成的jks文件在桌面->我的文档根目录下,这个jks里包含了自

java 调用 keytool 生成keystore 和 cer 证书

keytool是一个Java数据证书的管理工具, keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里, 包含两种数据: 密钥实体(Key entity)——密钥(secret key)又或者是私钥和配对公钥(采用非对称加密) 可信任的证书实体(trusted certificate entries)——只包含公钥 ailas(别名)每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写 下面给出一

部署exchange2010三合一:之九:证书导出导入

1. 在exchange第一台服务器中选中证书服务---导出exchange证书 浏览到导出证书的存放路径,填写证书密码,密码必填,导出 导出成功 2. 将证书导入到第二台exchange服务器.选中第二台服务器----选择导入exchange证书 浏览证书存放路径---输入证书的密码----下一步 默认下一步 导入 导入完成 3. 分配证书 选中刚刚导入的证书---为证书分配服务 默认下一步 按照下图勾选----下一步 分配 在弹出的窗口选"是" 分配完成 删除exchange自签名

如何用OpenSSL从https网站上导出SSL的CA证书?

我们在访问https的时候,对于有的程序需要提供访问网站的CA证书,这个时候客户端才能访问系统网站,比如使用TIBCO Business Workspace 5 HTTP send request activty 去访问Google API提供的REST 服务的时候,就需要我们提供www.googleapis.com网站的CA证书.一般来说,用两种比较常用的方式,第一种方式是通过浏览器访问这个网站,然后在网站的地址栏的右边有一个锁,可以通过点击这个锁来查看和导入证书,这种方式只适合那种网站可以在

cer证书签名验证

一个cer证书本身也是需要签名的,这是为了防止cer证书被篡改. 证书有两种类型: 1. 根证书 2. 根证书签发的子证书. 根证书比较特殊,它是自签名的.而其他子证书的签名公钥都保存在它的上级证书里面. 可以用C#来做一些验证. 首先是根证书的签名验证. // 验证根证书签名 X509Certificate2 x509Root = new X509Certificate2("C:\\Users\\kevin\\Desktop\\KevinRoot.cer"); Console.Wri