J'essaie d'importer un certificat avec la clé privée dans le Magasin de Certificats Windows. Je peux importer le certificat à l'aide de la ci-dessous
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);
Mais le problème que j'ai est, comment donner à un utilisateur l'accès à la clé privée de la programmation.
J'ai trouvé ces liens utiles:
https://www.pkisolutions.com/accessing-and-using-certificate-private-keys-in-net-framework-net-core/
CngKey Affecter l'autorisation de clé machine
Jeu de Certificat PrivateKey Autorisations dans .NET 5
Je peux accorder l'accès via l'INTERFACE utilisateur avec certlm.msc > faites Glisser certificat au magasin Personnel > cliquez-Droit sur le certificat > Toutes les Tâches > Gérer les clés privées > Ajouter l'utilisateur et l'autorisation
Mais j'ai besoin de le faire par programmation
Il y a des changements de .NET, Plein Cadre, qui est l'endroit où les exemples proviennent. J'ai passé plus d'une journée sur l', essayé plusieurs certificats, le certificat est certainement marquée comme étant exportable et l'exécution de VS en tant qu'administrateur. Je suis heureux avec un Windows seule solution
C'est à peu près aussi proche que j'ai
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);
Je peux voir le rsaCng.Clé présente en debug, mais il échoue sur la ligne suivante (c'est certainement exportable) l'obtention de la propriété avec
Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: 'Key not valid for use in specified state.'
J'ai également lire les commentaires que vous ne devriez pas essayer le réglage de l'acl directement sur le fichier, mais vous ne savez pas si c'est correct ou pas