2013-05-08 1 views
5

Bonne journée. Stackoverflow m'a aidé plusieurs fois auparavant, mais je suis un peu coincé sur celui-ci et j'espère que quelqu'un pourra me donner quelques conseils. Contexte: J'ai besoin de transmettre les données X509 d'un certificat au SDK CertListCab d'Adobe afin de signer le PDF à l'aide de mon API de plugin Adobe.Récupère les données X509 d'un certificat PFX en utilisant CryptoAPI

Ma question est comment puis-je obtenir les données X509 à partir d'un certificat PFX en utilisant CryptoAPI?

Je l'ai fait ce qui suit:

  • Conversion mon certificat PFX à un magasin en mémoire.

    CRYPT_DATA_BLOB data;

  • Ouvrir le fichier et renseigner les données.

    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);

  • Trouver le certificat. Il n'y a qu'un seul.

    PCCERT_CONTEXT hContext = CertFindCertificateInStore (hCertStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_ANY, NULL, NULL);

  • Obtenez les informations clé publique du certificat.

    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));

  • Maintenant, j'essaie de faire de l'espace pour les données X509.

    DWORD dwX509Len; BYTE *x509Data; CryptGetKeyParam(hCertPubKey,KP_CERTIFICATE,NULL,&dwX509Len,0);

    x509Data = (BYTE*)malloc(dwX509Len);

  • je passe dans mon tampon.

    CryptGetKeyParam(hCertPubKey,KP_CERTIFICATE,x509Data,&dwX509Len,0);

Quand je lance mon programme je reçois l'erreur pour CryptGetKeyParam:

NTE_BAD_TYPE: Le paramètre dwParam spécifie un numéro de valeur inconnue.

Selon le docs:

KP_CERTIFICATE: pbData est l'adresse d'une mémoire tampon qui reçoit le certificat X.509 qui a été codé en utilisant des règles de codage distinctives (DER). La clé publique du certificat doit correspondre à la signature ou à la clé d'échange correspondante.

Est-ce que je fais quelque chose de mal? Existe-t-il un autre moyen d'obtenir les données x509? Toute aide serait appréciée.

Cordialement, Magda

Répondre

2

On dirait que je suis trop compliqué la question.

hContext->pbCertEncoded 
hContext->cbCertEncoded 

Donnez-moi les données que je veux.

ne comprennent toujours pas pourquoi l'aide KP_CERTIFICATE n'a pas récupérer les données X509 ...

+0

Vous avez sauvé ma journée. Merci – nommyravian

Questions connexes