Pular para conteúdo

Integração com o InvoiCy via Java

A comunicação com os Web Services do InvoiCy exige uma conexão segura via protocolo HTTPS. Dependendo de como a integração foi desenvolvida ou da versão do ambiente Java utilizada, a aplicação pode retornar erros de SSL ao tentar se comunicar com o InvoiCy em produção, conforme o exemplo abaixo:

Warning: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
Warning: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
Warning: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHands
hakeException: sun.security.validator.ValidatorException: PKIX path building fai
led: sun.security.provider.certpath.SunCertPathBuilderException: unable to find
valid certification path to requested target
No content received
Exception in thread "main" org.eclipse.swt.SWTException: Failed to execute runna
ble (java.lang.RuntimeException: Connection has been shutdown: javax.net.ssl.SSL
HandshakeException: sun.security.validator.ValidatorException: PKIX path buildin
g failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to
find valid certification path to requested target(-10001))
  • Erro comum: javax.net.ssl.SSLHandshakeException: PKIX path building failed

Este erro ocorre geralmente porque o ambiente Java (JRE/JDK) não possui as cadeias de certificação do InvoiCy instaladas em seu repositório de chaves confiáveis (keystore). Sem esses certificados, o Java não consegue validar a autenticidade do servidor, interrompendo a conexão por segurança.

Para resolver essa situação, alguns parceiros disponibilizaram a solução técnica a seguir, que consiste na importação dos certificados raiz e intermediários diretamente no repositório do Java.

Procedimentos de Configuração do Ambiente Java

Para que aplicações desenvolvidas em Java ou GeneXus (compiladas em Java) estabeleçam uma conexão segura com o InvoiCy, é necessário que o ambiente reconheça as cadeias de certificados do servidor.

Abaixo, detalhamos o processo de criação do repositório de chaves (keystore) e a assinatura dos arquivos necessários.

Criação e Configuração do Keystore

O primeiro passo consiste em gerar um arquivo de repositório de chaves confiáveis utilizando o utilitário keytool, localizado na pasta bin da sua JRE/JDK.

  • Geração do arquivo: Utilize o comando keytool -genkey -keystore definindo o caminho de destino (ex: C:\keystore.jks).
  • Definição de senha: O sistema solicitará a criação de uma senha para o armazenamento. Escolha uma senha segura e confirme-a quando solicitado.
  • Identificação: Responda às perguntas de identificação (Nome, Unidade Organizacional, Empresa, Cidade, Estado e Código do País) para concluir a criação do arquivo.

Importação do Certificado e Assinatura

Com o arquivo de certificado da Migrate salvo localmente, você deve importá-lo para o keystore recém-criado para torná-lo um destino confiável.

  • Importação: Execute o comando keytool -import -trustcacerts, informando o -alias para identificação, o caminho do arquivo .crt em -file e o destino em -keystore.
  • Assinatura de JARs: Para projetos Java puros, utilize o utilitário jarsigner para assinar digitalmente todos os arquivos .jar da aplicação, incluindo as bibliotecas contidas na pasta lib. Isso garante a integridade e a autenticidade dos binários durante a execução.

Inicialização da Aplicação e Propriedades de Sistema

Para que o Java utilize o novo repositório durante a execução, é necessário apontar o caminho e a senha do keystore através de propriedades de sistema.

  • Configuração via Parâmetros de Inicialização (JVM): Indicado para aplicações GeneXus ou execução via linha de comando. Insira o código abaixo para definir o repositório no momento do início do serviço:
java -Djavax.net.ssl.trustStore="C:\keystore.jks" -Djavax.net.ssl.trustStorePassword=senha123 –cp gxclassr.zip;swt.jar;. umain
  • Configuração via Código-Fonte (Java): Indicado para classes de controle que instanciam as conexões com os Web Services. Nas classes que gerenciam a conexão, utilize o método System.setProperty para configurar os parâmetros dinamicamente:
public static final String TRUSTSTORE = "javax.net.ssl.trustStore";
public static final String TRUSTSTOREPASSWORD = "javax.net.ssl.trustStorePassword";
public static final String NOMEARQUIVOCHAVE = "C:\\pastax.gerenciador.keystore";
public static final String SENHAARQUIVOCHAVE = "senhaA";

System.setProperty(TRUSTSTORE, NOMEARQUIVOCHAVE);
System.setProperty(TRUSTSTOREPASSWORD, SENHAARQUIVOCHAVE);