Я написал программу, которая должна сохранять и восстанавливать сертификаты пользователей, используя 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);
Чтобы добавить сертификат обратно ... Итак, мой вопрос: почему закрытый ключ не может быть сохранен?Я что-то упустил?