Próbuję zaimportować certyfikat z kluczem prywatnym w magazynie certyfikatów systemu Windows. Mogę z powodzeniem zaimportować certyfikat, za pomocą następującego
X509Certificate2 certificate = new(certByteArray, certPassword, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);
X509Store store = new(StoreName.TrustedPeople, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(certificate);
Ale problem, z którym mam do czynienia, polega na tym, jak zapewnić użytkownikowi dostęp do klucza prywatnego programowo.
Znalazłem te linki przydatne:
https://www.pkisolutions.com/accessing-and-using-certificate-private-keys-in-net-framework-net-core/
CngKey Przypisuje pozwolenie na klucz maszynowy
Ustaw prawa dostępu do certyfikatu PrivateKey w .NET 5
Mogę zapewnić dostęp do interfejsu użytkownika za pomocą certlm.msc > Przeciągnij i upuść certyfikat w magazynie >> Kliknij prawym przyciskiem myszy certyfikat >>> Wszystkie zadania >>>> Zarządzanie kluczem prywatnym >>>>> Dodaj użytkownika i rozdzielczość
Ale muszę to zrobić programowo
Istnieją zmiany .NET Full Framework, z których pochodzą przykłady. Poświęciłem na to więcej dni, próbowałem kilka certyfikatów, certyfikat zdecydowanie jest oznaczony jako eksportowalny i działa w imieniu administratora. Jestem zadowolony z decyzji tylko dla systemu Windows
To jest zamknięty, co mam
const string NCRYPT_SECURITY_DESCR_PROPERTY = "Security Descr";
const CngPropertyOptions DACL_SECURITY_INFORMATION = (CngPropertyOptions)4;
X509Store trustedPeopleStore = new(StoreName.TrustedPeople, StoreLocation.LocalMachine);
trustedPeopleStore.Open(OpenFlags.ReadWrite);
var certificates = trustedPeopleStore.Certificates.Find(X509FindType.FindByThumbprint, "xxxxxxxxxxxxxxxxxxxxxx", false);
RSA rsa = certificates[0].GetRSAPrivateKey();
RSACng rsaCng = rsa as RSACng;
CngProperty prop = rsaCng.Key.GetProperty(NCRYPT_SECURITY_DESCR_PROPERTY, DACL_SECURITY_INFORMATION);
Widzę RSACng.Klucz jest do debugowania, ale się zawiesi w następnym wierszu (na pewno może być wyeksportowany), uzyskując właściwość
Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: 'Key not valid for use in specified state.'
Czytałem też komentarze o tym, że nie należy próbować instalować acl bezpośrednio w pliku, ale nie jestem pewien, czy jest to właściwe czy nie