Salvar / restaurar certificados com o MS CryptoAPI invalida a chave privada anexada
Eu escrevi um programa que deveria salvar e restaurar os certificados de um usuário usando a API Crypto do Windows. Tive a impressão de que estava funcionando bem, mas agora um usuário reclamou que a chave privada anexada ao certificado é inválida após a restauração do certificad
Eu estava salvando os certificados usando:
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());
E depois:
if (!CertSaveStore(hCertStore,
0,
CERT_STORE_SAVE_AS_STORE,
CERT_STORE_SAVE_TO_FILENAME,
(PVOID) saveFile.c_str(),
0))
Entendo que o sinalizador CERT_STORE_SAVE_AS_STORE deve significar que todo o certificado deve ser serializado, incluindo a chave privada. Embora eu note que o MSDN diz:
"A propriedade CERT_KEY_CONTEXT_PROP_ID e os valores relacionados CERT_KEY_PROV_HANDLE_PROP_ID e CERT_KEY_SPEC_PROP_ID não são salvos em um armazenamento serializado."
.. o que eu confesso, eu realmente não entend
Quando restauro o certificado, uso CertFindCertificateInStore () para verificar se o certificado já está presente e somente se não estive
bOK = CertAddCertificateContextToStore(
hDestinationStore,
pCertContext,
CERT_STORE_ADD_USE_EXISTING,
NULL);
Para adicionar o certificado de volta ... Então, minha pergunta é: por que a chave privada não pode ser preservada? Estou esquecendo de algo