Добрый день. 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? Любая помощь будет оценена по достоинству.
С уважением, Магда
Вы спасли мой день. благодаря – nommyravian