我有一个装满证书的密钥库。另一个人告诉我证书有一个私钥,但当我检查我的代码时,我从来没有看到任何。所有这些键都用在vs6和cryptapi中,我使用的是c#。
我创建了自己的证书,并通过使用这里的方法确保它有一个私钥 http://www.source-code.biz/snippets/vbasic/3.htm
当我将它导入同一个密钥库然后运行我的代码,证明它确实有一个私钥时,密钥存储区中的所有其他证书都没有(根据我的代码)。
为了能够在此密钥库中的证书中使用私钥,是否需要设置一些标志或其他内容?
public void testForPrivateKey(string keystorename)
{
X509Store teststore = new X509Store(keystorename);
teststore.Open(OpenFlags.ReadOnly);
foreach (X509Certificate2 cert in teststore.Certificates)
{
if(cert.HasPrivateKey)
{
System.Diagnostics.Debug.WriteLine("Private key found certificate name: {0}", cert.Subject);
}
}
store.Close();
}
答案 0 :(得分:1)
我得到了同样的问题,但在调查后解决了: 如果证书具有私钥,则它还具有CERT_KEY_SPEC_PROP_ID属性。
DWORD keySpec;
DWORD len = 4;
BOOL ret = CertGetCertificateContextProperty(pCertContext, CERT_KEY_SPEC_PROP_ID, &keySpec, &len);
if ( !ret ){
//has no private key
}
答案 1 :(得分:0)
密钥与证书相关联。您不选择一个,它取决于您使用的证书。请参阅MSDN上的EncryptTo/DecryptTo: Encryption in .NET with CryptoAPI Certificate Stores文章。