6

良い一日。Stackoverflow は以前に何度も私を助けてくれましたが、私はこれに少し行き詰まっており、誰かが私にいくつかの指針を与えてくれることを願っています.

背景: Acrobat プラグイン API を使用して PDF に署名するには、証明書の X509 データを Adob​​e の SDK CertListCab に渡す必要があります。

私の質問は、CryptoAPI を使用して PFX 証明書から X509 データを取得するにはどうすればよいですか?

私は次のことをしています:

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

  • 証明書を見つけます。1つしかありません。

    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 は、Distinguished Encoding Rules (DER) を使用してエンコードされた X.509 証明書を受け取るバッファーのアドレスです。証明書の公開鍵は、対応する署名または交換鍵と一致する必要があります。

私は何か間違ったことをしていますか?x509 データを取得する別の方法はありますか? どんな助けでも大歓迎です。

よろしく、マグダ

4

1 に答える 1