A vide, sans certificat
Du point de vue de certutil
c:\temp>certutil -user -store my CertUtil: -store La commande s'est terminée correctement. c:\temp>certutil -store my CertUtil: -store La commande s'est terminée correctement.
Du point de vue des conteneurs de clés
c:\temp>pkconteneurs Conteneur(s) utilisateur : Conteneur(s) machine :
Avec des certificats…
Installation de deux certificats (un dans le magasin utilisateur, l’autre machine)
c:\temp>certutil -user -p password -importpfx user.p12 c:\temp>certutil -p password -importpfx machine.p12
Du point de vue de certutil
c:\temp>certutil -user -store my ================ Certificat 0 ================ Objet: CN=user_export_noprotect Conteneur de clé = user_export_noprotect-050c8772-126a-4815-8de8-0d3b27dda6e1 c:\temp>certutil -store my ================ Certificat 0 ================ Objet: CN=machine_export_noprotect Conteneur de clé = machine_export_noprotect-69edbe24-fc12-43ff-ae70-7fa3ce723058
Du point de vue des conteneurs de clés
c:\temp>pkconteneurs Conteneur(s) utilisateur : user_export_noprotect-050c8772-126a-4815-8de8-0d3b27dda6e1 Conteneur(s) machine : machine_export_noprotect-69edbe24-fc12-43ff-ae70-7fa3ce723058
A vide, en ayant supprimé les certificats
Suppression des certificats précédemment importés
c:\temp>certutil -user -delstore my "user_export_noprotect" Suppression du certificat 0 c:\temp>certutil -delstore my "machine_export_noprotect" Suppression du certificat 0
Du point de vue de certutil
c:\temp>certutil -user -store my CertUtil: -store La commande s'est terminée correctement. c:\temp>certutil -store my CertUtil: -store La commande s'est terminée correctement.
Du point de vue des conteneurs de clés
c:\temp>pkconteneurs Conteneur(s) utilisateur : user_export_noprotect-050c8772-126a-4815-8de8-0d3b27dda6e1 Conteneur(s) machine : machine_export_noprotect-69edbe24-fc12-43ff-ae70-7fa3ce723058
Conclusion
Il semblerait que les conteneurs des clés privées des certificats précédemment importés soient encore présent…
Astuce disponible dans mimikatz (export des clés privées orphelines) !
Code de l’éxecutable : pkconteneurs
#pragma comment(lib, "advapi32.lib") #include <windows.h> #include <iostream> using namespace std; void listContainers(bool isMachine) { DWORD flags = CRYPT_VERIFYCONTEXT | (isMachine ? CRYPT_MACHINE_KEYSET : NULL); HCRYPTPROV hCryptProv = NULL; if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, flags)) { DWORD buflen = 0; if(CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS, NULL, &buflen, CRYPT_FIRST)) { char * cname = new char[buflen]; for (DWORD idx = 0;;idx++) { if(CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS, reinterpret_cast<BYTE *>(cname), &buflen, (idx == 0 ? CRYPT_FIRST : CRYPT_NEXT))) { wcout << cname << endl; } else { break; } } delete[] cname; } } CryptReleaseContext(hCryptProv, 0); } int wmain(int argc, wchar_t * argv[]) { wcout << L"Conteneur(s) utilisateur :" << endl << endl; listContainers(false); wcout << endl; wcout << L"Conteneur(s) machine :" << endl << endl; listContainers(true); wcout << endl; return ERROR_SUCCESS; }