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);