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);
証明書を元に戻すには...私の質問は、秘密鍵が保存されないのはなぜですか? 何か不足していますか?