sábado, 10 de janeiro de 2015

Download da Nota Fiscal Eletrônica (NFe) - Instalação do certificado

Download da Nota Fiscal Eletrônica (NFe)

Instalação do certificado


Após o artigo Download da Nota Fiscal Eletrônica (NFe) em que expliquei como fazer o acesso ao servidor da receita através de uma aplicação windows forms c#, segue este artigo que esclarece como configurar o certificado tanto para o windows forms como para para rodar no IIS.

Existem Storages ou armazenamentos distintos. Na aplicação windows forms o certificado na forma de um arquivo pfx deve ser instalado para o usuário local, enquanto que para rodar no IIS deve ser instalado na Máquinha Local - Local Machine.

A instalação procede da mesma forma tanto em uma como em outra, com pequenas diferenças.

1- Abra o MMC (Microsoft Management Console) clicando no windows 7 em iniciar e digitando mmc.exe ou em qualquer windows utilize o atalho iniciar + R que chama a janela executar e digite mmc.exe:



2- Clique em File (Arquivo) / Add-Remove Snap-In e escolha Certificates:

3- Para a aplicação windows forms utiliza-se o My user account. Para o IIS utilize o Computer account:


4- No caso de Computer account aparece uma tela a mais, escolha a primeira opção, computador local:


5- Expanda a pasta Certificates e clique com o botão direito em Personal, All Tasks, Import:


6- Indique o local do arquivo, a senha, e opte por salvar o certificado no local automático baseado no tipo.

7- No caso de windows forms o processo está completo aqui. No caso do IIS é preciso dar permissão de acesso à chave privada ao usuário do IIS, se não vai dar erro na hora de acessar o certificado. Para isso é preciso instalar o utilitário winhttpcertcfg, que se baixa no site da microsoft em: http://www.microsoft.com/en-us/download/details.aspx?id=19801

8- Se sua aplicação no IIS usa impersonation, será preciso dar permissão ao usuário configurado no web.config para o impersonation e também ao usuário do pool do IIS. Caso contrário, apenas ao usuário do pool do IIS. Para saber que usuário é esse, abra o IIS, expanda a pasta sites, clique no site que quer configurar e em advanced settings:



Na primeira linha, ao lado de Application Pool, está o nome do usuário que precisa da permissão.

9- Configurando a permissão:

A) Entre no prompt do DOS e digite cd "pasta que vc instalou o utilitário", por default o comendo seria este: cd "C:\Program Files (x86)\Windows Resource Kits\Tools"

B) Ai execute:

winhttpcertcfg -g -c LOCAL_MACHINE\My -s Nome_Do_Certificado -a UsuarioDoPoolDoIIS

C) E se houver impersonation execute também:

winhttpcertcfg -g -c LOCAL_MACHINE\My -s Nome_Do_Certificado -a UsuarioDoImpersonation


OBS 1:

Se estiver adaptando o código do post anterior para usar numa aplicação Web, não esqueça de mudar a linha:

NFe_Rec.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, certificado);

Para:

NFe_Rec.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, certificado);

Conforme a orientação no comentário do Reginaldo Souza. Obrigado Reginaldo.

10 comentários:

  1. Amigo estou tentando fazer destas forma

    winhttpcertcfg -g -c LOCAL_MACHINE\My -s LRBC COMERCIAL DE MOVEIS E ELETRODOMESTICOS LTDA EPP -a IUSR porém não esta dando certo , ele me abre as opções deste comando , sendo assim nao realiza a operação

    ResponderExcluir
    Respostas
    1. Eu acredito que esteja faltando colocar "COMERCIAL DE MOVEIS E ELETRODOMESTICOS LTDA EPP" entre aspas.

      Excluir
  2. Agora foi muito obrigado , porém estou a seguir o outro exemplo seu de realizar o download do xml pelo site da receita , a outra parte pelo hambiente de densenvolvimento esta ok abaixa o xml certinho , agora qnd coloquei em producao ele nao realiza o download. E agora consegui realizar o registro porem mesmo assim nao faz o download do xml!

    ResponderExcluir
    Respostas
    1. Tem que configurar tudo de novo no servidor, passo a passo. Vai com calma, revê os detalhes. É provável que com algum ajuste a coisa funcione! Boa sorte.

      Excluir
  3. Ufa consegui , vou deixar uma dica ai pra quem tiver dificuldades como eu, depois de um dia consegui resolver, eu achava que o problema esta nas configurações do meu iis , porém pesquisei na net vários artigos e nada me adiantou, foi ai que resolvi analizar o código e vi que em vez de na chamada eu colocar :
    NFe_Rec.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, certificado);

    Substitui o : StoreLocation.CurrentUser por StoreLocation.LocalMachine .
    simples assim mais me levo um dia rs !

    ResponderExcluir
    Respostas
    1. Reginaldo, obrigado pelo comentário que acrescenta informação e enriquece o artigo. No post anterior a aplicação é windows form e usa o certificado local. Neste post eu expliquei como configurar o certificado tanto para aplicações executáveis como para aplicações web com IIS. Também não achei essa informação de forma objetiva em lugar nenhum na net. Foi ótimo você mostrar como adaptar o código do post anterior para o uso numa aplicação web.

      Muito abrigado.

      Excluir
  4. Bom dia

    Estou tentando rodar o comando desta forma:

    winhttpcertcfg -g -c LOCAL_MACHINE\My -s "Coopercam_2016" -a DefaultAppPool

    Mas está retornando o erro:

    Error: Unable to find or obtain a context for requested certificate

    Pode me ajudar

    ResponderExcluir
    Respostas
    1. Bom dia

      Consegui resolver este erro. Vacilo feio meu. Estava colocando o nome do arquivo do certificado e não do certificado. Sou juninho.

      Mas agora gerou outro erro.

      Error: Unable to update security info key container, error = 0x5

      Pode me ajudar?

      Excluir
    2. Resolvi este também. Mais um vacilo de juninho.
      O prompt tem que ser aberto como administrador.

      Excluir
    3. Às vezes é preciso paciência com erros alheios, e muitas vezes é preciso paciência com nossos próprios erros. ;)
      Continua tentando e boa sorte!

      Excluir