Asp.net Certificado digital - (Privatekey erro "Keyset does not exist" ou "Conjunto de chaves não encontrada")

Bom Dia Pessoal!

Passei um sufoco para assinar as NF-E ou Nfse pelo fato que não estar conseguindo pegar a "PrivateKey" dentro do certificado.

Bom para resolver o problema fiz os seguintes passos. (Windows 7)

1) Iniciar > Executar > mmc.exe  dentro dele vá em Arquivo > "Adicionar/remover snap-in", procure por "Certificados" > Adicionar > Conta de Computador > Computador Local > Concluir > OK

2) Caso o certificado que você irá usar para assinar as notas eletrônicas não esteja em Certificaso > Pessoal > Certificados  clique sobre a pasta Certificados e com o botão direito > "Todas as tarefas" > Importar.

3) Importando o Certficado > Avançar> "Selecione o arquivo..." Avançar> Informe a senha e marque a opção "Marcar essa chave como exportável...", Avançar > Avançar > Concluir.

4)Agora que seu certificado foi importando vamos dar permissão para o IIS acessar esse certificado vá em "C:\Users\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys" (w7) com o botão direito sobre "MachineKeys" > Propriedades > Segurança > Editar. Adicione os usuario "IIS_USRS" e "IURS" deixe as configurações padrão. "Ler & Executar", "Listar conteúdo da pasta" e "Leitura".

5) Agora vamos pegar o nome do certificado para utilizar no código, volte no mmc.exe na pasta Certificaso > Pessoal > Certificados dois cliques sobre o certificado que irá utilizar vá na aba Detalhes opção Requetente, copie o texto abaixo e transforme esse texto todo em uma uníca linha separando por virgula cada quebra  de linha e removendo o espaço dentro o sinal de "=" exemplo:
CN = EMPRESA DE COMPUTADORES LTDA:99999999000999
OU = PROVEDORA SISTEMAS LTDA
OU = OUTRA INFORMACAO
O = EMPRESA PROPRIETARIA
C = BR

transformado:
"CN=EMPRESA DE COMPUTADORES LTDA:99999999000999, OU=PROVEDORA SISTEMAS LTDA, OU=OUTRA INFORMACAO, O=EMPRESA PROPRIETARIA, C=BR"

6) Agora que estamos com o nome do certificado e com as configurações corretas vamos para o código que irá procurar no repositório "X509Store" o certificado.

C#

string nomeCertificado = "CN=EMPRESA DE COMPUTADORES LTDA:99999999000999, OU=PROVEDORA SISTEMAS LTDA, OU=OUTRA INFORMACAO, O=EMPRESA PROPRIETARIA, C=BR"

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);

store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);

X509Certificate2Collection colecaoCertificados = store.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, nomeCertificado, false);
X509Certificate2 certificado = colecaoCertificados[0];



Ps. importante se precisar atualizar o certificado é necessário remover as permissões do usuário IIS_USRS e IUSRS remover o certificado antigo, adicionar o novo e dar novamente permissão, porque se esses usuário estiverem com permissão quando você adicionar o certificado ele não importará a PrivateKey.

Windows 7 : C:\Users\All Users\Application Data\Microsoft\Crypto\RSA
 usuários: IIS_USRS e IUSRS

Windows 2003: C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA
usuário: Nesse caso vá no IIS, olhe na sua aplicação qual o pool ela usa, depois vá em Application Pool e em propriedade > Identity veja qual a conta está sedo usada para esse pool, caso seja "Network Service" então de permissão aos "Services" caso seja configurado outro usário, então esse deve ter acesso a pasta.

Abraços!
t+


Hoje encontrei essa dica mas não testei ainda.

I found the culprit.
I installed the WinHttpCertCfg tool and granted access to the private key of the certificate.
The command I used is this:
WinHttpCertCfg.exe -g -c LOCAL_MACHINE\MY -s "" -a EVERYONE


 

Comentários

Postagens mais visitadas deste blog

[DICA] SQL Server - Desabilitar / Habilitar chaves estrangeiras (Foreign Key - FK)

Como criar um gerador de machinekey