Добрый день. 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?
Любая помощь будет оценена.
С Уважением,
Магда
Похоже, я слишком усложнил проблему.
hContext->pbCertEncoded
hContext->cbCertEncoded
Даст мне данные, которые я хочу.
До сих пор не понимаю, почему с помощью KP_CERTIFICATE
не удалось получить данные X509 …
Других решений пока нет …