Mensagem de erro
java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
Também aparece como
- javax.net.ssl.SSLException: (internal_error) Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
- the trustAnchors parameter must be non-empty
O JDK 25 informa o erro como “javax.net.ssl.SSLException: (internal_error) Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty”, com “java.lang.RuntimeException: Unexpected error: …” na cadeia de causas. Um caminho de trust store que nem existe gera, em vez disso, “PKIX path building failed”.
Java (JSSE / PKIX) — the trust store the JVM loaded contains no trusted certificates
O que significa
A JVM carregou um trust store sem nenhuma entrada de certificado confiável, então o validador PKIX não tem nenhuma âncora de confiança e se recusa a iniciar. Isso acontece antes de qualquer certificado ser verificado: o arquivo existe e abre, mas está vazio para fins de confiança TLS. Todas as conexões HTTPS do processo falham da mesma forma.
Por que acontece
Um keystore foi configurado como trust store
comumO javax.net.ssl.trustStore aponta para um arquivo que só contém entradas de chave privada (a própria chave do cliente ou do servidor) e nenhuma entrada de certificado confiável.
O cacerts do JDK está vazio ou foi substituído
comumAlguns pacotes de distribuição geram o cacerts a partir do conjunto de certificados do sistema durante a instalação; uma etapa de pós-instalação que falhou, uma imagem de contêiner mínima ou um link simbólico quebrado deixam um repositório vazio.
Um repositório criado para outra finalidade
ocasionalUm repositório recém-criado (keytool -genkeypair e depois -delete, ou um PKCS12 vazio gerado por um script) que nunca recebeu certificados de CA.
Como corrigir
- 1.
Contar as entradas confiáveis
O keytool -list mostra as entradas; um trust store precisa de linhas trustedCertEntry. Compare com o repositório padrão do JDK.
bash # How many trusted certificates does the store hold? (0 reproduces this error) keytool -list -keystore "$TRUSTSTORE" -storepass "$TRUSTSTORE_PASSWORD" | grep -c trustedCertEntry keytool -list -cacerts -storepass changeit | grep -c trustedCertEntry # the JDK's default store - 2.
Restaurar o trust store padrão do JDK
No Debian e no Ubuntu, reinstalar o ca-certificates-java gera de novo o /etc/ssl/certs/java/cacerts; no Alpine, quem o fornece é o pacote java-cacerts.
bash # Debian/Ubuntu OpenJDK packages build cacerts from the system CA bundle sudo apt-get install --reinstall ca-certificates-java sudo update-ca-certificates -f # Alpine apk add --no-cache java-cacerts - 3.
Manter keystore e trust store separados
Passe seu próprio certificado e sua chave em javax.net.ssl.keyStore, e os certificados de CA em javax.net.ssl.trustStore.
bash # Key store (your key + certificate) and trust store (CAs you trust) are different files java -Djavax.net.ssl.keyStore=client.p12 -Djavax.net.ssl.keyStorePassword=changeit \ -Djavax.net.ssl.trustStore=truststore.p12 -Djavax.net.ssl.trustStorePassword=changeit -jar app.jar