Nota Fiscal Eletrônica - Problema ao conectar em webservices ASP.NET

Boa noite pessoal, já pesquisei no fórum e ainda não achei uma resposta satisfatória para esse problema, desculpem-me se eu estiver repetindo algo já resolvido.

Nossa empresa desenvolveu o software de emissão de nota fiscal eletrônica em Java, no estado do Paraná e tudo está funcionando corretamente, a conexão com o servidor da SEFAZ PR está ocorrendo sem nenhum problema

Segue abaixo o código em que seto as configurações do SSL no Java

            System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
            System.setProperty("javax.net.debug", "all");

            if (configuracao.getTipoCertificado() == 0) {
                pks = KeyStore.getInstance("PKCS12");
                pks.load(new FileInputStream(configuracao.getCertificado()), configuracao.getSenha().toCharArray());
                Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
                System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
                System.setProperty("javax.net.ssl.keyStore", configuracao.getCertificado());
            } else {
                Security.addProvider(new sun.security.pkcs11.SunPKCS11("token.cfg"));
                System.setProperty("javax.net.ssl.keyStore", "NONE");
                System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-masternfe");
                System.setProperty("javax.net.ssl.keyStoreType", "PKCS11");
                pks = KeyStore.getInstance("PKCS11");
                pks.load(null, configuracao.getSenha().toCharArray());
            }
            System.setProperty("javax.net.ssl.keyStorePassword", configuracao.getSenha());
            System.setProperty("javax.net.ssl.trustStoreType", "JKS");
            System.setProperty("javax.net.ssl.trustStore", keystoreUrl.getPath());

Estou tendo problemas para conectar no WebService do SCAN, que é feito em .net, pelo que eu entendi o certificado do cliente não está sendo enviado e está sendo retornada a mensagem “HTTP Error 403.7 - Forbidden: SSL client certificate is required.<br>Internet Information Services (IIS)</h2>”.

O log, muito grande, tive que por no pastebin
http://pastebin.com/m6961d1a3

Vocês que também estão trabalhando com nota fiscal eletrônica estão passando pelas mesmas dificuldades? Estão conseguindo conectar-se ao SCAN?

Muito obrigado desde já.

Pessoal,

        Estou com o mesmo problema, ja tenho um aplicativo NFE funcionando perfeitamente com certificados do tipo A1 e tambem com A3 (cartão) em varios clientes. Agora algums clientes que adquiriram o Certificado A3 (cartão) da certisign apresentam as mesma mensagem do amigo acima 403.7 (certificado do cliente é requerido), o mais estranho é que com certificado A3 (cartão) de outras ACs como SERASA funcionam normalmente. Gostaria de saber se alguem ja resolveu esse problema e gostaria tb de ajudar aqueles que estão comecando esse batalha.

PS. A assinatura do arquivo funciona normamente, no IE acesso normalmente o WS do SEFAZ.

Consegui resolver meu problema. Na verdade o problema está no certificado do meu cliente. O que o pessoal da receita falou é que pode acontecer do CNPJ do cliente não estar cadastrada na base que o SCAN lê, e, nesse caso, é mostrada a mensagem de acesso negado. Eu vi que trocando o certificado resolvia meu problema. O atendente da receita falou para eu entrar em contato com o suporte federal da nota fiscal eletrônica, mas como esse assunto foge da minha competência, não é problema meu, é do cliente, eu nem fui mais atrás disso. Mas fica aí a dica!

Obrigado pelo sua resposta.

          O problema é que se eu instalar o aplicaitivo Emissor de NFE (Java) disponibilizado pelo SEFAZ-SP, e utilizar o mesmo certificado A3 (cartao) funciona perfeitamente. E o pior é que o meu cliente sabe disso :).

Agradeco se alguem me ajudar na solução desse problema.

Senhores,

Decobri o problema com o meu certificado A3 (cartao). Utilizando o Gerenciador de Certificados da Certisign observei que dentro do cartao somente existia o certificado do cliente, e nos outro cartoes que eu tinha (funcionando) alem do certificado do cliente tambem existiam outros certificados, Raiz ICP-Brasil e alguns da propria Certsign, o que fiz:

  1. baixei os tres certificados do link abaixo:
    http://www.certisign.com.br/suporte/utilitarios-criptograficos/hierarquias-de-certificacao/icp-brasil/nf-e

  2. importer os 3 (tres) certificado para dentro do cartao do cliente utilizando o Gerenciador da Certsign, opcao Identidade Digitais->Importar Certificado…

E o problema esta resolvido. Pessoal quem nao entendeu ou quer mais detalhes pode enviar email. Obrigado pelo apoio de todos…

Pessoal, estou tendo certas dificuldades na criação das rotinas para NFE. O meu cliente possui certificado A3 e gostaria de saber como pegar o certificado e a senha para as configurações de SSL?

Por exemplo:
System.setProperty(“javax.net.ssl.keyStore”, configuracao.getCertificado());
System.setProperty(“javax.net.ssl.keyStorePassword”, configuracao.getSenha());

Como pegar o certificado e a senha?

O desenvolvimento da NFE é para um sistema web em java utilizando o tomcat.

Desde já agradeço,

Ricardo

Posso estar falando uma grande besteira agora, mas dificilmente você terá exito ao usar um certificado A3 para uma solução Web, pois a assinatura é feita pelo cartão e o cartão não está ligado no servidor Web e sim no cliente. Talvez alguma coisa com applet, mas não vejo uma solução trivial para esse caso

Concordo com vc…
Como o sistema é web, com certeza terei que criar um applet para recuperar essas informações e passar ao servidor.

Mas mesmo assim, a minha dúvida continua… Como pegar o certificado e a senha e especificar as configurações SSL para um certificado A3?

Abraço,

Quando voce usa Certificado do tipo A3 o certificado não pode ser retirado do cartão, somente acessado e utilizado para assinatura e envio do XML, abaixo esta o codigo que voce deve usar para carregar o certificado antes de chamar o WebService:


    public static final String SMARTCARD_CFG = "conf/SmartCard.cfg";

    public static void loadA3Certicates() {
    	try {
		Provider p = new sun.security.pkcs11.SunPKCS11(SMARTCARD_CFG);
    		Security.addProvider(p);
    		NfeAssinaA3.ks = KeyStore.getInstance("pkcs11", p);
    		
                char[] pin = CfgController.NOM_SENHACERTI.toCharArray();
    		NfeAssinaA3.ks.load(null, pin);

    		System.setProperty("javax.net.ssl.keyStore", "NONE");
    		System.setProperty("javax.net.ssl.keyStoreType", "PKCS11");
    		System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-SmartCard");
		
    		System.setProperty("javax.net.ssl.trustStoreType", "JKS");
    		System.setProperty("javax.net.ssl.trustStore","certs/ac-br.jks");
    	} catch (Exception e) {
    		log.error("NfeUtils.loadA3Certicates(): " + e.toString());
	}
    }

Conteudo do arquivo conf/SmartCard.cfg:

name = SmartCard
library = c:\windows\system32\aetpkss1.dll

qualquer duvida pode me adiconar no msn, macielgoncalves.msn@hotmail.com

abracos…

Cara tenho uma dúvida básica.

Como eu gero/encontro/exporto/etc o certs/ac-br.jks?

Isse teria que vir do token?

Boa tarde Colega,

     Eu utilizo uma classe java para gerar o cacerts passando como parametro o endereco do WebService (InstallCert.java);

Usage: java InstallCert homologacao.nfe.sefazvirtual.rs.gov.br

Valeu pela ajuda!

[quote=carlsonwf]Posso estar falando uma grande besteira agora, mas dificilmente você terá exito ao usar um certificado A3 para uma solução Web, pois a assinatura é feita pelo cartão e o cartão não está ligado no servidor Web e sim no cliente. Talvez alguma coisa com applet, mas não vejo uma solução trivial para esse caso[/quote][quote=rnicolletti]Post 13/10/2009 14:22:28 Assunto: Re:Nota Fiscal Eletrônica - Problema ao conectar em webservices ASP.NET
Concordo com vc…
Como o sistema é web, com certeza terei que criar um applet para recuperar essas informações e passar ao servidor.

Mas mesmo assim, a minha dúvida continua… Como pegar o certificado e a senha e especificar as configurações SSL para um certificado A3?

Abraço,[/quote]
Excelente dedução…
Vou explicar a modelagem utilizada em ambiente JAVA para assinatura do XML para envio ao webservice da Nota Eletrônica:
[list]Servlet 1 devidamente parametrizado (o certificado recebe alguns parâmetros além de login e senha) faz requisição ao Applet assinador[/list][list]Por sua vez este Applet assinador autentica o certificado e faz requisição ao Servlet 2 devidamente receptivo aos parâmetros (XML assinado);[/list][list]Servlet 2 de posse do XML certificado faz requisição ao web-service da Nota Eletrônica apresentando o resultado[/list]Obs.: Esta solução utiliza controles JSF, AJAX para controlar alguns comportamentos de fluxo.

[quote=macielgoncalves]Quando voce usa Certificado do tipo A3 o certificado não pode ser retirado do cartão, somente acessado e utilizado para assinatura e envio do XML, abaixo esta o codigo que voce deve usar para carregar o certificado antes de chamar o WebService:


    public static final String SMARTCARD_CFG = "conf/SmartCard.cfg";

    public static void loadA3Certicates() {
    	try {
		Provider p = new sun.security.pkcs11.SunPKCS11(SMARTCARD_CFG);
    		Security.addProvider(p);
    		NfeAssinaA3.ks = KeyStore.getInstance("pkcs11", p);
    		
                char[] pin = CfgController.NOM_SENHACERTI.toCharArray();
    		NfeAssinaA3.ks.load(null, pin);

    		System.setProperty("javax.net.ssl.keyStore", "NONE");
    		System.setProperty("javax.net.ssl.keyStoreType", "PKCS11");
    		System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-SmartCard");
		
    		System.setProperty("javax.net.ssl.trustStoreType", "JKS");
    		System.setProperty("javax.net.ssl.trustStore","certs/ac-br.jks");
    	} catch (Exception e) {
    		log.error("NfeUtils.loadA3Certicates(): " + e.toString());
	}
    }

Conteudo do arquivo conf/SmartCard.cfg:

name = SmartCard
library = c:\windows\system32\aetpkss1.dll

qualquer duvida pode me adiconar no msn, macielgoncalves.msn@hotmail.com

abracos…[/quote]

Estou fazendo exatamente isto, mas está me retornando um erro:

org.apache.axis2.AxisFault: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
...
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Mas tenho certeza que o certificado está sendo carregado, pois utilizo o mesmo código para a aplicação que assina os XMLs.

Acredito que o erro aqui seja só porque a classe que faz a conexão com o Web Service da receita não está conseguindo encontrar o que precisa pra assinar a conexão.

Alguém saberia como resolver isto??

Meu código está asssim:

// Obtém o certificado do cartão

Provider pr = new sun.security.pkcs11.SunPKCS11(config);
java.security.Security.addProvider(pr);
    
    try {
			
    	XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
    	
    	KeyStore ks = ks = KeyStore.getInstance("pkcs11");
	ks.load(null, senha);
			
	KeyStore.PrivateKeyEntry keyEntry = null;

	for (Enumeration e = ks.aliases(); e.hasMoreElements();)
	{
		keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry((String) e.nextElement(),
						new KeyStore.PasswordProtection(pin));
	}

	X509Certificate cert = (X509Certificate) keyEntry.getCertificate();
			
	KeyInfoFactory kif = fac.getKeyInfoFactory();
	ArrayList x509Content = new ArrayList();
	x509Content.add(cert);
	X509Data xd = kif.newX509Data(x509Content);
	KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));
			
}
catch 
... etc etc etc


// Configura parâmetros:

System.setProperty("javax.net.ssl.keyStore", "NONE");
System.setProperty("javax.net.ssl.keyStoreType", "pkcs11");
System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-SafeSign");
		
//		System.setProperty("javax.net.ssl.trustStore", "NONE");		
//		System.setProperty("javax.net.ssl.trustStoreType", "pkcs11");		
//		System.setProperty("javax.net.ssl.trustStoreProvider", "SunPKCS11-SafeSign");
//		
//		System.setProperty("javax.net.ssl.keyStorePassword", "123456");
//		System.setProperty("javax.net.ssl.trustStorePassword", "123456");

Mas está retornando o erro lá em cima.

Alguma luz aí galera???

Obrigado

Para gerar o keystore (ou public key ou ainda trustkey) use o programa keytool

e faça da seguinte maneira

Baixe o certificado no site do SEU ESTADO, ele estará em p7k ou pk7

mude a terminacao para CER

rename SEFAZSP.p7k SEFAZSP.CER

keytool -importcert -trustcacerts -alias nfesp -file -keystore

Exemplo:

keytool -importcert -trustcacerts -alias nfesp -file SEFAZSP.CER -keystore PUBLICKEY.jks

digite uma senha que será usada no codigo abaixo

[code]import br.inf.portalfiscal.nfe.wsdl.nfestatusservico.NfeStatusServico;
import br.inf.portalfiscal.nfe.wsdl.nfestatusservico.NfeStatusServicoSoap;
import java.security.Security;

public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

String nfeCabecMsg =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>"
+ "<cabecMsg xmlns=“http://www.portalfiscal.inf.br/nfe” "
+ “versao=“1.02”>” + “1.07”
+ “”;

String nfeDadosMsg =
	"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
	+ "<consStatServ " + " versao=\"1.07\""
	+ " xmlns=\"http://www.portalfiscal.inf.br/nfe\">"
	+ "<tpAmb>1</tpAmb>" + "<cUF>35</cUF>"
	+ "<xServ>STATUS</xServ>" + "</consStatServ>";
            [b]System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true");[/b]
	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", "/home/nevorah/tendenza/nfe/certs/CERTIFICADO.p12");
	System.setProperty("javax.net.ssl.keyStorePassword", "00000000");

	System.setProperty("javax.net.ssl.trustStoreType", "JKS");
	System.setProperty("javax.net.ssl.trustStore", "/home/nevorah/tendenza/nfe/certs/PUBLICKEY.jks");
	System.setProperty("javax.net.ssl.trustStorePassword", "00000000");

	NfeStatusServico service = new NfeStatusServico();
	try {
		NfeStatusServicoSoap nfeStatus = service.getNfeStatusServicoSoap();
		System.out.println(nfeStatus.nfeStatusServicoNF(nfeCabecMsg,nfeDadosMsg));
	} catch (Throwable e1) {
		e1.printStackTrace();
	}
 }

}[/code]

Olá a todos!!!

Estou desenvolvendo um sistema para impressão de NF-e para minha empresa. Estou querendo saber como faço, depois de entrar com os dados (ou buscar os mesmo na base de dados) enviar os dados para serem validados junto a receita e gerar a NF-e. Sei que existe o sistema da receita que faz isso, mais sou programador e quero desenvolver um sistema que me atenda melhor e que possa atender minhas filiais conectando via internet para acesso ao banco de dados. caso alguém esteja com um tutorial para isso ou que saiba como conectar, no java, ao site da receita, gostaria que me enviasse ou me passasse parte do código para que eu possa desenvolver esse sistema.

Desde já agradeço a ajuda e a atenção de todos e obrigado pela ajuda!

Renato Mendes

Vais ter que estudar sobre a comunicação com web service, assinatura digital, manipulação de xml, etc…etc…etc…

Primeira coisa a se fazer… é baixar o manual de integração do contribuinte, lá vc vai ver onde baixar os ws dos web services da receita e verá o protocolo que vc tem que desenvolver para se comunicar com eles… procure no site da sefaz o manual…

Depois tome um cafézinho para baixar o nervosismo, e o “pavorismo”…he he he… da quantidade de coisa que vais ter que desenvolver…e mãos a obra…

[quote=macielgoncalves]Senhores,

Decobri o problema com o meu certificado A3 (cartao). Utilizando o Gerenciador de Certificados da Certisign observei que dentro do cartao somente existia o certificado do cliente, e nos outro cartoes que eu tinha (funcionando) alem do certificado do cliente tambem existiam outros certificados, Raiz ICP-Brasil e alguns da propria Certsign, o que fiz:

  1. baixei os tres certificados do link abaixo:
    http://www.certisign.com.br/suporte/utilitarios-criptograficos/hierarquias-de-certificacao/icp-brasil/nf-e

  2. importer os 3 (tres) certificado para dentro do cartao do cliente utilizando o Gerenciador da Certsign, opcao Identidade Digitais->Importar Certificado…

E o problema esta resolvido. Pessoal quem nao entendeu ou quer mais detalhes pode enviar email. Obrigado pelo apoio de todos… [/quote]

Desculpe pelo up no topico mas gostaria de tirar uma duvida: como vc fez pra importar os certificados no cartão? Eu estou usando o programa charismatics security token configurator, ele tem a opção de importar certificado mas fica sempre desabilitada.