Получить данные X509 из сертификата PFX с помощью CryptoAPI

Добрый день. Stackoverflow помогал мне много раз прежде, но я немного застрял на этом и надеюсь, что кто-то может дать мне несколько советов.

Предыстория: мне нужно передать данные сертификата X509 в SDK Adobe CertListCab, чтобы подписать PDF-файл с помощью моего подключаемого модуля Acrobat API.

У меня вопрос, как я могу получить данные X509 из сертификата PFX, используя CryptoAPI?

Я делаю следующее:

  • Преобразование моего сертификата PFX в хранилище в памяти.

    CRYPT_DATA_BLOB data;

  • Откройте файл и заполните данные.

    FILE *fIn = fopen("C:\\certificate\\MyPfx.pfx", "rb")
    fseek(fIn, 0, SEEK_END);
    data.cbData = ftell(fIn);
    fseek(fIn, 0, SEEK_SET);
    data.pbData = (BYTE *)malloc(data.cbData);
    fread(data.pbData, 1, data.cbData, fIn);
    fclose(fIn);
    

    HCERTSTORE hCertStore = PFXImportCertStore(&data, L"password", 0);

  • Найдите сертификат. Здесь только один.

    PCCERT_CONTEXT hContext = CertFindCertificateInStore
    (hCertStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_ANY, NULL, NULL);

  • Получите информацию открытого ключа для сертификата.

    BOOL bFreeHandle;
    HCRYPTPROV hProv;
    DWORD dwKeySpec;
    HCRYPTKEY hCertPubKey;

    CryptAcquireCertificatePrivateKey
    (hContext, 0, NULL, &hProv, &dwKeySpec, &bFreeHandle);

    CryptImportPublicKeyInfo(hProv, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
    &hContext->pCertInfo->SubjectPublicKeyInfo, &hCertPubKey));

  • Сейчас я пытаюсь освободить место для данных X509.

    DWORD dwX509Len;
    BYTE *x509Data;
    CryptGetKeyParam(hCertPubKey,KP_CERTIFICATE,NULL,&dwX509Len,0);

    x509Data = (BYTE*)malloc(dwX509Len);

  • Я передаю в свой буфер.

    CryptGetKeyParam(hCertPubKey,KP_CERTIFICATE,x509Data,&dwX509Len,0);

Когда я запускаю свою программу, я получаю сообщение об ошибке для CryptGetKeyParam:

NTE_BAD_TYPE: параметр dwParam указывает номер неизвестного значения.

Согласно документы:

KP_CERTIFICATE: pbData — это адрес буфера, который получает сертификат X.509, который был закодирован с использованием Distinguished Encoding Rules (DER). Открытый ключ в сертификате должен соответствовать соответствующей подписи или обменному ключу.

Я делаю что-то неправильно? Есть ли другой способ получить данные x509?
Любая помощь будет оценена.

С Уважением,
Магда

6

Решение

Похоже, я слишком усложнил проблему.

hContext->pbCertEncoded
hContext->cbCertEncoded

Даст мне данные, которые я хочу.

До сих пор не понимаю, почему с помощью KP_CERTIFICATE не удалось получить данные X509 …

3

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

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

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