2012-02-10 8 views
2

У меня есть хранилище ключей, полное сертификатов. Другой человек сказал мне, что у сертификатов есть закрытый ключ, но когда я проверяю свой код, я никогда не вижу его. Все эти ключи были использованы в 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

Найдено, что ключи находятся в «ключевой контейнер» не в «хранилище сертификатов» Кто-нибудь знает, как я могу указать ключ, который я буду использовать, чтобы сделать шифрования/дешифрования при условии, что есть обмен/подпись ключи и другие в контейнере ключей. – user1202605

ответ

1

У меня тот же вопрос, но разрешен после расследования: Если у cert есть закрытый ключ, он также имеет свойство 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

Я не вижу его для своих сертификатов. Не могли бы вы рассказать? – user3613932

Смежные вопросы