我正在尝试确定存储在远程Windows(2k3/2k8)计算机上的证书私钥的文件名,并且遇到了一些困难.我也不熟悉微软的CryptAPI,所以我正在寻找你能提供的任何帮助.
此练习的目的是查找在远程计算机上安装了符合特定条件的私钥的证书,并确保为其私钥文件分配了正确的权限.虽然我可以在文件夹级别分配权限,但我更愿意仅在必要时在私钥文件级别分配权限(出于显而易见的原因).
这是方案,假设具有类似管理权限的服务帐户正在访问证书存储:
我使用p/invoke使用C#中的以下调用来检索远程证书存储:
[DllImport("CRYPT32",EntryPoint ="CertOpenStore",CharSet = CharSet.Unicode,SetLastError = true)] public static extern IntPtr CertOpenStore(int storeProvider,int encodingType,int hcryptProv,int flags,string pvPara);
IntPtr storeHandle = CertOpenStore(CERT_STORE_PROV_SYSTEM,0,0,CERT_SYSTEM_STORE_LOCAL_MACHINE,string.Format(@"\ {0} {1}",serverName,name));
然后,我使用CertEnumCertificatesInStore来检索我要评估的证书.
[DllImport("CRYPT32",EntryPoint ="CertEnumCertificatesInStore",CharSet = CharSet.Unicode,SetLastError = true)] public static extern IntPtr CertEnumCertificatesInStore(IntPtr storeProvider,IntPtr prevCertContext); IntPtr certCtx = IntPtr.Zero; certCtx = CertEnumCertificatesInStore(storeHandle,certCtx);
如果证书符合我的标准,我从CertEnumCertificatesInStore调用返回的IntPtr创建一个X509Certificate2实例,如:
X509Certificate2 current = new X509Certificate2(certCtx);
一旦我拥有了我感兴趣的证书的X509Certificate2实例,我就会调用CryptAcquireCertificatePrivateKey来获取私钥提供者:
[DllImport("crypt32",CharSet = CharSet.Unicode,SetLastError = true)] internal extern static bool CryptAcquireCertificatePrivateKey(IntPtr pCert,uint dwFlags,IntPtr pvReserved,ref IntPtr phCryptProv,ref int pdwKeySpec,ref bool pfCallerFreeProv);
// cert是X509Certificate2
CryptAcquireCertificatePrivateKey(cert.Handle,0,IntPtr.Zero,ref hProvider,ref _keyNumber,ref …