如何使用.net读取PKCS12格式数字证书
要读取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 ///
9 /// Cert 的摘要说明。
10 ///
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}
如何编程读取PKCS#12格式的证书与私钥
pkcs8格式的私钥转换工具.它处理在PKCS#8格式中的私钥文件.它可以用多样的PKCS#5 (v1.5 and v2.0)和 PKCS#12算法来处理没有解密的PKCS#8 PrivateKeyInfo格式和EncryptedPrivateKeyInfo格式.用法:[cpp] view plaincopy openssl …
linux OpenSSL生成私钥怎么转换成PKCS12格式.
openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx
如何将AndroidAir用pkcs12格式p12证书转换为用jks格式keystore证书
先把你的CA证书拷贝到你的SD卡里面2.进入手机的“设置”->“位置和安全”,最下面有个“从SD卡安装”,就是安装证书的.点击后按提示操作就OK了.
pkcs12中文是什么意思
玩CS.
我用火狐下载的证书是.p12格式的,如何转换到cer格式呢? 我用ie下载不了,才用火狐的,要求提供cer格式
您好!很高兴为您答疑!
您下载的是PFX格式文件,您可以将其导入到IE内,然后用IE导出CER格式文件即可。
您可以在火狐社区了解更多内容。希望我的回答对您有所帮助,如有疑问,欢迎继续在本平台咨询。
pfx是什么格式的文件啊
公钥加密技术12号标准(Public Key Cryptography Standards #12,PKCS#12)为存储和传输用户或服务器私钥、公钥和证书指定了一个可移植的格式.它是一种二进制格式,这些文件也称为PFX文件.开发人员通常需要将PFX文件转换为某些不同的格式,如PEM或JKS,以便可以为使用SSL通信的独立Java客户端或WebLogic Server使用 是一种Microsoft协议,使得用户可以将机密信息从一个环境或平台传输到另一个环境或平台.使用该协议,用户就可以安全地将个人信息从一个计算机系统导出到另一个系统中.
如何连接到一个安全的使用SSL在java和PKCS12文件的网站吗
在项目开发中,有时会遇到SSL证书导入,把SSL证书导入java中的cacerts证书库其实很简单,方法如下: 第一步:找到安装了SSL证书的网站,点击HTTPS加密协议下载SSL证书 在该网页上右键 >> 属性 >> 点击”证书” >> 再点击上面的”详细信息”切换栏 >> …
如何使用key和crt文件转换为tomcat用到的jks格式证书
您好,这样: 第一步,从key和crt生成pkcs12格式的keystore openssl pkcs12 -export -in mycert.crt -inkey mykey.key -out mycert.p12 -name tomcat -CAfile myCA.crt -caname root -chain 第二步 生成tomcat需要的keystore keytool -importkeystore …
如何用Wireshark(Ethereal)查看HTTPS(SSL)消息里的加密内容
但是HTTPS的通讯是加密的,所以默认情况下你只能看到HTTPS在建立连接之初的交互证书和协商的几个消息而已,真正的业务数据(HTTP消息)是被加密的,你必须借助服务器密钥(私钥)才能查看.即使在HTTPS双向认证(服务器验证客…