Eu estou tentando importar um certificado com a chave privada para o Armazenamento de Certificados do Windows. Eu posso importar com êxito o certificado utilizando o abaixo
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);
Mas o problema que eu tenho é, como conceder a um usuário acesso à chave privada através de programação.
Eu encontrei estes links úteis:
https://www.pkisolutions.com/accessing-and-using-certificate-private-keys-in-net-framework-net-core/
CngKey Atribuir permissão para máquina de chave
Definir Certificado PrivateKey Permissões .NET 5
Eu posso conceder acesso através da INTERFACE do usuário com certlm.msc > Arraste o certificado para o armazenamento Pessoal > botão Direito do mouse o certificado > Todas as Tarefas > Gerenciar chaves privadas > Adicionar o usuário e permissão de
Mas eu preciso fazer isso programaticamente
Existem alterações a partir de .NET Estrutura Completa, que é onde os exemplos que vêm. Eu passei mais de um dia nele, tentei vários certificados, o certificado é definitivamente marcada como exportável e a execução de VS como administrador. Eu estou feliz com o Windows única solução
Este é o mais próximo que eu tenho
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);
Eu posso ver o rsaCng.Chave presente na depuração, mas falha na linha seguinte (ele definitivamente é exportável) obtendo a propriedade com
Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: 'Key not valid for use in specified state.'
Eu também li comentários de que você não deve tentar definição de acl diretamente no arquivo, mas não tenho certeza se isso é correto ou não