mudando messing senha w / chamada recipientes principais sob win 7
Pergunta
Em alguns sistemas que executam o Windows 7, onde geramos uma chave em um nome do contêiner de chave, se alterar a senha do usuário, quando chamamos CryptAcquireCertificatePrivateKey () teremos um erro CRYPT_E_NO_KEY_PROPERTY (0x8009200B).
Esta não acontece em todas as caixas. Nós originalmente pensei que era algo para w / a máquina de domínio não está na rede e lá não poderia atualizá-lo coisas de domínio, mas conseguimos reproduzir em algumas máquinas independentes.
Meu código para a leitura da chave
if((StoreHandle = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, QWARQ_CERT_STORE_NAME)) != NULL)
{
/* Look for certificate with matching user guid. */
if((CertContext = CertFindCertificateInStore(StoreHandle,PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR,DataBuffer, NULL)) != NULL)
{
if(CryptAcquireCertificatePrivateKey(CertContext, 0,NULL, &CryptProvHandle, &KeySpec, &FreeHandle))
{
}
else
{
DWORD dwError=GetLastError(); //CRYPT_E_NO_KEY_PROPERTY
}
}
}
aqui é o código que gera o contêiner de chave / key
if(CryptAcquireContext(&hCryptProv,KEY_CONTAINER_NAME, NULL,PROV_RSA_FULL, 0) == FALSE) //CRYPT_NEWKEYSET
{
DWORD result = GetLastError();
if (NTE_BAD_KEY_STATE == result)
{
DebugLogging::DbgPrintF(TEXT("[CertInitialization] NTE_BAD_KEY_STATE - user has changed his password \n"), result);
return false;
}
else if (NTE_BAD_KEYSET != result)
{
DebugLogging::DbgPrintF(TEXT("[CertInitialization] could not acquire CSP[0x%x]\n"), result);
return false;
}
if(CryptAcquireContext(&hCryptProv, KEY_CONTAINER_NAME, NULL,PROV_RSA_FULL, CRYPT_NEWKEYSET) == FALSE) //CRYPT_NEWKEYSET
{
DWORD result = GetLastError();
DebugLogging::DbgPrintF(TEXT("[CertInitialization] could not acquire CSP from new keyset[0x%x]\n"), result);
return false;
}
}
if(CryptGenKey(hCryptProv, AT_KEYEXCHANGE, RSA2048BIT_KEY |CRYPT_EXPORTABLE, &hKey)== FALSE)
{
DebugLogging::DbgPrintF(TEXT("CertGeneration() could not generate key[%d]\n"),GetLastError());
return false;
}
Solução
Depois de aprender mais sobre DPAPI
Alterar senha de
Neste método, não há continuidade de acesso a chaves mestras do usuário durante uma alteração de senha. A DPAPI é invocado pelo componente Winlogon durante operações de alteração de senha em um domínio do Active Directory:
* DPAPI receives notification from Winlogon during a password change operation.
* DPAPI decrypts all master keys that were encrypted with the user's old passwords.
* DPAPI re-encrypts all master keys with the user's new password.
Password Reset (Set)
Neste método, um administrador forçosamente redefine uma senha de usuário. A redefinição de senha é mais complexo do que uma alteração de senha. Porque o administrador não estiver conectado como o usuário e não tem acesso a senha antiga do usuário, a senha antiga não pode ser usada para descriptografar a chave mestra e re cifrar-lo velha com a nova senha.