Nota Fiscal Eletrônica - Problemas ao importar .pfx para KeyStore

Olá a todos,

Estou iniciando um projeto de NF-e, e no momento tento consultar o status do serviço do ambiente de homologação do SEFAZ-RS.
Já instalei o .PFX no navegador, e consigo acessar o WSDL por ele.

Conforme http://www.guj.com.br/posts/list/81315.java#453873, configuro o certificado do cliente:

System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
System.setProperty("javax.net.ssl.keyStore", "D:\\NFe\\TESTE1.pfx");
System.setProperty("javax.net.ssl.keyStorePassword", "senha");

E ocorre o erro 403, com a seguinte exception:

com.sun.xml.ws.client.ClientTransportException: The server sent HTTP status code 403: Forbidden
	at com.sun.xml.ws.transport.http.client.HttpClientTransport.checkResponseCode(HttpClientTransport.java:232)
	at com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:149)
	at com.sun.xml.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:86)
	at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:595)
	at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:554)
	at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:539)
	at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:436)
	at com.sun.xml.ws.client.Stub.process(Stub.java:248)
	at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:135)
	at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:109)
	at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:89)
	at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:118)
	at $Proxy28.nfeStatusServicoNF(Unknown Source)
	at nfe.ws.WsNfe.statusServico(WsNfe.java:28)
	at nfe.Main.main(Main.java:27)

Porém, o autor do post diz:

Esse arquivo .pfx que tenho é exportado. Executando o mesmo código, porém com um arquivo original, não tenho problema.
Alguém tem idéia de como proceder para o .pfx exportado?

Abraços.

Ola julio!

Bom…o que nosso amigo julianomatias disse, não procede, talvez ele tenha tido outro problema.
O que vc esta fazendo não é setar o keystore, e sim o proprio PFX. Existem as duas forma de vc consumir os WS com SSL, usando da forma que vc fez, mas mudando alguns parametros ou melhor ainda passando direto o Keysote. Neste link em meu blog, http://mateusprado.com/blog/?p=12, varias pessoas do proprio GUJ ja usaram e tiveram sucesso.
Para setar o keysote em sua classe, vc pode usar da seguinte forma:

		
		String keystore = "arquivo.jks"
		String storepass = "senhaJKS"
		String storetype = "JKS";
		String[][] props = { { "javax.net.ssl.trustStore", keystore, },
				{ "javax.net.ssl.keyStore", keystore, },
				{ "javax.net.ssl.keyStorePassword", storepass, },
				{ "javax.net.ssl.keyStoreType", storetype, }, };
		for (int i = 0; i < props.length; i++) {
			System.getProperties().setProperty(props[i][0], props[i][1]);
		}

Ou setar o JKS em seu servidor de aplicação, ou Tomcat como expliquei no final do meu post no blog.

Boa sorte

[ ]s,

Mateus, obrigado pela resposta!

Bem, eu incluí o .pfx (exportado) no .jks que estava utilizando anteriormente, e não obtive sucesso. Realizei a configuração via código, já que ainda não estou trabalhando no servidor. O erro é o mesmo.

Porém, executei os mesmos procedimentos para o tal certificado “original”, que citei no primeiro post. Funcionou novamente!

Resumindo, o arquivo original funciona para ambos os casos, e o exportado, em nenhum.

Já estaria a ponto de dizer que há algo de errado com o exportado, mas a empresa possui um componente em Delphi que consegue utilizá-lo normalmente.

[quote=juliogalvaofilho]Mateus, obrigado pela resposta!

Bem, eu incluí o .pfx (exportado) no .jks que estava utilizando anteriormente, e não obtive sucesso. Realizei a configuração via código, já que ainda não estou trabalhando no servidor. O erro é o mesmo.

Porém, executei os mesmos procedimentos para o tal certificado “original”, que citei no primeiro post. Funcionou novamente!

Resumindo, o arquivo original funciona para ambos os casos, e o exportado, em nenhum.

Já estaria a ponto de dizer que há algo de errado com o exportado, mas a empresa possui um componente em Delphi que consegue utilizá-lo normalmente.[/quote]
juliogalvaofilho, estou com o mesmo problema que vc. Conseguiu resolver o seu?
Baixei a cadeia de certificados do site da Sefaz Virtual RS (https://nfe.sefazvirtual.rs.gov.br/). Estou “empacotando” tudo em um .jks e adicionando o certificado do cliente por últimos, e não consigo consultar status do serviço, sempre me retorna o erro 403 Forbiden.
Alguem tem alguma idéia do que pode ser?

No meu caso, tive que trabalhar manualmente sobre o certificado.
Primeiro, mandei instalar novamente no navegador, permitindo que a cadeia de certificados seja exportada; Então, mandei exportar pelo navegador, incluindo toda a cadeia. Funcionou normalmente.

Isso tá longe do ideal, sei que os clientes vão querer passar o certificado e pronto, o sistema que se vire… Mas por enquanto foi o que consegui fazer, para trabalhar mais em cima da montagem do xml da nota.

[quote=juliogalvaofilho]No meu caso, tive que trabalhar manualmente sobre o certificado.
Primeiro, mandei instalar novamente no navegador, permitindo que a cadeia de certificados seja exportada; Então, mandei exportar pelo navegador, incluindo toda a cadeia. Funcionou normalmente.

Isso tá longe do ideal, sei que os clientes vão querer passar o certificado e pronto, o sistema que se vire… Mas por enquanto foi o que consegui fazer, para trabalhar mais em cima da montagem do xml da nota.[/quote]
ta, mas o navegador exporta em crt ou cer. Vc então usa o keytool para transformar isso em .jks?

[quote=juliogalvaofilho]No meu caso, tive que trabalhar manualmente sobre o certificado.
Primeiro, mandei instalar novamente no navegador, permitindo que a cadeia de certificados seja exportada; Então, mandei exportar pelo navegador, incluindo toda a cadeia. Funcionou normalmente.

Isso tá longe do ideal, sei que os clientes vão querer passar o certificado e pronto, o sistema que se vire… Mas por enquanto foi o que consegui fazer, para trabalhar mais em cima da montagem do xml da nota.[/quote]
Outra dúvida, acho q vc pode me ajudar: pra SEFAZ VIRTUAL RS quais certificado devo anexar no keytool para poder fazer a comunicação? Já baixei a cadeia de certificado da Sefaz Virtual RS mas não funciona! Meu cliente é de SC.

Para importar no keyStore programaticamente eu uso o .pfx mesmo… exporto o certificado completo, com as cadeias, em PKCS12.

Quanto ao JKS, pra importar no trustStore, eu instalo a chave pública do SEFAZ RS (um arquivo .p7b), exporto o .cer e jogo em um .jks pelo keytool mesmo.

Mas se o teu erro é 403 creio que seja alguma coisa no cliente, conforme já vi em outros posts por aqui… Quando o problema é quanto ao certificado do servidor, você recebe uma “SSL Handshake Exception” ou algo do tipo.

Para importar no keyStore programaticamente eu uso o .pfx mesmo… exporto o certificado completo, com as cadeias, em PKCS12.

Quanto ao JKS, pra importar no trustStore, eu instalo a chave pública do SEFAZ RS (um arquivo .p7b), exporto o .cer e jogo em um .jks pelo keytool mesmo.

Mas se o teu erro é 403 creio que seja alguma coisa no cliente, conforme já vi em outros posts por aqui… Quando o problema é quanto ao certificado do servidor, você recebe uma “SSL Handshake Exception” ou algo do tipo.[/quote]
é, meu erro é um 403.7 Forbidden… pior q o cliente ta usando o mesmo certificado .pfx no emissor da Sefaz e ta transmitindo normalmente as notas.

Pois é, meu problema foi semelhante, já que o componente Delphi que a empresa testou funcionava normalmente.
Resumindo, a solução foi obter um certificado contendo toda a cadeia.

mateusprado,

Como que eu faço para gerar um arquivo.jks?
Estou tentando assinar uma NFe usando um certificado PFX. Já consegui fazer toda a aplicação usando o token, mas não estou sabendo usar com o PFX. Os exemplos passados aqui no foram me ajudaram, mas so não estou sabendo como criar um jks.

Desde ja agradeço pela atenção

vcsmetallica

Aqui diz como criar.

http://www.guj.com.br/article.show.logic?id=141

[]'s

Eu estou precisando entrar em contato com os servidores de conhecimento eletrônico e também estou passando por um problema parecido

eu estou informando o pfx

System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
System.setProperty("javax.net.ssl.keyStore", "Certicado.pfx");
System.setProperty("javax.net.ssl.keyStorePassword", "senha");

estou informando o truststore,

System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", "keystoreACRaiz.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

e estou tentando me comunicar com o webservice utilizando httpconenction
Contudo o erro que sempre volta para mim é

Server returned HTTP response code: 400 for URL: https://homologacao.cte.sefaz.rs.gov.br/ws/ctestatusservico/CteStatusServico.asmx

alguém pode me ajudar?

Estou voltando ao projeto do NFe e me fizeram uma pergunta que eu não soube responder, sobre certificados digitais.
Quando eu criei o sistema eu fiz da seguinte maneira.

importo o pfx (certificado do cliente)

System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
System.setProperty("javax.net.ssl.keyStore", "c:\\cert.pfx");
System.setProperty("javax.net.ssl.keyStorePassword", "senha");

importo o keystore

System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore","c:\\cert.keystore");

O keystore foi gerado da seguinte maneira, download dos certificados publicos no site do SEFAZ, instala, exporta a chave no InternetExplores e cria o keystore com o keytool.

A PERGUNTA É: todo esse trabalho do keystore é realmente necessário? Eu respondi que sim… Ai me perguntaram mas como que o software fornecido pela receita funciona e la você não precisa de nada além do certificado da empresa?

Não sei a resposta…

Alguem aqui sabe como fazer apenas com o certificado da empresa sem precisar se preocupar com o certificado publico???

Obrigado…

O software da receita, se funciona, é porque ele tem o certificado em algum lugar, e \ ou tem a chave pública

para que é necessário o certificado “truststore” para poder autenticar as respostas dadas pela receita federal
e evitar que um hacker possa enviar respostas falsas da receita federal

queria aproveitar para fazer uma pergunta =o
eu ainda não consegui fazer a comunicação com o webservice da receita

estou desenvolvendo o meu trabalho de diplomação sobre isso
então, você poderia me mostrar, ou me falar qual é a sequência necessária para conseguir, ou qual tecnologia java eu poderia usar?

ps: meu último problema é “400 - bad request”

[code]
String soap="<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
"<soap12:Envelope xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=“http://www.w3.org/2001/XMLSchema” xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">"+
soap12:Header”+
"<cteCabecMsg xmlns="http://www.portalfiscal.inf.br/cte/wsdl/CteStatusServico">"+
“41”+
“1.03”+
“”+
“</soap12:Header>”+
soap12:Body”+
“<cteDadosMsg xmlns=“http://www.portalfiscal.inf.br/cte/wsdl/CteStatusServico">"+getDados()+””+
“</soap12:Body>”+
“</soap12:Envelope>”;

        URL url = new URL("https://homologacao.cte.sefaz.rs.gov.br/ws/ctestatusservico/CteStatusServico.asmx");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.addRequestProperty("Request-Method", "POST");
        connection.addRequestProperty("Content-Type", "text/xml");
        connection.addRequestProperty("SOAPAction", "http://www.portalfiscal.inf.br/cte/wsdl/CteStatusServico/cteStatusServicoCT");
        connection.addRequestProperty("Content-Length", soap.length() + "");
        connection.setDoOutput(true);
        connection.setDoInput(true);
        OutputStream out = connection.getOutputStream();
        out.write(soap.getBytes());
        out.flush();
        connection.connect();[/code]

Estou com o mesmo problema.

O que fiz até o momento foi o seguinte:

[list]Baixei a cadeia de certificados daqui: https://homologacao.nfe.sefaz.rs.gov.br/Certificado_AC_NFE.SEFAZ.RS.p7b[/list]
[list]Importei utilizando o mmc ou o internet Explorer, tanto faz[/list]
[list]Exportei cada um dos três certificados (Autoridade Certificadora do SERPRO Final v2, Autoridade Certificadora Raiz Brasileira v1 e Autoridade Certificadora SERPRO v2) respectivamente nfe01.cer, nfe02.cer e nfe03.cer utilizando a opção X.509 codificado na base 64(*.cer) [/list]
[list]keytool.exe -import -alias nfe -keystore c:\nfe\nfe.ks -file c:\nfe\nfe01.cer (nesse momento foi solicitado uma senha para o keystore)[/list]
[list]keytool.exe -import -alias nfe01 -keystore c:\nfe\nfe.ks -file c:\nfe\nfe02.cer[/list]
[list]keytool.exe -import -alias nfe02 -keystore c:\nfe\nfe.ks -file c:\nfe\nfe03.cer[/list]

Utilizo o seguinte código para a consulta status serviço:

NfeStatusServico2 service = new NfeStatusServico2();
NfeStatusServico2Soap port = service.getNfeStatusServico2Soap12();

NfeDadosMsg nfeDadosMsg = new NfeDadosMsg();
NfeCabecMsg nfeCabecMsg = new NfeCabecMsg();

nfeCabecMsg.setCUF("43");
nfeCabecMsg.setVersaoDados("2.00");

nfeDadosMsg.getContent().add(new ObjectFactory().createNfeCabecMsg(nfeCabecMsg));

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", "C:\\nfe\\CERT.pfx");
System.setProperty("javax.net.ssl.keyStorePassword", "123456");

System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", "C:\\nfe\\nfe.ks");

NfeStatusServicoNF2Result result = port.nfeStatusServicoNF2(nfeDadosMsg);

e obtenho o erro:
Exception in thread “main” com.sun.xml.internal.ws.client.ClientTransportException: The server sent HTTP status code 403: Forbidden
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.checkStatusCode(HttpTransportPipe.java:196)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:168)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:83)
at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:105)
at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:587)
at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:546)
at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:531)
at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:428)
at com.sun.xml.internal.ws.client.Stub.process(Stub.java:211)
at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:124)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:98)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
at $Proxy30.nfeStatusServicoNF2(Unknown Source)
at br.com.imdt.portalfiscal.nfe.ConsultaStatus.main(ConsultaStatus.java:104)

Alguém pode me ajudar?
Obrigado!

diogoj,

Tenho esse problema com o Axis. E ate nao resolvi, nao sei o pq isso acontece.

Att

Consegui resolver esse problema fazendo isso:

http://www.guj.com.br/posts/list/148620.java#804676

Agora meu problema é outro, no retorno da chamada a consulta de status de serviço obtenho o seguinte
[[retConsStatServ: null]]

E pra esse eu ainda não encontrei solução, estou pensando em abandonar o AXIS…

[quote=diogoj]Consegui resolver esse problema fazendo isso:

http://www.guj.com.br/posts/list/148620.java#804676

Agora meu problema é outro, no retorno da chamada a consulta de status de serviço obtenho o seguinte
[[retConsStatServ: null]]

E pra esse eu ainda não encontrei solução, estou pensando em abandonar o AXIS…[/quote]

O Axis ja abandonei tem tempo. Estou usando o JAX-WS. Quando vc usa o Netbeans para fazer o parse do wsdl para classe, vc tem que realizar algumas modificações.
Ai fiz essas modificações, tomei uma surra violenta para assinar a diaba da nota e quando envio a mesma, tenho esse retorno de null.
Nao sei mais o que faço. Ja entreguei para Deus!!!
Não retorna erro, somente null.

Att

[quote=diogoj]Estou com o mesmo problema.

O que fiz até o momento foi o seguinte:

[list]Baixei a cadeia de certificados daqui: https://homologacao.nfe.sefaz.rs.gov.br/Certificado_AC_NFE.SEFAZ.RS.p7b[/list]
[list]Importei utilizando o mmc ou o internet Explorer, tanto faz[/list]
[list]Exportei cada um dos três certificados (Autoridade Certificadora do SERPRO Final v2, Autoridade Certificadora Raiz Brasileira v1 e Autoridade Certificadora SERPRO v2) respectivamente nfe01.cer, nfe02.cer e nfe03.cer utilizando a opção X.509 codificado na base 64(*.cer) [/list]
[list]keytool.exe -import -alias nfe -keystore c:\nfe\nfe.ks -file c:\nfe\nfe01.cer (nesse momento foi solicitado uma senha para o keystore)[/list]
[list]keytool.exe -import -alias nfe01 -keystore c:\nfe\nfe.ks -file c:\nfe\nfe02.cer[/list]
[list]keytool.exe -import -alias nfe02 -keystore c:\nfe\nfe.ks -file c:\nfe\nfe03.cer[/list]

Utilizo o seguinte código para a consulta status serviço:

NfeStatusServico2 service = new NfeStatusServico2();
NfeStatusServico2Soap port = service.getNfeStatusServico2Soap12();

NfeDadosMsg nfeDadosMsg = new NfeDadosMsg();
NfeCabecMsg nfeCabecMsg = new NfeCabecMsg();

nfeCabecMsg.setCUF("43");
nfeCabecMsg.setVersaoDados("2.00");

nfeDadosMsg.getContent().add(new ObjectFactory().createNfeCabecMsg(nfeCabecMsg));

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", "C:\\nfe\\CERT.pfx");
System.setProperty("javax.net.ssl.keyStorePassword", "123456");

System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", "C:\\nfe\\nfe.ks");

NfeStatusServicoNF2Result result = port.nfeStatusServicoNF2(nfeDadosMsg);

e obtenho o erro:
Exception in thread “main” com.sun.xml.internal.ws.client.ClientTransportException: The server sent HTTP status code 403: Forbidden
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.checkStatusCode(HttpTransportPipe.java:196)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:168)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:83)
at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:105)
at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:587)
at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:546)
at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:531)
at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:428)
at com.sun.xml.internal.ws.client.Stub.process(Stub.java:211)
at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:124)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:98)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
at $Proxy30.nfeStatusServicoNF2(Unknown Source)
at br.com.imdt.portalfiscal.nfe.ConsultaStatus.main(ConsultaStatus.java:104)

Alguém pode me ajudar?
Obrigado![/quote]
Olá, desculpe voltar nesse assunto, mas como você gerou essa classe NfeStatusServico2 e NfeStatusServico2Soap? A partir de qual WSDL?

Já conseguiu resolver seu problema? Sinto não poder ajudar, ainda, mas estou na parte de verificar o status do serviço ainda.