如何判断cert是否具有私钥

时间:2012-02-10 22:17:32

标签: c# rsa certificate private-key

我有一个装满证书的密钥库。另一个人告诉我证书有一个私钥,但当我检查我的代码时,我从来没有看到任何。所有这些键都用在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();

}

2 个答案:

答案 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文章。