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

Postagens mais visitadas deste blog

Power bank

Investimentos - Renda fixa

Educação brasileira