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

questionAnswers(1)

yourAnswerToTheQuestion