问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用.net读取PKCS12格式数字证书

发布网友 发布时间:2022-05-07 04:31

我来回答

1个回答

热心网友 时间:2023-10-15 16:38

要读取pkcs12格式的证书,我们需要调用API,在WIN32类中,我们声明这些API的引用:
1using System;
2using System.Runtime.InteropServices;
3
4namespace X509Cert
5{
6
7 public class WIN32
8 {
9 public const uint CRYPT_USER_KEYSET = 0x00001000;
10 public const uint CERT_KEY_PROV_INFO_PROP_ID = 0x00000002;
11 public const uint CRYPT_DELETEKEYSET = 0x00000010;
12
13 [DllImport("crypt32.dll", SetLastError=true)]
14 public static extern IntPtr PFXImportCertStore(ref CRYPT_DATA_BLOB pPfx,[MarshalAs(UnmanagedType.LPWStr)] String szPassword,uint dwFlags);
15
16 [DllImport("CRYPT32.DLL", EntryPoint="CertEnumCertificatesInStore", CharSet=CharSet.Auto, SetLastError=true)]
17 public static extern IntPtr CertEnumCertificatesInStore( IntPtr storeProvider, IntPtr prevCertContext);
18
19 [DllImport("CRYPT32.DLL",CharSet=CharSet.Auto, SetLastError=true)]
20 public static extern bool CertGetCertificateContextProperty(IntPtr pCertContext,uint dwPropId,IntPtr pvData,ref uint pcbData);
21
22 [DllImport("advapi32.dll",EntryPoint="CryptAcquireContext",CharSet=CharSet.Auto, SetLastError=true)]
23 public static extern bool CryptAcquireContext(ref IntPtr phProv,string szContainer,string szProvider,uint dwProvType,uint dwFlags);
24
25 [StructLayout(LayoutKind.Sequential)]
26 public struct CRYPT_DATA_BLOB {
27 public int cbData;
28 public IntPtr pbData;
29 }
30
31 [StructLayout(LayoutKind.Sequential)]
32 public struct CRYPT_KEY_PROV_INFO {
33
34 [MarshalAs(UnmanagedType.LPWStr)]
35 public String ContainerName;
36
37 [MarshalAs(UnmanagedType.LPWStr)]
38 public String ProvName;
39
40 public uint ProvType;
41
42 public uint Flags;
43
44 public uint ProvParam;
45
46 public IntPtr rgProvParam;
47
48 public uint KeySpec;
49
50 }
51
52 public WIN32()
53 {
54 //
55 // TODO: 在此处添加构造函数逻辑
56 //
57 }
58 }
59}
60

然后在Cert类中写一个Read方法读取其中的证书。注意:pfx文件有可能包含几个证书

1using System;
2using System.IO;
3using System.Runtime.InteropServices;
4using System.Security.Cryptography.X509Certificates;
5
6namespace X509Cert
7{
8 /// <summary>
9 /// Cert 的摘要说明。
10 /// </summary>
11 public class Cert
12 {
13 public Cert()
14 {
15 //
16 // TODO: 在此处添加构造函数逻辑
17 //
18 }
19 public static System.Security.Cryptography.X509Certificates.X509Certificate[] Read(string filename,string password) {
20
21 //打开证书文件,并读到一个字节数组中。
22 FileStream stream = new FileStream(filename,FileMode.Open);
23 byte[] buffer = new byte[stream.Length];
24 stream.Read(buffer,0,buffer.Length);
25 stream.Close();
26
27 //声明并实例化WIN32.CRYPT_DATA_BLOB 将读取到的字节数组拷贝到它的pbData属性中。将字节数组长度赋给cbData属性
28 WIN32.CRYPT_DATA_BLOB cryptdata = new WIN32.CRYPT_DATA_BLOB();
29 cryptdata.cbData = buffer.Length;
30 cryptdata.pbData = Marshal.AllocHGlobal(cryptdata.cbData);
31 Marshal.Copy(buffer,0,cryptdata.pbData,buffer.Length);
32 IntPtr hMemStore = WIN32.PFXImportCertStore(ref cryptdata,"1234",WIN32.CRYPT_USER_KEYSET);
33 Marshal.FreeHGlobal(cryptdata.pbData);
34
35 uint provinfosize = 0;
36 WIN32.CRYPT_KEY_PROV_INFO certinfo = new WIN32.CRYPT_KEY_PROV_INFO();
37
38 System.Collections.ArrayList certs = new System.Collections.ArrayList();
39
40 IntPtr certHandle = IntPtr.Zero;
41 while((certHandle = WIN32.CertEnumCertificatesInStore(hMemStore,certHandle)) != IntPtr.Zero) {
42
43 if(WIN32.CertGetCertificateContextProperty(certHandle,WIN32.CERT_KEY_PROV_INFO_PROP_ID,IntPtr.Zero,ref provinfosize)){
44
45 IntPtr info = Marshal.AllocHGlobal((int)provinfosize);
46
47 if(WIN32.CertGetCertificateContextProperty(certHandle,WIN32.CERT_KEY_PROV_INFO_PROP_ID,info,ref provinfosize)) {
48 certinfo = (WIN32.CRYPT_KEY_PROV_INFO)Marshal.PtrToStructure(info,typeof(WIN32.CRYPT_KEY_PROV_INFO));
49
50 certs.Add(new X509Certificate(certHandle));
51 }
52 Marshal.FreeHGlobal(info);
53
54 }
55 }
56
57 Marshal.FreeHGlobal(hMemStore);
58
59 IntPtr hCryptProv = IntPtr.Zero;
60 if(!WIN32.CryptAcquireContext(ref hCryptProv,certinfo.ContainerName,certinfo.ProvName,certinfo.ProvType,WIN32.CRYPT_DELETEKEYSET))
61 throw new Exception("释放内存错误");
62 return (X509Certificate[])certs.ToArray(typeof(X509Certificate));
63
64 }
65 }
66}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
西宁出发经甘南、川西到云南自驾游最佳路线 有没有哪些摇滚比较好的女歌手? 王红都唱歌哪些歌曲? 王红是李春波的老婆吗? 周五买的基金周一有收益嘛? 成语:过隙白驹是什么意思?有什么样的典故和故事? 如何评价华语乐坛王菲,林忆莲,李玟,张惠妹,那英的唱功地位 如何评价王菲和李玟的性格对比?人生阅历有多大的不同? 李玟去世:广告语 ldquo 大家好才是真的好 rdquo 是不是李玟的作品? 地脚线用什么颜色的好 地脚线和什么颜色搭配 广东纺织业常识的问题 用VB实现隐藏进程 vb 不在任务管理器 十二烷基硫酸钠(K12)、 苹果5S如何双开微信?! 电话薄的查询系统,可以插入和删除并显示电话号码薄,跪求!! 假的玻尿酸怎么取出来 假玻尿酸取出齐云香采用的是什么技术呢? 求比较霸气的口号,是销售团队的 我们的团队有3个人,主要做国内以及外贸酒店布草的业务,谁能帮我想一下团队的队名以及口号 2.什么是性格? 2号性格的特征是什么 什么叫第二性格 双重性格指的是什么 “二”在你理解中是什么样的性格? 广州话形容一个人的性格二斗是什么意思? 性格挺二是什么意思 性格&#xFFFC;是什么意思? 性格很“二”是什么意思? 性格很“二”是指什么 是指脾气不好很火爆吗? 跪求达人翻译http:&#47;&#47;user.qzone.qq.com&#47;987958210&#47;infocenter#!app=2&via=QZ.HashRefresh&pos=1356335521 永远的伊苏7菲尔迦纳的誓约在PC平台上有无中文版 如何剥栗子壳 关于硬盘分区与数据恢复 分区数据恢复,急啊。望指导 硬盘分区数据恢复 关于硬盘分区丢失和数据恢复!!求助 其实我想更懂你歌词 怎么把聊天记录同步到电脑 其实我很想懂你 是什么歌里的歌词? ·关于潘玮柏的歌——《其实我想更懂你》 《其实我想更懂你》的英文版原版是哪首? 请问有谁唱过歌曲中含有“其实我想更懂你”的歌 “每次我想更懂你我们却更有距离,是不是,都用错言语,还是用错了表情” 请问这段歌词出自哪首歌 其实我想感动你,不是为了抓着你…是哪首歌?谁唱的? 潘玮柏和苏芮唱的其实我想更懂你开始的英语对白的意思是什么 松毛虫性骨关节炎的介绍 松毛虫性骨关节炎的简介 松毛虫性骨关节炎是什么原因引起的 松毛虫性骨关节病的治疗