1

Windows Crypto API を使用してユーザー証明書を保存および復元するプログラムを作成しました。私はそれが正常に機能しているという印象を受けましたが、証明書が復元された後、証明書に添付された秘密鍵が無効であるとユーザーから苦情が寄せられました。

以下を使用して証明書を保存していました。

HCERTSTORE hCertStore =
    CertOpenStore(CERT_STORE_PROV_PHYSICAL_W,
    0,
    NULL,
    CERT_SYSTEM_STORE_CURRENT_USER |
    CERT_STORE_OPEN_EXISTING_FLAG |
    CERT_STORE_READONLY_FLAG |
    CERT_STORE_UPDATE_KEYID_FLAG,
    (PVOID) storeName.c_str());

そして後で:

if (!CertSaveStore(hCertStore,
    0,
    CERT_STORE_SAVE_AS_STORE,
    CERT_STORE_SAVE_TO_FILENAME,
    (PVOID) saveFile.c_str(),
    0))

CERT_STORE_SAVE_AS_STORE フラグは、秘密鍵を含めて証明書全体をシリアル化する必要があることを意味する必要があることを理解しています。MSDNが次のように述べていることに注意してください。

「CERT_KEY_CONTEXT_PROP_ID プロパティと、関連する CERT_KEY_PROV_HANDLE_PROP_ID および CERT_KEY_SPEC_PROP_ID の値は、シリアル化されたストアに保存されません。」

..告白しますが、よくわかりません。

証明書を復元するときは、CertFindCertificateInStore() を使用して、証明書が既に存在するかどうかを確認し、存在しない場合にのみ確認します。

bOK = CertAddCertificateContextToStore(
    hDestinationStore,
    pCertContext,
    CERT_STORE_ADD_USE_EXISTING,
    NULL);

証明書を元に戻すには...私の質問は、秘密鍵が保存されないのはなぜですか? 何か不足していますか?

4

1 に答える 1

4

間違った CryptoAPI を使用しています。代わりに、 PFXExportCertStoreExPFXImportCertStoreを使用する必要があります。

UPDATED : 関数は非常に一般的です。もちろん、SmartCard から証明書をエクスポートすることも、その他のエクスポートできない証明書をエクスポートすることもできません。関数内の BLOG は、PFX ファイルを含むものにすぎません。たとえば、PFX ファイルからの証明書のインポートでは、次のことを行う必要があります。

  1. PFX ファイルを開き、メモリにすべて含まれているものを読み取ります。もちろん、代わりにファイル マッピングを使用できます。
  2. 必要に応じて、関数を使用PFXIsPFXBlobして、ファイルに実際に PFX ファイルに対応するものが含まれていることを確認できます。
  3. PFXImportCertStoreソース証明書ストアとして BLOB (PFX) を開くために使用します。
  4. またはその他の関数を使用CertOpenStoreして、PFX ファイルから証明書を保存する宛先証明書ストアを開きます。
  5. CertEnumCertificatesInStoreソース証明書ストア (PFX) から証明書を列挙し、すべての証明書を使用しCertAddCertificateContextToStoreて、ソース証明書ストアから宛先証明書ストアに証明書を追加するために使用します。秘密鍵を持つ証明書は、秘密鍵とともにインポートされます。
  6. CertCloseStore開いている両方の店舗を閉じるために使用します。
于 2011-04-21T09:06:50.847 に答える