码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-09-16 19:26:20      阅读:303      评论:0      收藏:0      [点我收藏+]

标签:

完整代码:

  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     }

 

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

标签:

原文地址:http://www.cnblogs.com/frankyou/p/4813866.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!