2013-05-08 4 views
5

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

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

Мой вопрос в том, как я могу получить данные 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 указывает неизвестное число значений.

Согласно docs:

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

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

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

ответ

2

Похоже, я слишком сложный вопрос.

hContext->pbCertEncoded 
hContext->cbCertEncoded 

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

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

+0

Вы спасли мой день. благодаря – nommyravian