良い一日。Stackoverflow は以前に何度も私を助けてくれましたが、私はこれに少し行き詰まっており、誰かが私にいくつかの指針を与えてくれることを願っています.
背景: Acrobat プラグイン API を使用して PDF に署名するには、証明書の X509 データを Adobe の 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 データを取得する別の方法はありますか? どんな助けでも大歓迎です。
よろしく、マグダ