PKIX path building failed
Olá, neste post vou mostrar como solucionar o erro PKIX path building failed exibido ao executarmos uma aplicação que necessite de certificados.
PKIX path building failed
Caso sua aplicação mostre o seguinte erro ao ser executada ou ao acessar alguma outra aplicação...
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
...é porque está faltando algum certificado no arquivo cacerts da JVM (Java Virtual Machine).
Reproduzindo a mensagem de erro
Para reproduzir a mensagem de erro sem precisar executar a aplicação novamente, executar o seguinte comando:
$ java SSLPoke <url-do-serviço-que-esta-sendo-acessado-pela-sua-aplicacao> 443 Obs1: Não utilizar 'https://' antes da URL do serviço Obs2: O programa SSLPoke está disponível no final deste post.
A mensagem 'PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target' será exibida
Emissor do certificado
Para verificar quem é o emissor do certificado requerido pela aplicação, executar o seguinte comando:
$ curl -v https://<url-do-serviço-que-esta-sendo-acessado-pela-sua-aplicacao>/
Na seção 'Server certificate' localizar o item O=<nome-organização>
Emissor do certificado
Para verificar se o emissor do certificado está instalado no arquivo 'cacerts' do Java, executar o seguinte comando:
$ keytool -list -v $JAVA_HOME/lib/security/cacerts | grep <nome-organização> Obs: O nome da organização deve estar em caixa baixa
Não deve aparecer nenhum resultado.
Instalando o certificado
Para instalar o certificado na JVM, executar os seguintes passos:
- Baixar o certificado - Rodar o comando sudo keytool -import -trustcacerts -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit -noprompt -alias zscaler_root_unit_test -file ~/Downloads/Zscaler_cert.cer
Validando
Para validar se a instalação do certificado, basta executar novamente a aplicação e o erro não será exibido novamente.
Arquivo cacerts
O arquivo cacerts representa um keystore de todo o sistema com certificados CA e pode ser configurado e gerenciado usando o Java keytool.
Listando os certificados existentes no arquivo cacerts.
$ keytool -list -v -keystore $JAVA_HOME/lib/security/cacerts
Diretórios e arquivos
O sistema operacional Linux armazena e organiza os certificados nos seguintes diretórios e arquivos.
/etc/ssl/certs/ca-certificates.crt /etc/ca-certificates.conf /etc/ca-certificates.conf.dpkg-old /etc/firefox/policies/certificates /etc/ca-certificates /usr/local/share/ca-certificates /usr/sbin/update-ca-certificates /usr/share/ca-certificates
SSLPoke
import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import java.io.*; /** Establish a SSL connection to a host and port, writes a byte and * prints the response. See * http://confluence.atlassian.com/display/JIRA/Connecting+to+SSL+services */ public class SSLPoke { public static void main(String[] args) { if (args.length != 2) { System.out.println("Usage: "+SSLPoke.class.getName()+" <host> <port>"); System.exit(1); } try { SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(args[0], Integer.parseInt(args[1])); InputStream in = sslsocket.getInputStream(); OutputStream out = sslsocket.getOutputStream(); // Write a test byte to get a reaction :) out.write(1); while (in.available() > 0) { System.out.print(in.read()); } System.out.println("Successfully connected"); } catch (Exception exception) { exception.printStackTrace(); } } }
Finalizando
Espero que tenha gostado e que este post possa ser, de alguma forma, útil nas suas pesquisas e estudos.
Um grande abraço e até o próximo post.
Comentários
Postar um comentário