Problemas ao usar SSL

7 respostas
V

Gelara do GUJ,

Estou fazendo tendo que desenvolver a tal da nota fiscal eletrônica, quando vou consumir o webservice da receita esta dando o erro que segue abaixo
Segue também o meu código que estou usando. Ja procurei na net e nao achei uma solução. Espero que alguem já tenha trabalhado com webserice + ssl.
Mais uma coisa, estou usando Xfire para ler o meu WSDL

Código do java

NfeCancelamentoClient client = new NfeCancelamentoClient();
        
		//create a default service endpoint
        NfeCancelamento service = client.getNfeCancelamento("https://hnfe.fazenda.mg.gov.br/nfe/services/NfeCancelamento");
        service.nfeCancelamentoNF("nfeCabecMsg", "nfeDadosMsg");
        
		//TODO: Add custom client code here
        		//
        		//service.yourServiceOperationHere();
        
		System.out.println("test client completed");
        		System.exit(0);

Erro que esta dando

Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: Couldn't send message.
org.codehaus.xfire.fault.XFireFault: Couldn't send message.
	at org.codehaus.xfire.fault.XFireFault.createFault(XFireFault.java:89)
	at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:30)
	at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
	at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)
	at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)
	at org.codehaus.xfire.client.Client.invoke(Client.java:336)
	at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)
	at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)
	at $Proxy8.nfeCancelamentoNF(Unknown Source)
	at teste.NfeCancelamentoClient.main(NfeCancelamentoClient.java:115)
Caused by: org.codehaus.xfire.XFireException: Couldn't send message.
	at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:145)
	at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)
	at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)
	... 8 more
Caused by: 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(Alerts.java:150)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1476)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:847)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106)
	at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495)
	at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:815)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1025)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:619)
	at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
	at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
	at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:828)
	at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.flushRequestOutputStream(MultiThreadedHttpConnectionManager.java:1565)
	at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2077)
	at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
	at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
	at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
	at org.codehaus.xfire.transport.http.CommonsHttpMessageSender.send(CommonsHttpMessageSender.java:369)
	at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:123)
	... 10 more
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(PKIXValidator.java:221)
	at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:145)
	at sun.security.validator.Validator.validate(Validator.java:203)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172)
	at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:840)
	... 28 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236)
	at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:194)
	at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216)
	... 33 more

Valeu galera

7 Respostas

T

Olhando o certificado do site, você pode ver que a cadeia de certificação é:

Autoridade Certificadora Raiz Brasileira
-> AC Certisign V3
–> AC PRODEMGE
—> hnfe.fazenda.mg.gov.br

Você pode acrescentar um dos certificados (hnfe.fazenda.mg.gov.br) ao arquivo CACERTS, ou então pode acrescentar os 4 certificados, por via das dúvidas.

V

thingol,

obrigado pela dica, mas eu nem sei por onde começar. Nunca trabalhei com webservice com SSL. trabalho bastante com webservice mas é a primeira vez que trabalho com SSL.
Tem como vc me dar umas dicas, onde que ue acho uma documentação bacana, um livro, qualquer coisa assim.

Desde já agradeço

T

Vi pelo Internet Explorer que essa URL requer que o SSL seja feito usando-se um “client certificate”. Ou seja, você precisa especificar também um keystore, e ter um certificado (de teste ou real?) emitido por alguma autoridade certificadora, não um certificado “fake”.

Acho que você vai ter de ver com o pessoal de TI da Secretaria da Fazenda aí de MG, porque deve haver mais alguma coisa que você precisa fazer(talvez providenciar uma URL de um servidor de teste, e um certificado para você que seja de teste.).

V

thingol,

A receita solicita que a empresa tenha o próprio certificado digital. Ja temos esse certificado.
Tentei usar o seguinte código:

char[] pwd = {'s','e','n','h','a'};
    	HttpSecureProtocol protocolSocketFactory = new HttpSecureProtocol();
    	TrustMaterial trustMaterial = new TrustMaterial("C:\\temp\\teste.cer", pwd);

    	// We can use setTrustMaterial() instead of addTrustMaterial() if we want to remove
    	// HttpSecureProtocol's default trust of TrustMaterial.CACERTS.
    	protocolSocketFactory.addTrustMaterial(trustMaterial);

    	// Maybe we want to turn off CN validation (not recommended!):
    	protocolSocketFactory.setCheckHostname(false);

    	Protocol protocol = new Protocol("https", (ProtocolSocketFactory) protocolSocketFactory, 8443);
    	Protocol.registerProtocol("https", protocol);

ocorre o seguinte erro:

xception in thread "main" java.security.KeyStoreException: failed to extract any certificates or private keys - maybe bad password?
	at org.apache.commons.ssl.KeyStoreBuilder.parse(KeyStoreBuilder.java:432)
	at org.apache.commons.ssl.TrustMaterial.<init>(TrustMaterial.java:213)
	at org.apache.commons.ssl.TrustMaterial.<init>(TrustMaterial.java:205)
	at org.apache.commons.ssl.TrustMaterial.<init>(TrustMaterial.java:195)
	at org.apache.commons.ssl.TrustMaterial.<init>(TrustMaterial.java:190)
	at teste.NfeCancelamentoClient.main(NfeCancelamentoClient.java:99)

Cara, esse negocio é muito chato. Não tem como sair fora.

Atenciosamente

V

Galera,

Consegui resolver o problema acima. Entrei em contato com o fabricante do token e eles me passaram um exemplo de como adquirir os dados do mesmo.
Agora estou com um outro problema, estou tentando consumir o webservice que esta em https. Não estou conseguindo. O erro do retorno é o seguinte:

Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: Couldn't send message.
org.codehaus.xfire.fault.XFireFault: Couldn't send message.
	at org.codehaus.xfire.fault.XFireFault.createFault(XFireFault.java:89)
	at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:30)
	at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
	at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)
	at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)
	at org.codehaus.xfire.client.Client.invoke(Client.java:336)
	at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)
	at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)
	at $Proxy8.nfeCancelamentoNF(Unknown Source)
	at teste.NfeCancelamentoClient.main(NfeCancelamentoClient.java:115)
Caused by: org.codehaus.xfire.XFireException: Couldn't send message.
	at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:145)
	at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)
	at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)
	... 8 more
Caused by: 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(Alerts.java:150)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1476)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:847)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106)
	at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495)
	at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:815)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1025)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:619)
	at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
	at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
	at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:828)
	at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.flushRequestOutputStream(MultiThreadedHttpConnectionManager.java:1565)
	at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2077)
	at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
	at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
	at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
	at org.codehaus.xfire.transport.http.CommonsHttpMessageSender.send(CommonsHttpMessageSender.java:369)
	at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:123)
	... 10 more
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(PKIXValidator.java:221)
	at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:145)
	at sun.security.validator.Validator.validate(Validator.java:203)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172)
	at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:840)
	... 28 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236)
	at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:194)
	at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216)
	... 33 more

Nunca mexi com certificado digital. Se alguem souber de livros, sites onde explica como trabalhar com HTTPS + consumo de webservice também será bem vindo.

Atenciosamente

T

O seu problema ainda persiste.

Dica: seu problema ainda não é de web services; é de cadeia de certificados (certificate chain).

V

thingol

Como devo proceder então? Não sei mais o que fazer.

Atenciosamente

Criado 18 de junho de 2008
Ultima resposta 23 de jun. de 2008
Respostas 7
Participantes 2