亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#創建自簽名認證文件的方法

2019-10-29 21:41:01
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了C#創建自簽名認證文件的方法,實例分析了C#自簽名認證文件的實現技巧,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例講述了C#創建自簽名認證文件的方法。分享給大家供大家參考。具體如下:

 

 
  1. using System; 
  2. using System.Runtime.InteropServices; 
  3. using System.Security.Cryptography.X509Certificates; 
  4. using SecureString = System.Security.SecureString; 
  5. using RuntimeHelpers = System.Runtime.CompilerServices.RuntimeHelpers; 
  6. internal class Certificate 
  7. public static byte[] CreateSelfSignCertificatePfx( 
  8. string x500, 
  9. DateTime startTime, 
  10. DateTime endTime) 
  11. byte[] pfxData = CreateSelfSignCertificatePfx( 
  12. x500, 
  13. startTime, 
  14. endTime, 
  15. (SecureString)null); 
  16. return pfxData; 
  17. public static byte[] CreateSelfSignCertificatePfx( 
  18. string x500, 
  19. DateTime startTime, 
  20. DateTime endTime, 
  21. string insecurePassword) 
  22. byte[] pfxData; 
  23. SecureString password = null
  24. try 
  25. if (!string.IsNullOrEmpty(insecurePassword)) 
  26. password = new SecureString(); 
  27. foreach (char ch in insecurePassword) 
  28. password.AppendChar(ch); 
  29. password.MakeReadOnly(); 
  30. pfxData = CreateSelfSignCertificatePfx( 
  31. x500, 
  32. startTime, 
  33. endTime, 
  34. password); 
  35. finally 
  36. if (password != null
  37. password.Dispose(); 
  38. return pfxData; 
  39. public static byte[] CreateSelfSignCertificatePfx( 
  40. string x500, 
  41. DateTime startTime, 
  42. DateTime endTime, 
  43. SecureString password) 
  44. byte[] pfxData; 
  45. if (x500 == null
  46. x500 = ""
  47. SystemTime startSystemTime = ToSystemTime(startTime); 
  48. SystemTime endSystemTime = ToSystemTime(endTime); 
  49. string containerName = Guid.NewGuid().ToString(); 
  50. GCHandle dataHandle = new GCHandle(); 
  51. IntPtr providerContext = IntPtr.Zero; 
  52. IntPtr cryptKey = IntPtr.Zero; 
  53. IntPtr certContext = IntPtr.Zero; 
  54. IntPtr certStore = IntPtr.Zero; 
  55. IntPtr storeCertContext = IntPtr.Zero; 
  56. IntPtr passwordPtr = IntPtr.Zero; 
  57. RuntimeHelpers.PrepareConstrainedRegions(); 
  58. try 
  59. Check(NativeMethods.CryptAcquireContextW( 
  60. out providerContext, 
  61. containerName, 
  62. null
  63. 1, // PROV_RSA_FULL 
  64. 8)); // CRYPT_NEWKEYSET 
  65. Check(NativeMethods.CryptGenKey( 
  66. providerContext, 
  67. 1, // AT_KEYEXCHANGE 
  68. 1, // CRYPT_EXPORTABLE 
  69. out cryptKey)); 
  70. IntPtr errorStringPtr; 
  71. int nameDataLength = 0; 
  72. byte[] nameData; 
  73. // errorStringPtr gets a pointer into the middle of the x500 string, 
  74. // so x500 needs to be pinned until after we've copied the value 
  75. // of errorStringPtr. 
  76. dataHandle = GCHandle.Alloc(x500, GCHandleType.Pinned); 
  77. if (!NativeMethods.CertStrToNameW( 
  78. 0x00010001, // X509_ASN_ENCODING | PKCS_7_ASN_ENCODING 
  79. dataHandle.AddrOfPinnedObject(), 
  80. 3, // CERT_X500_NAME_STR = 3 
  81. IntPtr.Zero, 
  82. null
  83. ref nameDataLength, 
  84. out errorStringPtr)) 
  85. string error = Marshal.PtrToStringUni(errorStringPtr); 
  86. throw new ArgumentException(error); 
  87. nameData = new byte[nameDataLength]; 
  88. if (!NativeMethods.CertStrToNameW( 
  89. 0x00010001, // X509_ASN_ENCODING | PKCS_7_ASN_ENCODING 
  90. dataHandle.AddrOfPinnedObject(), 
  91. 3, // CERT_X500_NAME_STR = 3 
  92. IntPtr.Zero, 
  93. nameData, 
  94. ref nameDataLength, 
  95. out errorStringPtr)) 
  96. string error = Marshal.PtrToStringUni(errorStringPtr); 
  97. throw new ArgumentException(error); 
  98. dataHandle.Free(); 
  99. dataHandle = GCHandle.Alloc(nameData, GCHandleType.Pinned); 
  100. CryptoApiBlob nameBlob = new CryptoApiBlob( 
  101. nameData.Length, 
  102. dataHandle.AddrOfPinnedObject()); 
  103. CryptKeyProviderInformation kpi = new CryptKeyProviderInformation(); 
  104. kpi.ContainerName = containerName; 
  105. kpi.ProviderType = 1; // PROV_RSA_FULL 
  106. kpi.KeySpec = 1; // AT_KEYEXCHANGE 
  107. certContext = NativeMethods.CertCreateSelfSignCertificate( 
  108. providerContext, 
  109. ref nameBlob, 
  110. 0, 
  111. ref kpi, 
  112. IntPtr.Zero, // default = SHA1RSA 
  113. ref startSystemTime, 
  114. ref endSystemTime, 
  115. IntPtr.Zero); 
  116. Check(certContext != IntPtr.Zero); 
  117. dataHandle.Free(); 
  118. certStore = NativeMethods.CertOpenStore( 
  119. "Memory"// sz_CERT_STORE_PROV_MEMORY 
  120. 0, 
  121. IntPtr.Zero, 
  122. 0x2000, // CERT_STORE_CREATE_NEW_FLAG 
  123. IntPtr.Zero); 
  124. Check(certStore != IntPtr.Zero); 
  125. Check(NativeMethods.CertAddCertificateContextToStore( 
  126. certStore, 
  127. certContext, 
  128. 1, // CERT_STORE_ADD_NEW 
  129. out storeCertContext)); 
  130. NativeMethods.CertSetCertificateContextProperty( 
  131. storeCertContext, 
  132. 2, // CERT_KEY_PROV_INFO_PROP_ID 
  133. 0, 
  134. ref kpi); 
  135. if (password != null
  136. passwordPtr = Marshal.SecureStringToCoTaskMemUnicode(password); 
  137. CryptoApiBlob pfxBlob = new CryptoApiBlob(); 
  138. Check(NativeMethods.PFXExportCertStoreEx( 
  139. certStore, 
  140. ref pfxBlob, 
  141. passwordPtr, 
  142. IntPtr.Zero, 
  143. 7)); // EXPORT_PRIVATE_KEYS | REPORT_NO_PRIVATE_KEY | REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY 
  144. pfxData = new byte[pfxBlob.DataLength]; 
  145. dataHandle = GCHandle.Alloc(pfxData, GCHandleType.Pinned); 
  146. pfxBlob.Data = dataHandle.AddrOfPinnedObject(); 
  147. Check(NativeMethods.PFXExportCertStoreEx( 
  148. certStore, 
  149. ref pfxBlob, 
  150. passwordPtr, 
  151. IntPtr.Zero, 
  152. 7)); // EXPORT_PRIVATE_KEYS | REPORT_NO_PRIVATE_KEY | REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY 
  153. dataHandle.Free(); 
  154. finally 
  155. if (passwordPtr != IntPtr.Zero) 
  156. Marshal.ZeroFreeCoTaskMemUnicode(passwordPtr); 
  157. if (dataHandle.IsAllocated) 
  158. dataHandle.Free(); 
  159. if (certContext != IntPtr.Zero) 
  160. NativeMethods.CertFreeCertificateContext(certContext); 
  161. if (storeCertContext != IntPtr.Zero) 
  162. NativeMethods.CertFreeCertificateContext(storeCertContext); 
  163. if (certStore != IntPtr.Zero) 
  164. NativeMethods.CertCloseStore(certStore, 0); 
  165. if (cryptKey != IntPtr.Zero) 
  166. NativeMethods.CryptDestroyKey(cryptKey); 
  167. if (providerContext != IntPtr.Zero) 
  168. NativeMethods.CryptReleaseContext(providerContext, 0); 
  169. NativeMethods.CryptAcquireContextW( 
  170. out providerContext, 
  171. containerName, 
  172. null
  173. 1, // PROV_RSA_FULL 
  174. 0x10); // CRYPT_DELETEKEYSET 
  175. return pfxData; 
  176. private static SystemTime ToSystemTime(DateTime dateTime) 
  177. long fileTime = dateTime.ToFileTime(); 
  178. SystemTime systemTime; 
  179. Check(NativeMethods.FileTimeToSystemTime(ref fileTime, out systemTime)); 
  180. return systemTime; 
  181. private static void Check(bool nativeCallSucceeded) 
  182. if (!nativeCallSucceeded) 
  183. int error = Marshal.GetHRForLastWin32Error(); 
  184. Marshal.ThrowExceptionForHR(error); 
  185. [StructLayout(LayoutKind.Sequential)] 
  186. private struct SystemTime 
  187. public short Year; 
  188. public short Month; 
  189. public short DayOfWeek; 
  190. public short Day; 
  191. public short Hour; 
  192. public short Minute; 
  193. public short Second; 
  194. public short Milliseconds; 
  195. [StructLayout(LayoutKind.Sequential)] 
  196. private struct CryptoApiBlob 
  197. public int DataLength; 
  198. public IntPtr Data; 
  199. public CryptoApiBlob(int dataLength, IntPtr data) 
  200. this.DataLength = dataLength; 
  201. this.Data = data; 
  202. [StructLayout(LayoutKind.Sequential)] 
  203. private struct CryptKeyProviderInformation 
  204. [MarshalAs(UnmanagedType.LPWStr)] public string ContainerName; 
  205. [MarshalAs(UnmanagedType.LPWStr)] public string ProviderName; 
  206. public int ProviderType; 
  207. public int Flags; 
  208. public int ProviderParameterCount; 
  209. public IntPtr ProviderParameters; // PCRYPT_KEY_PROV_PARAM 
  210. public int KeySpec; 
  211. private static class NativeMethods 
  212. [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)] 
  213. [return: MarshalAs(UnmanagedType.Bool)] 
  214. public static extern bool FileTimeToSystemTime( 
  215. [In] ref long fileTime, 
  216. out SystemTime systemTime); 
  217. [DllImport("AdvApi32.dll", SetLastError = true, ExactSpelling = true)] 
  218. [return: MarshalAs(UnmanagedType.Bool)] 
  219. public static extern bool CryptAcquireContextW( 
  220. out IntPtr providerContext, 
  221. [MarshalAs(UnmanagedType.LPWStr)] string container, 
  222. [MarshalAs(UnmanagedType.LPWStr)] string provider, 
  223. int providerType, 
  224. int flags); 
  225. [DllImport("AdvApi32.dll", SetLastError = true, ExactSpelling = true)] 
  226. [return: MarshalAs(UnmanagedType.Bool)] 
  227. public static extern bool CryptReleaseContext( 
  228. IntPtr providerContext, 
  229. int flags); 
  230. [DllImport("AdvApi32.dll", SetLastError = true, ExactSpelling = true)] 
  231. [return: MarshalAs(UnmanagedType.Bool)] 
  232. public static extern bool CryptGenKey( 
  233. IntPtr providerContext, 
  234. int algorithmId, 
  235. int flags, 
  236. out IntPtr cryptKeyHandle); 
  237. [DllImport("AdvApi32.dll", SetLastError = true, ExactSpelling = true)] 
  238. [return: MarshalAs(UnmanagedType.Bool)] 
  239. public static extern bool CryptDestroyKey( 
  240. IntPtr cryptKeyHandle); 
  241. [DllImport("Crypt32.dll", SetLastError = true, ExactSpelling = true)] 
  242. [return: MarshalAs(UnmanagedType.Bool)] 
  243. public static extern bool CertStrToNameW( 
  244. int certificateEncodingType, 
  245. IntPtr x500, 
  246. int strType, 
  247. IntPtr reserved, 
  248. [MarshalAs(UnmanagedType.LPArray)] [Out] byte[] encoded, 
  249. ref int encodedLength, 
  250. out IntPtr errorString); 
  251. [DllImport("Crypt32.dll", SetLastError = true, ExactSpelling = true)] 
  252. public static extern IntPtr CertCreateSelfSignCertificate( 
  253. IntPtr providerHandle, 
  254. [In] ref CryptoApiBlob subjectIssuerBlob, 
  255. int flags, 
  256. [In] ref CryptKeyProviderInformation keyProviderInformation, 
  257. IntPtr signatureAlgorithm, 
  258. [In] ref SystemTime startTime, 
  259. [In] ref SystemTime endTime, 
  260. IntPtr extensions); 
  261. [DllImport("Crypt32.dll", SetLastError = true, ExactSpelling = true)] 
  262. [return: MarshalAs(UnmanagedType.Bool)] 
  263. public static extern bool CertFreeCertificateContext( 
  264. IntPtr certificateContext); 
  265. [DllImport("Crypt32.dll", SetLastError = true, ExactSpelling = true)] 
  266. public static extern IntPtr CertOpenStore( 
  267. [MarshalAs(UnmanagedType.LPStr)] string storeProvider, 
  268. int messageAndCertificateEncodingType, 
  269. IntPtr cryptProvHandle, 
  270. int flags, 
  271. IntPtr parameters); 
  272. [DllImport("Crypt32.dll", SetLastError = true, ExactSpelling = true)] 
  273. [return: MarshalAs(UnmanagedType.Bool)] 
  274. public static extern bool CertCloseStore( 
  275. IntPtr certificateStoreHandle, 
  276. int flags); 
  277. [DllImport("Crypt32.dll", SetLastError = true, ExactSpelling = true)] 
  278. [return: MarshalAs(UnmanagedType.Bool)] 
  279. public static extern bool CertAddCertificateContextToStore( 
  280. IntPtr certificateStoreHandle, 
  281. IntPtr certificateContext, 
  282. int addDisposition, 
  283. out IntPtr storeContextPtr); 
  284. [DllImport("Crypt32.dll", SetLastError = true, ExactSpelling = true)] 
  285. [return: MarshalAs(UnmanagedType.Bool)] 
  286. public static extern bool CertSetCertificateContextProperty( 
  287. IntPtr certificateContext, 
  288. int propertyId, 
  289. int flags, 
  290. [In] ref CryptKeyProviderInformation data); 
  291. [DllImport("Crypt32.dll", SetLastError = true, ExactSpelling = true)] 
  292. [return: MarshalAs(UnmanagedType.Bool)] 
  293. public static extern bool PFXExportCertStoreEx( 
  294. IntPtr certificateStoreHandle, 
  295. ref CryptoApiBlob pfxBlob, 
  296. IntPtr password, 
  297. IntPtr reserved, 
  298. int flags); 

希望本文所述對大家的C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人久久一区| 国产精品永久免费视频| 久久精品亚洲国产| 日韩中文字幕在线观看| 欧美成aaa人片在线观看蜜臀| 国产亚洲精品美女久久久久| 日韩中文av在线| 欧美中文在线观看国产| 欧美与欧洲交xxxx免费观看| 亚洲欧美精品在线| 97久久精品人人澡人人爽缅北| 日韩视频免费看| 国产精品久久一区主播| 亚洲欧美国产视频| 91免费欧美精品| 国产精品久久久久久久久久久久久久| 日韩av电影国产| 高清一区二区三区日本久| 精品免费在线观看| 久热爱精品视频线路一| 丝袜美腿亚洲一区二区| 色伦专区97中文字幕| 国产亚洲精品久久久久久牛牛| 亚洲美女中文字幕| 97国产精品视频| 欧美孕妇孕交黑巨大网站| 91av国产在线| 亚洲黄色www| 91高潮精品免费porn| 欧美在线免费观看| 日韩av在线天堂网| 2020欧美日韩在线视频| 亚洲国产精品一区二区久| 国产精品高清免费在线观看| 亚洲a在线观看| 亚洲精品av在线| 狠狠色香婷婷久久亚洲精品| 亚洲精品狠狠操| 亚洲第一中文字幕在线观看| 欧美精品videosex极品1| 亚洲精品二三区| 亚洲视频axxx| 91久久国产婷婷一区二区| 色香阁99久久精品久久久| 欧美日韩一区二区三区在线免费观看| 国产精品日韩专区| 欧美高清视频在线| 国产aⅴ夜夜欢一区二区三区| 国产亚洲视频中文字幕视频| 亚洲精品91美女久久久久久久| 欧美有码在线视频| 97久久超碰福利国产精品…| 午夜精品久久久久久久99黑人| 欧美日韩在线另类| 91国自产精品中文字幕亚洲| 亚洲精品永久免费| 57pao国产成人免费| 中文字幕亚洲一区二区三区| 久久精品国产清自在天天线| 日本精品一区二区三区在线播放视频| 国产日产久久高清欧美一区| 日本中文字幕久久看| 中文字幕亚洲综合久久筱田步美| 日本高清+成人网在线观看| 国产精品成人一区二区三区吃奶| 国产欧美一区二区三区久久| 欧美高清在线观看| www.久久撸.com| 日韩精品999| 亚洲黄色免费三级| 精品久久久久久久中文字幕| 久久久久亚洲精品国产| 欧美在线视频导航| 亚洲成年人在线播放| 黄色成人av在线| 91干在线观看| 在线电影av不卡网址| 欧洲日本亚洲国产区| 久久视频在线视频| 日韩av大片免费看| 91精品视频专区| 亚洲亚裔videos黑人hd| 国产精品久久久久久久av大片| 日本久久久久久久久| 日韩免费观看视频| 久久久国产成人精品| 日韩中文在线视频| 国内偷自视频区视频综合| 亚洲一区中文字幕在线观看| 欧美性猛交xxxx| 欧美日韩在线看| 国产欧美日韩高清| 久久久精品一区| 欧美在线欧美在线| 狠狠做深爱婷婷久久综合一区| 欧美成人免费va影院高清| 欧美日韩在线一区| 色综合亚洲精品激情狠狠| 日韩在线播放一区| 欧美在线播放视频| 欧美电影免费看| 在线播放国产一区中文字幕剧情欧美| 国产精品第三页| 97视频在线看| 成人免费自拍视频| 欧美黑人极品猛少妇色xxxxx| 91免费精品视频| 日本欧美精品在线| 欧美天天综合色影久久精品| 久久精视频免费在线久久完整在线看| 成人久久精品视频| 日韩中文av在线| 亚洲一区二区三| 日韩欧美中文在线| 日韩在线观看免费高清完整版| 久久精品2019中文字幕| 日韩中文字幕网| 国产丝袜精品第一页| 91极品女神在线| 色在人av网站天堂精品| 91黄色8090| 91精品久久久久久久久久另类| 欧美日本在线视频中文字字幕| 成人在线视频福利| 欧美成人午夜视频| 亚洲精品国产免费| 成人妇女淫片aaaa视频| 色老头一区二区三区在线观看| 欧美激情亚洲自拍| 国产成人aa精品一区在线播放| 久久久免费在线观看| 97色在线播放视频| 高清日韩电视剧大全免费播放在线观看| 精品视频在线观看日韩| 亚洲视频在线看| 美女av一区二区| 97国产一区二区精品久久呦| 精品视频在线播放| www.亚洲男人天堂| 中文字幕久热精品在线视频| 亚洲风情亚aⅴ在线发布| 久久久成人的性感天堂| 亚洲精品久久久久中文字幕二区| 国产欧美精品xxxx另类| 久久久精品一区二区三区| 日韩精品一区二区视频| 久久99久国产精品黄毛片入口| 国产精品一香蕉国产线看观看| 国产91热爆ts人妖在线| 国内揄拍国内精品少妇国语| 97在线看福利| 久久大大胆人体| 81精品国产乱码久久久久久| 欧美高清视频免费观看| 有码中文亚洲精品| 亚洲福利视频在线| 欧美丰满少妇xxxxx做受| 97视频免费看| 国产成人精品一区二区在线| 777国产偷窥盗摄精品视频| 国产成人av在线播放| 欧美孕妇与黑人孕交| 国产欧美在线看| 亚洲成人在线视频播放|