2013-05-08 27 views
5

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

risposta

2

sembra che ho complicato eccessivamente la questione.

hContext->pbCertEncoded 
hContext->cbCertEncoded 

Mi darà i dati che desidero.

ancora non capisco il motivo per cui utilizzando KP_CERTIFICATE non recuperare i dati X509 ...

+0

mi hai salvato la giornata. Grazie – nommyravian