Как я могу получить NCRYPT_KEY_HANDLE для закрытого ключа PCCERT_CONTEXT?

Как я могу получить NCRYPT_KEY_HANDLE для шифрования / дешифрования с помощью CNG из закрытого ключа PCCERT_CONTEXT из магазина сертификатов windows?

CryptEncrypt функция была заменена NCryptEncrypt а также BCryptEncrypt функций, но не существует очевидного способа получить дескриптор для любой из этих функций из PCCERT_CONTEXT из хранилища сертификатов Windows.

Можно ли даже использовать функции CNG для шифрования / дешифрования с использованием (секретных ключей) сертификатов, не решая такие грубые методы, как экспорт сертификата?

2

Решение

Я отвечаю на это сам, так как больше нигде не нашел ответов:

Следующий код даст вам то, что вы хотите:

const HCERTSTORE store(CertOpenStore(CERT_STORE_PROV_SYSTEM_W, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_READONLY_FLAG, (const void*)L"MY"));
const PCCERT_CONTEXT certContext(CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR_W, subjectName, nullptr));
if (certContext)
{
HCRYPTPROV_OR_NCRYPT_KEY_HANDLE keyHandle;
DWORD keySpec;
BOOL callerFreesKeyHandle;

// Get NCrypt key handle from certificate.
// Might fail for instance if certificate private key is not accessible to current user.
if (CryptAcquireCertificatePrivateKey(certContext, CRYPT_ACQUIRE_SILENT_FLAG | CRYPT_ACQUIRE_ONLY_NCRYPT_KEY_FLAG, nullptr, &keyHandle, &keySpec, &callerFreesKeyHandle))
{
check(keySpec == CERT_NCRYPT_KEY_SPEC); //< Should always have this value when giving CRYPT_ACQUIRE_ONLY_NCRYPT_KEY_FLAG.
UNIQUE_NCRYPT_KEY_HANDLE keyHandleKeeper;
if (callerFreesKeyHandle)
{
keyHandleKeeper.reset(keyHandle);
}
...
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]