Estoy tratando de importar un certificado con la clave privada en el Almacén de Certificados de Windows. Puedo importar correctamente el certificado con el siguiente
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);
Pero el problema que tengo es, ¿cómo dar a un usuario el acceso a la clave privada mediante programación.
He encontrado estos enlaces útiles:
https://www.pkisolutions.com/accessing-and-using-certificate-private-keys-in-net-framework-net-core/
CngKey Asignar permiso a máquina clave
Certificado Set PrivateKey Permisos .NETO 5
Me pueden conceder el acceso a través de la interfaz de usuario con certlm.msc > Arrastre certificado Personal de la tienda > clic Derecho en el certificado de > Todas las Tareas > Administrar claves privadas > Añadir el usuario y el permiso
Pero necesito hacer esto mediante programación
Hay cambios de .NET Completo Marco que es donde los ejemplos provienen de. Me he pasado más de un día en él, probado con varios certificados, el certificado está definitivamente marcada como exportable y ejecución de VS como administrador. Soy feliz con un Windows única solución
Esto es lo más cercano que como tengo
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);
Puedo ver la rsaCng.Clave presentes en la depuración, pero falla en la línea siguiente (que sin duda es exportable) obtener la propiedad con
Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: 'Key not valid for use in specified state.'
También he leído comentarios de que usted no debe tratar de configuración de la acl directamente en el archivo, pero no estoy seguro si eso es correcto o no