Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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:
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:
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.
Carregando comentários...