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

24 respostas
J

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.

24 Respostas

M

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,

J

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.

X

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.


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?

J

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.

X

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.


ta, mas o navegador exporta em crt ou cer. Vc então usa o keytool para transformar isso em .jks?

X

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.


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.

J

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.

X

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.
é, 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.

J

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.

V

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

M

Aqui diz como criar.

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

[]'s

B

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?

R

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…

B

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"
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\">"+
                        "<cUF>41</cUF>"+
                        "<versaoDados>1.03</versaoDados>"+
                        "</cteCabecMsg>"+
                        "</soap12:Header>"+
                        "<soap12:Body>"+
                        "<cteDadosMsg xmlns=\"http://www.portalfiscal.inf.br/cte/wsdl/CteStatusServico\">"+getDados()+"</cteDadosMsg>"+
                        "</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();
D

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!

V

diogoj,

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

Att

D

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…

V

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…

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

J

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!


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.

J

vcsmetallica:
diogoj,

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

Att

Estou com esse mesmo problema com o Axis2, será que você resolveu seu problema?
Tenho dois certificados (tokens) tipo A3, comprados e registrados pela mesma entidade (Certisign e ECP Brasil), não entendo o porque desse Forbiden.

org.apache.axis2.AxisFault: Transport error: 403 Error: Forbidden at org.apache.axis2.transport.http.HTTPSender.handleResponse(HTTPSender.java:310) at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:200) at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:76) at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:400) at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:225) at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:435) at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:402) at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229) at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165) at emissor.ws.h.status.NfeStatusServico2Stub.nfeStatusServicoNF2(NfeStatusServico2Stub.java:173) at emissor.lib.NFe.getStatusServico(NFe.java:438) at emissor.ui.NotasFiscaisUI$1.run(NotasFiscaisUI.java:156)

J

Bom dia

Estou precisando fazer a implementação da NFe, segui os passos descritos acima mas to encontrando o seguinte erro:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
	at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
	at com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl.connect(Unknown Source)
	at com.windi.nfe.teste.NfeTeste.main(NfeTeste.java:32)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
	at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
	at sun.security.validator.Validator.validate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
	... 12 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
	at java.security.cert.CertPathBuilder.build(Unknown Source)
	... 18 more

Segue o código fonte:

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:\\temp\\windi2.pfx");
		System.setProperty("javax.net.ssl.keyStorePassword", "rua progresso 167");

		System.setProperty("javax.net.ssl.trustStoreType", "JKS");
		System.setProperty("javax.net.ssl.trustStore", "C:\\nfe\\nfe.ks");
J
Certeza que o problema está:
// ou nessa linha
System.setProperty("javax.net.ssl.keyStore", "C:\\temp\\windi2.pfx");

// ou nessa linha
System.setProperty("javax.net.ssl.trustStore", "C:\\nfe\\nfe.ks");
N

juliogalvaofilho,

primeiro instale o certificado e tente acessar a URL do web service via browser. Se não conseguir, pode ser problema no certificado. Se conseguir, tenta a sugestão do diogoj, acessa este post

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

e faz os passos que o alexegidio propõe. Para mim funcionou.

Configuração:

System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");  
System.setProperty("javax.net.ssl.keyStore", "C:\\nfe\\CERT.pfx"); //pfx exportado, seguindo os passos do alexegidio 
System.setProperty("javax.net.ssl.keyStorePassword", "senha");  
  
System.setProperty("javax.net.ssl.trustStoreType", "JKS");  
System.setProperty("javax.net.ssl.trustStore", "C:\\nfe\\nfe.ks");
System.setProperty("javax.net.ssl.trustStorePassword", "senha");

NOTA: o arquivo jks eu obtenho da seguinte forma: eu acesso a URL do Web Service com o Firefox (não importe o certificado para o firefox, pelo menos não agora). Deve abrir uma página dizendo que a conexão não é confiável. Você deve clicar em ‘Entendo Riscos -> Adicionar Exceção’, e logo após em ‘Confirmar exceção de segurança’. Depois você vai em opções no firefox, acessa a aba ‘Criptografia’ e clica no botão Certificados. Acesse a aba Servidores e lá estarão alguns certificados. Você deve selecionar o certificado que tenha relação com o que você fazendo. No meu caso, o nome do certificado que aparece é ‘hom.nfe.fazendo.gov.br’ caso seja homologação e ‘www.nfe.fazendo.gov.br’ caso seja produção. Depois de selecionado, clique no botão exportar e será exportado um arquivo de extensão .cer. Este arquivo é que eu importo para o jks através do seguinte comando:

keytool -import -v -trustcacerts -alias nfe -file C:\cert\hom.nfe.fazenda.gov.br.crt - keystore C:\cert\nfe.jks -keypass 123456 -storepass 123456

Boa Sorte!

J

Boa noite

Acho que eu não captei alguma parte desse tutorial.

O estranho que acho que fiz exatamente os procedimentos descritos nos tutoriais e nada. Nem chega acessar pelo browser. Eu baixei os arquivos dos certificados do site do sefaz: https://nfe.sefazvirtual.rs.gov.br/. Importei no IE no firefox. Exportei eles, inclusive fiz um teste com um keystore e consegui ler a chave dentro do keystore. Porém na hora de executar o webservice dá esse maldito erro.

Engraçado que no IE eu fiz o teste do browser, tentando acessar pela URL e também não acessa.

Alguém poderia me enviar esse trustStore com os certificados?

[] s

Criado 8 de maio de 2009
Ultima resposta 7 de mar. de 2011
Respostas 24
Participantes 11