Как узнать, есть ли у сертификата закрытый ключ - PullRequest
2 голосов
/ 11 февраля 2012

У меня есть хранилище ключей, полное сертификатов. Другой человек сказал мне, что сертификаты имеют закрытый ключ, но когда я проверяю свой код, я никогда его не вижу. Все эти ключи были использованы в vs6 и cryptapi, я использую c #.

Я создал свой собственный сертификат и удостоверился, что у него есть закрытый ключ, используя методы здесь http://www.source -code.biz / сниппеты / 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 ]

1 голос
/ 07 января 2015

Я получил тот же вопрос, но решил после расследования: Если у сертификата есть закрытый ключ, он также имеет свойство 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
}
0 голосов
/ 11 февраля 2012

Ключ связан с сертификатом. Вы не выбираете один, это определяется сертификатом, который вы используете. См. Статью EncryptTo / DecryptTo: Шифрование в .NET с хранилищем сертификатов CryptoAPI на MSDN.

...