Buona giornata. Stackoverflow mi ha aiutato molte volte in passato, ma sono un po 'bloccato su questo e spero che qualcuno possa darmi dei suggerimenti.Ottieni i dati X509 da un certificato PFX utilizzando CryptoAPI
Background: Ho bisogno di passare i dati X509 di un certificato a CertListCab dell'SDK di Adobe per firmare il PDF utilizzando il mio plugin Abi di Acrobat.
La mia domanda è: come posso ottenere i dati X509 da un certificato PFX usando CryptoAPI?
ho nel seguente modo:
Conversione mio certificato PFX in un negozio in-memory.
CRYPT_DATA_BLOB data;
Aprire il file e popolano i dati.
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);
trovare il certificato. Ce n'è solo uno.
PCCERT_CONTEXT hContext = CertFindCertificateInStore (hCertStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_ANY, NULL, NULL);
Ottenere le informazioni chiave pubblica per il certificato.
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));
Ora cerco di fare spazio per i dati X509.
DWORD dwX509Len;
BYTE *x509Data;
CryptGetKeyParam(hCertPubKey,KP_CERTIFICATE,NULL,&dwX509Len,0);
x509Data = (BYTE*)malloc(dwX509Len);
passo nel mio tampone.
CryptGetKeyParam(hCertPubKey,KP_CERTIFICATE,x509Data,&dwX509Len,0);
Quando eseguo il mio programma ho visualizzato l'errore per CryptGetKeyParam:
NTE_BAD_TYPE: Il parametro dwParam specifica un numero di valore sconosciuto.
Secondo il docs:
KP_CERTIFICATE: pbData è l'indirizzo di un buffer che riceve il certificato X.509 che è stato codificato utilizzando Distinguished Encoding Rules (DER). La chiave pubblica nel certificato deve corrispondere alla chiave di firma o di scambio corrispondente.
Sto facendo qualcosa di sbagliato? C'è un altro modo per ottenere i dati x509? Qualsiasi aiuto sarebbe apprezzato.
saluti, Magda
mi hai salvato la giornata. Grazie – nommyravian