Доступ к хранилищу сертификатов X509 с неуправляемым C++
Кто-нибудь знает, как бы я сделал эквивалент приведенного ниже кода 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 ответов:
Чтобы выполнить то, что вы хотите, вам придется заглянуть в библиотеку 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>
Код из 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>В зависимости от того, что вам нужно.
Comments