1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

APLICACAO NFE(Nota Fiscal Eletronica) - Erro de transporte HTTP: java.net.SocketException: java.security.NoSuchAlgorithmException

Para quem esta com problemas relacionados a conexão com Web Service da SEFAZ ai vai uma dica... No meu caso ocorria em uma API para emissao de NFe que estou desenvolvendo. Enquanto eu testava o serviço em tempo de desenvolvimento no ambiente do eclipse funcionava perfeitamente porem quando gerava o .WAR da minha aplicação para publica-la em outro servidor TOMCAT recebia o erro em questão.

O cenário era o seguinte:

  • Path dos arquivos keyStore e o trustStore:
String certificadoDoCliente = getClass().getResource("/certificado/cert.pfx").getPath();
String senhaCertificadoDoCliente = "senha123";
char SEP = File.separatorChar;
String arquivoCacerts = System.getProperty("java.home") + SEP + "lib" + SEP + "security" + SEP + "cacerts";
  • Definição das variáveis globais SSL do Java.
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.clearProperty("javax.net.ssl.keyStore"); 
            System.clearProperty("javax.net.ssl.keyStorePassword");
            System.clearProperty("javax.net.ssl.trustStore");

            System.setProperty("javax.net.ssl.keyStore", certificadoDoCliente);
            System.setProperty("javax.net.ssl.keyStorePassword", senhaCertificadoDoCliente); 
            System.setProperty("javax.net.ssl.trustStoreType", "JKS");
            System.setProperty("javax.net.ssl.trustStore", arquivoCacerts);
            System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Apos as definições do ambiente SSL era feito a tentativa de conexão com o WebService da SEFAZ, que no caso retornava o erro.

Depois de alguns testes resolvi olhar o log do TOMCAT uma vez que o erro só acontecia com o serviço publicado em outro servidor e não em meu ambiente de desenvolvimento. No meio do log de erro do tomcat no servidor aparecia a seguinte linha:

Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext) at java.security.Provider$Service.newInstance(Unknown Source) at sun.security.jca.GetInstance.getInstance(Unknown Source) at sun.security.jca.GetInstance.getInstance(Unknown Source) at javax.net.ssl.SSLContext.getInstance(Unknown Source) at javax.net.ssl.SSLContext.getDefault(Unknown Source) at javax.net.ssl.SSLSocketFactory.getDefault(Unknown Source) at javax.net.ssl.HttpsURLConnection.getDefaultSSLSocketFactory(Unknown Source) at javax.net.ssl.HttpsURLConnection.(Unknown Source) at sun.net.www.protocol.https.HttpsURLConnectionImpl.(Unknown Source) at sun.net.www.protocol.https.Handler.openConnection(Unknown Source) at java.net.URL.openConnection(Unknown Source) at com.sun.xml.internal.ws.api.EndpointAddress.openConnection(Unknown Source) at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.createHttpConnection(Unknown Source) ... 58 more Caused by: java.security.PrivilegedActionException: java.io.FileNotFoundException: C:\Program%20Files\Apache%20Software%20Foundation\Tomcat%208.5\webapps\MakroDFeService\WEB-INF\classes\certificado\cert.pfx (O sistema não pode encontrar o caminho especificado)

Este log esclareceu o erro simples que estava acontecendo, em que enquanto a aplicação rodava no ambiente de desenvolvimento do eclipse era utilizado a instancia do TOMCAT dentro do eclipse, e dentro deste contexto era possível acessar os arquivos internos da aplicação uma vez que o sistema tinha permissão para tal.

Ja depois da aplicação publicada esta permissão estaria sujeita a permissão que o ambiente Java teria dentro do SO de acessar os arquivos para definir a conexão SSL, que no caso entendo que são variáveis globais definidas na JVM para estabelecer este tipo de conexão.

SOLUÇÃO:

A solução foi colocar o arquivo cert.pfx em um local neutro dentro do SO de forma que a JVM tenha permissão para acessa-lo sem maiores problemas. Por enquanto coloquei em C:\cert.pfx e posteriormente estarei vendo um local melhor.

Esta foi a situação que passei, espero que seja útil para alguém.

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags web webservices java ssl ou faça a sua própria pergunta.