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:
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:
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

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.
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.
Amigo estou tentando fazer destas forma
ResponderExcluirwinhttpcertcfg -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
Eu acredito que esteja faltando colocar "COMERCIAL DE MOVEIS E ELETRODOMESTICOS LTDA EPP" entre aspas.
ExcluirAgora 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!
ResponderExcluirTem 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.
ExcluirUfa 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 :
ResponderExcluirNFe_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 !
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.
ExcluirMuito abrigado.
Bom dia
ResponderExcluirEstou 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
Bom dia
ExcluirConsegui 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?
Resolvi este também. Mais um vacilo de juninho.
ExcluirO prompt tem que ser aberto como administrador.
Às vezes é preciso paciência com erros alheios, e muitas vezes é preciso paciência com nossos próprios erros. ;)
ExcluirContinua tentando e boa sorte!