1

PKCS#12 ファイルから秘密 RSA キーをインポートしようとしています。OpenSSL を使用して P12 を解析し、CryptImportKey を使用してキーを CSP (「標準」拡張 RSA プロバイダー) にインポートしようとしています。

Ï CryptExportKey を使用して CSP からキーをエクスポートした場合とまったく同じ方法で BLOB を作成します。

最後に、暗号化されたファイルを解析して CSP に保存するだけなので、セッション暗号化は使用したくありません。私が使用する場合

publickeystruc.aiKeyAlg := CALG_RSA_KEYX;

if not CryptImportKey(tmpprovider,addr(privkey),dwBlobLen,0,flags,hPubKey) then 
  errorCode := GetLastError;

(キーパラメータは0なので)関数は失敗し、ERROR_INVALID_PARAMETERエラーが発生します。しかし、キーはインポートされ、完全に機能しています (キーで署名しようとしたところ、エクスポート可能とマークされていればエクスポートできました)。

変数は次のように宣言されます。

 hpubkey:PHCRYPTKEY;
 privkey:privkeyblob;

どこ

  HCRYPTKEY   = ULONG;
  PHCRYPTKEY  = ^HCRYPTKEY;

残りは整数と基数です...

問題は解決しました。本当にばかげたバグでした。関数の開始時に最後のパラメーターをゼロにするときに、最後のパラメーターを逆参照するのを忘れたので、代わりに

hPubKey^:=0;

私が持っていた

hPubKey := 0;

私を正しい方向に向けてくれたTLamaに感謝します。

4

1 に答える 1

0

PKCS#12ファイルから秘密RSAキーをインポートしようとしていると書きました。これを行うには、 PFXImportCertStoreを使用する必要があるように思われます。インポートのスキーマはここにあります。秘密鍵を取得して別の場所に保存する必要がある場合は、ステップをCertAddCertificateContextToStoretoの使用法に置き換えることができますCertGetCertificateContextPropertyPFXImportCertStoreキーコンテナを自動的に作成する呼び出し。CertGetCertificateContextPropertywithを使用すると、CRYPT_KEY_PROV_INFOCERT_KEY_PROV_INFO_PROP_IDのファイルとしてキーコンテナが取得されます。pwszContainerName

于 2012-04-23T21:36:38.817 に答える