Доступ к хранилищу сертификатов X509 с неуправляемым C ++ - PullRequest
2 голосов
/ 09 ноября 2011

Кто-нибудь знает, как я мог бы сделать эквивалент кода ниже C #, используя неуправляемый C ++, т.е. запросить сертификат из хранилища сертификатов X509 по отпечатку пальца?

        var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);

        store.Open(OpenFlags.ReadOnly);

        var allCerts = store.Certificates;

        foreach (var certificate in from X509Certificate2 certificate in allCerts
                                    where certificate.Thumbprint != null
                                       && certificate.Thumbprint.Equals(thumbprint, StringComparison.OrdinalIgnoreCase)
                                    select certificate)
        {
            return certificate;
        }

Заранее спасибо

Дейв

Ответы [ 2 ]

5 голосов
/ 09 ноября 2011

Чтобы выполнить то, что вы хотите, вам нужно заглянуть в библиотеку Win32 CryptAPI. Это будет не так просто, как .NET. Загляните в CertOpenStore и CertFindCertificateInStore .

Вам нужно будет открыть хранилище сертификатов и передать его в CertFindCertificateStore, создав структуру, которая будет содержать все критерии, которые вы хотите использовать для поиска вашего сертификата. Вы можете использовать серийный номер, подпись и т. Д.

    HCERTSTORE hSysStore = NULL;
    PCCERT_CONTEXT  pDesiredCert = NULL;
if(hSysStore = CertOpenStore(
   CERT_STORE_PROV_SYSTEM,          // The store provider type
   0,                               // The encoding type is
                                    // not needed
   NULL,                            // Use the default HCRYPTPROV
   CERT_SYSTEM_STORE_CURRENT_USER,  // Set the store location in a
                                    // registry location
   L"MY"                            // The store name as a Unicode 
                                    // string
   ))
{
    //We have our store, let's do stuff with it
    if (pDesiredCert = CertFindCertificateInStore(.....) {  ..... }
}
else
{
    //Error stuff
}

Вам нужно будет #include <Wincrypt.h> и #include <windows.h>

0 голосов
/ 10 июля 2018

Код из CertFindCertificateInStore. не будет работать на более новых системах. В более новых версиях Windows имя сертификата или тема имеют формат Unicode, в котором для каждого символа используются 2 байта. Следующая строка:

LPCSTR lpszCertSubject = (LPCSTR) "Cert_subject_1";

должно быть изменено на:

LPCWSTR lpszCertSubject = (LPCWSTR ) L"Cert_subject_1";

или

LPCTSTR lpszCertSubject = (LPCTSTR ) _T"Cert_subject_1"; // add #include <tchar.h> 

в зависимости от того, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...