NFe Erro "403.7 - Forbidden" ao acessar Webservices asmx [RESOLVIDO!]

Boa tarde à todos!

Tô com um problema que muitos passaram aqui no fórum, porém até agora não consegui encontrar uma solução.
Não consigo comunicar com nenhum webservice em .NET.
Dá sempre a mensagem:

403.7 - Forbidden

O serviço que estou tentando acessar é o status do SCAN

https://hom.nfe.fazenda.gov.br/NFeStatusServico/NFeStatusServico.asmx?wsdl

Este é meu método que faz segurança na aplicação antes de consumir o serviço

private void setSecurity(String pathCertificado, String senhaCertificado,
			boolean a3, String keyStore) throws KeyStoreException,
			NoSuchAlgorithmException, CertificateException, IOException {

		if (a3) {
			Provider p = new sun.security.pkcs11.SunPKCS11(pathCertificado);
			Security.addProvider(p);
			KeyStore ks = KeyStore.getInstance("pkcs11");
			ks.load(null, senhaCertificado.toCharArray());

			System.setProperty("java.protocol.handler.pkgs",
					"com.sun.net.ssl.internal.www.protocol");
			System.setProperty("javax.net.ssl.keyStoreType", ks.getType());
			System.setProperty("javax.net.ssl.keyStorePassword",
					senhaCertificado);
		} else {
			System.setProperty("java.protocol.handler.pkgs",
					"com.sun.net.ssl.internal.www.protocol");
			Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

			System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
			System.setProperty("javax.net.ssl.keyStore", pathCertificado);
			System.setProperty("javax.net.ssl.keyStorePassword",
					senhaCertificado);
		}
		System.setProperty("javax.net.ssl.trustStoreType", "JKS");
		System.setProperty("javax.net.ssl.trustStore", keyStore);
		
	}

Creio que seja os Webservices em .NET exijam algum certificado que somente o IE possui, pois por ele eu acesso tranquilamente, mas com minha aplicação Java e pelo Firefox, neca!
Por favor ajudem um amigo Javaneiro !!!

Depois de muito caminhar consegui uma solução!!! :smiley:

Vou postar aqui para ajudar a quem precisar pois este é um dos assuntos mais comentados em relação à NFe.
Parece que os webservices .NET de alguma forma não reconhecem o certificado do cliente original. Para resolver isso siga os passos:

1 - Importe o certificado .PFX do seu cliente para o IE >>> FERRAMENTAS/OPÇÕES DA INTERNET/ ABA CONTEÚDO / BOTÃO CERTIFICADOS.

2- Selecione a aba “Pessoal”.

3- Clique em importar.

4- O Sistema vai abrir um assistente. Selecione o Certificado e clique em avançar.

5- Na próxima tela MARQUE O CHECBOX “Marcar esta chave como exportável. Isso possibilitará o backup e transporte das chaves posteriormente”. Como o texto diz se você não marcar esta opção o certificado não poderá ser exportado

6- Após ser importado seu certificado vai para a aba Pessoal. Clique sobre ele e clique em “exportar”

7- Clique em avançar

8- Na próxima tela marque a opção: “Sim, exportar a chave privada”. Clique em avançar.

9- Na janela seguinte marque o checkbox “Incluir todos os certificados no caminho de certificação, se possível”. [color=blue]<<ESTA OPÇÃO É CRUCIAL NÃO ESQUEÇA DELA !!![/color]

10- Informe a senha e a seguir o local onde o arquivo será salvo.

PRONTO Feito isso está pronto você já pode utilizar o certificado no seu projeto.

Agora uma crítica, talvez seja ignorância a minha, mas porque somente os webservice em .NET fazem essa “exigência” para utilização do certificado ???

Agradeço a todos que tiveram a mesma atitude que a minha pois dessa forma não seria possível chegar a essa solução !

Pensamento do dia: “Eu gosto do Windows. O Windows que não gosta de mim.”

1 curtida

Compilar incluindo a chave publica não parece ser o mais adequado, pois quando expirar o certificado ou tiver que trocá-lo terá que gerar uma nova versão da aplicação.

Para ser mais objetivo, não é operacional, não é prático.

Se deixares o arquivo da chave pública no mesmo diretorio da aplicacao, basta trocar o arquivo quando necessário.

É apenas minha opinião, mas pensem, fica bem mais prático para implementar a aplicação.

Alex,
você conseguiu conectar no web services usando .NET? Eu tenho bastante experiência em Java porém estou num projeto usando especificamente .net (c#).
Sempre obtenho o erro 403. Forbidden. Já instalei e reinstalei o certificado .pfx de todas as formas, e até agora nada. Consigo acessar com sucesso o WSDL pelo IE e também usar o próprio aplicativo da receita. Mas no código c#… nada!
Acredito que seja da forma como estou importando o certificado para o código c#. Desculpe colocar c# aqui, mas esse problema tá persistindo por muito tempo e está dificil de achar a solução.

Obrigado

Olá alexegidio,

Esse tutorial simples me poupou várias horas!!! Pois no meu projeto, com certificação cruzada, não tinha me ligado que nos debugs do SSL que o PFX utilizado só tinha o certificado SEM as cadeias! :roll:

Fiz o que o tutorial disse, e deu certo! :smiley:

Abraço.

Uma outra solução em:

http://www.guj.com.br/java/238251-nfe-erro-4037—forbidden-ao-acessar-webservices-asmx-com-certificado-a3

também pode ser acessado em:

http://a4t.in/xwiki/bin/view/Blog/ForbiddenNFe

Espero ter ajudado