Neste outro post, eu falei sobre como utilizar Web Services em um programa .NET. Usando as dicas contidas naquele post para adicionar os Web Services da Receita Federal a um projeto do Visual Studio é possível que você se depare com uma mensagem similar a esta:
The request failed with HTTP status 403: Forbidden.
Metadata contains a reference that cannot be resolved: 'endereço-do-web-service'.
The HTTP request was forbidden with client authentication scheme 'Anonymous'.
Metadata contains a reference that cannot be resolved: 'endereço-do-web-service'.
The HTTP request was forbidden with client authentication scheme 'Anonymous'.
O servidor da Receita Federal está configurado para exigir a identificação de todos os usuários através de um certificado digital válido. O acesso através do Visual Studio para obter a descrição WSDL dos serviços não é diferente. O que a mensagem está dizendo é que você não informou um certificado que o autorize a acessar o site. No caso do Visual Studio, é feita automaticamente a seleção de um certificado digital que tenha sido inserido na área Personal do Certificate Store do Windows. Por isso, ter instalado tal certificado válido emitido por uma entidade autorizada (Correios, Serasa ou Certisign, por exemplo) é imprescindível já no momento de adicionar os Web Services ao projeto e não apenas para assinar os XMLs que serão enviados à Receita Federal.
Depois que você conseguiu importar os Web Services, você pode usá-los em seu projeto para enviar solicitações de uso de notas fiscais, dentre outros serviços disponíveis. Quando seu programa chama a função de um dos Web Services para enviar ou solicitar informações ao servidor da Receita, este erro é reportado pelo programa:
The HTTP request was forbidden with client authentication scheme 'Anonymous'.
É bastante parecida com a mensagem anterior mas, nesse ponto, você já deve ter instalado um certificado válido no Certificate Store. Então, a causa provável é que você não configurou a forma com que a mensagem SOAP (o XML de comunicação com o Web Service) será transportada via internet, usando o protocolo HTTPS. Quando você importa um Web Service, o Visual Studio automaticamente insere num arquivo chamado app.config toda a configuração associada ao serviço, incluindo aquelas relativas ao transporte das mensagens via HTTPS.
Há particularmente dois parâmetros neste arquivo cujos valores padrões diferem do exigido pelo servidor da Receita: authenticationScheme e requireClientCertificate. O primeiro indica como o usuário será validado, sendo que o valor padrão é "Anonymous" para indicar que nenhuma validação é esperada. Como eu disse antes, o servidor da Receita só libera o acesso se um certificado foi informado. Portanto, o valor desse parâmetro deve ser alterado para "Digest". O segundo parâmetro deve ter valor "true", confirmando que o servidor exige que sua aplicação envie os dados do certificado para garantir a autenticação. O quadro abaixo traz o trecho de um app.config como exemplo, mostrando como fica a configuração para o serviço de consulta de uma nota fiscal:
<binding name="NfeConsulta2Soap12">
...
<httpsTransport authenticationScheme="Digest" requireClientCertificate="true" ... />
</binding>
...
<httpsTransport authenticationScheme="Digest" requireClientCertificate="true" ... />
</binding>
Por uma questão de clareza, foram omitidas outras configurações que aparecem neste mesmo contexto. Lembre-se ainda que as configurações são feitas por Web Service, isto é, cada serviço da Receita que você for suportar tem que ser configurado neste arquivo da mesma forma que foi feito no exemplo.
Após realizar as modificações do app.config citadas, você ainda pode ser brindado com o erro abaixo:
The client certificate is not provided. Specify a client certificate in ClientCredentials.
Mais uma vez, a culpa é a falta do certificado digital. Nós declaramos que o serviço exige que especifiquemos um certificado. Mas, ao contrário do ambiente do Visual Studio, um Web Service no seu programa não é capaz de detectar automaticamente qual certificado deve ser usado. Por isso, devemos atribuí-lo manualmente antes de fazer a chamada à função do Web Service:
NfeConsulta2Soap12Client lServ;
lServ = new NfeConsulta2Soap12Client ("NfeConsulta2Soap12", _UrlWebservice);
lServ.ClientCredentials.ClientCertificate.Certificate = GetCertificado;
XmlNode status = lServ.nfeConsultaNF2 (ref lCabec, XmlDoc);
lServ = new NfeConsulta2Soap12Client ("NfeConsulta2Soap12", _UrlWebservice);
lServ.ClientCredentials.ClientCertificate.Certificate = GetCertificado;
XmlNode status = lServ.nfeConsultaNF2 (ref lCabec, XmlDoc);
O post neste link mostra como navegar no Certificate Store para encontrar um certificado específico. É o que faz a minha função GetCertificado, usada no código de exemplo acima. A variável _UrlWebservice também é minha e contem o endereço (URL) real do Web Service que será acessado.
A arquitetura montada pela Receita Federal permite que você opere num ambiente de homologação (para testes) ou direto no de produção (onde as notas fiscais entram efetivamente na base de dados da Receita). Além disso, cada unidade da Federação disponibiliza seu próprio conjunto de endereços dos Web Services destinados aos contribuintes dessa unidade. É normal, portanto, que os programas para atender a NFe sejam construídos de forma flexível, permitindo receber os diferentes conjuntos possíveis. Obviamente, essa flexibilidade traz consigo o risco de que um endereço errado seja especificado. Se isto ocorrer, a seguinte mensagem será reportada:
Unable to handle request. The action 'http://www.portalfiscal.inf.br/nfe/wsdl/NfeConsulta2/nfeConsultaNF2' was not recognized.
Isso significa apenas que você está tentando chamar uma função que não está implementada no endereço URL que você informou. A solução aqui é simples: verifique o endereço que está sendo passado à instância do Web Service - no exemplo anterior, seria descobrir o conteúdo da variável _UrlWebservice. Você pode até mesmo gerar um log imediatamente antes de fazer a chamada à função do Web Service, se for o caso.
Uma última recomendação. Se for criar um serviço Windows para monitorar as notas fiscais que entram para submetê-las à Receita, fique atento ao fato de que esse serviço pode ser executado com as credenciais de um usuário diferente daquele que está logado no Windows - normalmente, a conta Local System.
Neste cenário, o serviço não enxergará certificados digitais instalados na área Personal do Store de seu usuário Windows e você poderá receber uma porção das mensagens citadas neste post. Por isso, é recomendável que o certificado esteja instalado na área Personal do Store do Local Computer pois nessa área ele estará disponível a qualquer usuário do computador. Não se esqueça de restringir o acesso ao login desse computador por questões de segurança.

Valeu pela dica, nem percebi que estava chamando a função errada. Estava recebendo o erro:
ResponderExcluirUnable to handle request. The action 'http://www.portalfiscal.inf.br/nfe/wsdl/NfeConsulta2/nfeConsultaNF2' was not recognized.
Muito interessante seu post. No entanto, tenho uma duvida e fico grato se puder me responder:
ResponderExcluirem algumas pesquisas sobre WebServices, alguem levantou um topico que a receita federal disponibilizava um metodo que retornava o XML quando se consultava uma NFe no site. Sei que esta duvida não esta bem no contexto deste tópico, mas gostaria de saber se o Sr. sabe da existencia deste método, pois quero importar o xml direto do site da receita para minha aplicacão e com um metodo que retornasse o xml pelo WS ficaria mais facil...
Grato pela atenção!
Desconheço a existência desse tipo de serviço ... Oficialmente, a lista dos Web Services disponíveis é a que se está no endereço http://hom.nfe.fazenda.gov.br/portal/webServices.aspx?tipoConteudo=Wak0FwB7dKs= (ambiente de homologação).
ResponderExcluirExplicações sobre o funcionamento de cada um deles - incluindo as informações que eles retornam - podem ser encontradas no Manual de Integração distribuido pela Receita Federal e acessível neste link.
Olha nem sei como agradecer, meu ajudou muito essa informação, obrigado mesmo
ResponderExcluirO seu post é muito bom. No entanto, continuo com problemas a configurar a o serviço..
ResponderExcluirNa versão 4.0 é um pouco diferente...
e em código estou a associar o certificado à referência para o web Service... mesmo assim aparece a mensagem
"The HTTP request was forbidden with client authentication scheme 'Anonymous'."
Agradeço desde já se tiver alguma dica que possa ajudar. Obrigado
Sérgio
ResponderExcluirRecompilei minha aplicação com target na versão 4 do .NET e ainda assim funcionou o acesso ao Web Service.
O seu problema acontece já no desenvolvimento da aplicação ou só depois que a pôs em produção ? Em qualquer das situações, confirme que o arquivo .config modificado de acordo com o post está na mesma pasta do executável.
Certifique-se também que alterou o .Config da aplicação e não diretamente o que está na pasta release e/ou debug. Esses últimos são atualizados automaticamente pelo VS, o que sobreporia quaisquer alterações ...
[]
Obrigado pela resposta Luís,
ResponderExcluirEntretanto consegui resolver o problema. A configuração exigia outras definições adicionais porque estou a aceder ao serviço de NFS-e.
Obrigado uma vez mais
Sergio, tambem estou com o mesmo problema. Como conseguiu resolver? Quais as definicoes adicionais necessarias? Gostaria muito se me ajudasse nisso.
ExcluirObrigado.
The impersonation level 'Identification' was specified, yet HTTP Digest authentication can only support 'Impersonation' level when used with an explicit credential.
ResponderExcluirSe você estiver usando um certificado válido e mesmo assim receber a mensagem de "403: Forbidden" na hora de usar o webservice, verifique se tem algum outro certificado instalado que esteja vencido. Se tiver, remova-o e tente novamente.
ResponderExcluirBom Dia! Alguem pode me conceder esse codigo para consumir o nfeconsulta2 ?
ResponderExcluirDaniel
ExcluirConsumir o web service no VS é bastante simples. Depois que você importou as definições do serviço (como mostrado em Usando um Web Service num projeto do Visual Studio), basta instanciar a classe NfeConsulta2Soap12Client gerada automaticamente pela importação e chamar a função nfeConsultaNF2.
[]s
Muito bom o post, porém não estou conseguindo configurar o serviço no Visual Studio. Estou usando a versão 2010 e .Net 4.5. Está dando forbidden porém já instalei os certificados na pasta pessoal. Alguém tem alguma ideia do que possa ser?
ResponderExcluirNathalia
ExcluirUsando o mesmo certificado você consegue acessar o endereço do Web Service no Internet Explorer (ou outro navegador que você use) ? Pode haver algum problema com o certificado (falta da chave privada, por exemplo) ou com a sua infraestrutura de rede (um firewall, por exemlo).
[]s