Chave particular do certificado de permissões .LÍQUIDO 6

0

Pergunta

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

.net acl c# cng
2021-11-24 00:59:41
1

Melhor resposta

0

Veja este projeto de código de postagem para alguns exemplos de código que permite o acesso através de programação (especificamente olhar para o "AddAccessToCertificate" método).

Verificar isto para mais informações: Programaticamente adicionar o certificado para o armazenamento pessoal

2021-12-02 16:48:54

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................