Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Giancarlo Braga

NFe: Instalando certificado digital no Windows Server

Recommended Posts

Olá pessoal do Imasters.

 

Estava eu desenvolvendo o módulo de autenticação de XMLs do setor de NFe na empresa onde trabalho e tive um sério problema para instalar o certificado A1 e fazer funcionar via ASP.NET dentro do ambiente Windows Server.

 

O mesmo código foi testado em uma máquina comum com Windows 7 e uma com Windows XP, e em ambas o código funcionava tranquilamente ao validar o XML com o certificado. Contudo, no servidor que usa Windows Server 2008 nada!

 

Já estava quase solicitando a compra de uma máquina à parte com Windows 7 para deixar de servidor de autenticação funcionando em paralelo com o Servidor central quando me apareceu a famigerada solução. Foram várias horas gastas com isso e muitos fóruns/sites internacionais. De qualquer forma, Como já vi pessoas perguntando isso neste fórum e sei que não sou o único, vou compartilhar a solução porque tenho certeza que irá ajudar alguém que está desesperado pra fazer isso funcionar.

 

Começando:

A instalação em si diretamente do certificado pelo site da sua certificadora não irá funcionar. Pois exige permissões de ActiveX que o Windows Server não é compatível. Por isso, o melhor a ser feito para iniciar o processo é instalar o seu certificado numa máquina com Windows XP ou Windows 7 e EXPORTAR o certificado dessa máquina, gerando um arquivo com extensão PFX. E a partir desse arquivo você inclui ele no servidor e realiza a operação de IMPORTAR o certificado.

 

Agora vem uma parte importante, pois há um porém e gera dúvidas nas pessoas. O que acontece é que a importação que as empresas certificadoras documentam seria para outras máquinas com Windows XP ou 7. E essa importação comum, via o Internet Explorer, NÃO VAI FUNCIONAR no Windows Server.

 

No Windows Server a instalação do certificado deve ser feita não em repositório do usuário(que é o processo pelo Opções de Internet>>Conteúdo no Internet explorer, mas sim em repositório da máquina que é feito via Snap-IN no MMC). Taí um detalhe que poucos conhecem e acabam desistindo.

 

Portanto, você seguirá os seguintes passos para importar esse arquivo PFX para o seu Windows Server:

- Abra o Iniciar, Executar e digitar MMC. Abrirá então uma tela e você deverá inserir um Snap-In. Para isso, basta digitar o atalho do teclado(ctrl+M).

- Na tela que abre, na lista da esquerda, temos a lista de Snap-Ins disponíveis. Selecione certificado e dê um adicionar>>.

- Selecione 'conta de computador' e avance.

- Selecione 'computador local' e conclua, depois dê OK na tela de adicionar snap-in retornando à tela principal do MMC.

- Dentro dessa tela principal do MMC, note que surgiu o item 'Certificados' na lista. Abra este item.

- Localize o item pessoal, que deverá ser o primeiro da lista. E clique com o botão direito nele.

- Aponte para 'Todas as Tarefas' e clique em 'Importar...'

- Avance, e ao servidor solicitado selecione via Browser o seu certificado PFX que levou ao servidor, avance de novo e selecione todas as opções que aparecerem. Depois finaliza o processo.

- Agora está de volta ao MMC, certo? Recomendo salvar esse Snap-In através do menu Arquivo. Para que tenha fácil acesso aos detalhes de configuração de seu certificado.

Depois disso tudo, você pode fechar o MMC e vá até a seguinte pasta:

C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA

 

Dentro da pasta RSA, localize a pasta MachineKeys.

Então siga os passos:

- Botão direito em MachineKeys e clica em propriedades.

- Ache a aba segurança e acesse.

- Dê um adicionar, clique em avançado na tela que abrir, e na próxima dela clique em 'Localizar Agora'.

- Ao vir a lista de todo mundo, selecione o seu usuário atual, no meu caso usei Todos de uma vez.

- Dê OK, e OK novamente. Após isso marque controle total na primeira tela e dê OK.

 

Agora estará tudo pronto para usar no código ASP.NET.

No entanto, quando eu testava o código no ambiente Windows 7, eu usava o repositório pessoal(chamado de My) e selecionava o certificado no 'CurrentUser'. Agora você deve usar LocalMachine. Isso é bem importante, caso contrário não vai funcionar.

 

Veja um exemplo de código em VB.NET:


           xnome = "CN=TESTE, OU=(EM BRANCO), OU=(EM BRANCO), OU=(EM BRANCO), OU=(EM BRANCO), OU=(EM BRANCO), OU=XXXXXXXXXXXXXXXXXXX, OU=(EM BRANCO), O=ICP-Brasil, C=BR"

           oX509Cert = New X509Certificate2()

           store = New X509Store(StoreName.My, StoreLocation.LocalMachine)
           store.Open(OpenFlags.ReadOnly Or OpenFlags.OpenExistingOnly)
           collection = store.Certificates

           scollection = collection.Find(X509FindType.FindBySubjectDistinguishedName, xnome, False)
           Dim qualcertificado As String, expiracaoCertificado As String

           For Each certificadoSelecionado In scollection
               qualcertificado = certificadoSelecionado.Subject.ToString
               expiracaoCertificado = certificadoSelecionado.GetExpirationDateString
           Next

           Response.Write(">>> Certificado utilizado:" & qualcertificado & "<br>")
           Response.Write(">>> Certificado expira em:" & expiracaoCertificado & "<br>")

 

E a partir daí é o processo de autenticação que suponho que já tenha.

Se ainda não souber como fazer essa autenticação tem um exemplo aqui:

http://provapraticavb.blogspot.com/2009/05/nf-e-criando-um-validar-para-nf-e-em.html

Esse exemplo funciona super bem para NFe versão 2.0.

Ele trás junto um validador de Schema que eu julgo desnecessário. No meu sistema eu removi, mas aí vai de cada um.

 

Talvez você se pergunte o porquê de ser tão complicado e porquê não seria o processo comum como no Windows 7.

Basicamente acredito que seja questão de permissões e modo de operação específico. Talvez tenham outros jeitos, mas este funciona bem para meus anseios.

Quando eu inicialmente fiz o processo de Windows 7 no Windows Server exportando pelo Internet Explorer, dava o erro m_safecertcontext manipulador inválido. E aí descobri que o repositório utilizável no Windows Server aparentemente é só o local machine, que só é acessível pelo Snap-In na ferramenta MMC.

 

Com isso, ainda não estava tudo certo. Ainda dava este erro ao validar: 'O conjunto de chaves não existe'. Este erro acontece pois infelizmente precisa-se dar a permissão à pasta que ficam armazenados estes certificados.

 

Se você NÃO souber como obter a string para usar como fiz no meu exemplo de código, você poderá abrir o seu arquivo do MMC, Lista de Certificados >> Pessoal >> Certificados e clica duas vezes em cima do seu certificado na lista central. Vá até detalhes, ache o campo requerente. Para adaptar para o .NET você só precisa trocar os espaços por vírgulas, igual fiz em meu exemplo. Daria pra selecionar esse certificado usando de várias formas, como o serial por exemplo. Mas aí você poderá pesquisar por sua conta mais detalhes do uso de certificados com protocolo X509.

 

Referências de pesquisa(Em Inglês):

http://www.chilkatsoft.com/p/p_309.asp

http://www.receita.fazenda.gov.br/PessoaFisica/ReceitaNet/MsgErroReceitanet.htm

http://www.kerrywong.com/2006/12/01/using-x509-certificate-with-web-service-in-aspnet/

 

Grato,

Giancarlo Braga.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro não era devido à instalação e sim um erro no meu xml...

 

eu assino qdo gero o xml, só que eu gerei e assinei sem o namespace da tag NFe e depois inseria o que gerava erro de calculo.

 

----

 

com relação ao processo, em meu servidor windows server 2003 funcionou perfeitamente..

 

parabéns pelo trabalho de pesquisa, que é relativamente 'chato'

 

kkkk

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Giancarlo! Estava a tempo buscando por essa solução e achei o seu post! Muito bom!

Por acaso você implementou para o uso do certificado A3?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Giancarlo, para quem não tem win XP alguma solução? Fiz todos os outros passos mas continua dando o erro "m_safecertcontext manipulador inválido."
Não sei mais o que fazer..

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.