hipoteca.seguranca.InvalidAlgorithmParameterException: o parâmetro trustAnchors deve ser não-vazio no Linux, ou porque é que o truststore por omissão está vazio [duplicado]

esta pergunta já tem uma resposta aqui:

  • O parâmetro 'Error-trustAnchors' deve ser não-vazio 33 respostas

quando procura no google esta excepção: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty, aparecem vários resultados. No entanto, não existe uma solução definitiva, apenas suposições.

o problema surge (pelo menos no meu caso) quando tento usar uma ligação aberta sobre SSL. Ele funciona bem na minha máquina windows, mas quando eu o uso para a máquina linux (com o jre do sun instalado) ele falha com a exceção acima.

o problema é que a trustore padrão do JRE está vazia por alguma razão (Tamanho de apenas 32 bytes, enquanto que é 80kb no windows).

Quando copiei o meu ficheiro jre/lib/security/cacerts do windows para o linux, funcionou bem.

a questão é: porque é que o JRE linux tem uma loja de confiança vazia?

Note que isto acontece numa Amazónia. Exemplo EC2, com o AMI linux, então isso pode ser devido a algumas políticas amazon (eu acho que java foi pré-instalado, mas eu não tenho certeza)

Author: Bozho, 2011-01-22

13 answers

O padrão Sun JDK para linux tem um cacerts absolutamente ok e em geral todos os arquivos no diretório especificado. O problema é a instalação que você usa.

 24
Author: bestsss, 2011-01-23 14:43:50
Tenho um erro no Ubuntu. Eu vi isso. /usr/lib/jvm / java-8-openjdk-amd64/jre / lib/security/cacerts foi um link quebrado para /etc / ssl/certs/java / cacerts. Que me levam a este insecto: https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/983302 O README para ca-certificates-java eventualmente mostrou a correção real:

Corre

update-ca-certificates -f
Apt-get install ca-certificates-java não funcionou comigo. Apenas o marcou como instalado manualmente.
 93
Author: user988346, 2015-03-28 03:20:19
([2]}eu evitei este erro (Java 1.6.0 no OSX 10.5.8) colocando um cert simulado no teclado, como
keytool -genkey -alias foo -keystore cacerts -dname cn=test -storepass changeit -keypass changeit

Certamente a questão deve ser: "porque é que java não consegue lidar com uma loja vazia?"

 14
Author: Andrew, 2012-07-25 11:58:17
{[[2]} não é a resposta para a pergunta original, mas ao tentar resolver um problema semelhante, eu descobri que a atualização Mac OS X para a Maverics estragou a instalação java (o cacert na verdade). Remover sudo rm -rf /Library/Java/JavaVirtualMachines/*.jdk e reinstalar de http://www.oracle.com/technetwork/java/javase/downloads/index.html
 8
Author: Manuel Darveau, 2013-11-18 01:47:10

Posso gerar este erro ao configurar a system property trustStore para um ficheiro JKS em falta. Por exemplo

    System.setProperty("javax.net.ssl.keyStore", "C:/keystoreFile.jks");
    System.setProperty("javax.net.ssl.keyStorePassword", "mypassword");
    System.setProperty("javax.net.ssl.trustStore", "C:/missing-keystore.jks");
    System.setProperty("javax.net.ssl.trustStorePassword", "mypassword");

Este código não gera uma excepção de ficheiro não encontrado por alguma razão, mas exactamente a excepção InvalidAlgorithmParameter listada acima.

É uma resposta Parva, mas posso reproduzir-me.
 6
Author: The Camster, 2014-06-25 18:36:52

A minha solução no Windows era executar a janela da consola como Administrador ou alterar a variável de ambiente MAVEN_OPTS para usar um caminho com código rígido para confiar.jks (e.g. "C:\Users\oddros (') em vez de "%de lucro do utilizador". O meu MAVEN_OPTS agora parece-se com isto:

-Djavax.net.ssl.trustStore=C:\Users\oddros\trust.jks -Djavax.net.ssl.trustStorePassword=changeit
 6
Author: superodde, 2016-04-21 16:00:06

Tinha o mesmo problema no Ubuntu 14.10 com o java-8-oracle instalado.

Resolvido a instalação dos certificados ca-java package:

sudo apt-get install ca-certificates-java
 4
Author: Daniele Dellafiore, 2017-02-20 08:21:31
O meu ficheiro do cacerts estava completamente vazio. Eu resolvi isso copiando o arquivo cacerts da minha máquina windows (que está usando Oracle Java 7) e scp'D para a minha caixa Linux (OpenJDK).
cd %JAVA_HOME%/jre/lib/security/
scp cacerts mylinuxmachin:/tmp

E depois na máquina linux

cp /tmp/cacerts /etc/ssl/certs/java/cacerts
Até agora, tem funcionado muito bem.
 3
Author: Ryan Shillington, 2013-07-26 20:29:15

Se isto lhe acontecer com uma instalação OpenJDK no Mac OS X (em oposição ao Linux), e tiver o Mac OS X Java oficial (ou seja, o mais recente Java 6) instalado através da actualização do Software, pode simplesmente fazer isto:

cd $OPENJDK_HOME/Contents/Home/jre/lib/security
ln -s /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts
ln -s /System/Library/Java/Support/Deploy.bundle/Contents/Home/lib/security/blacklist 
ln -s /System/Library/Java/Support/Deploy.bundle/Contents/Home/lib/security/trusted.libraries 

Onde $OPENJDK_HOME é o directório raiz da sua instalação OpenJDK, tipicamente OPENJDK_HOME=/Library/Java/JavaVirtualMachines/1.7.0u.jdk. Isto é idêntico à forma como as instalações oficiais Java no Mac OS X adquirem esses arquivos-eles também simplesmente os ligam symlink a partir desses pacotes do sistema. Trabalha para o Lion, não é certo para versões anteriores do O.

 2
Author: Attila Szegedi, 2012-07-24 01:41:56

Certifique-se de que tem cacerts válidos no JRE/security, caso contrário não irá ignorar o erro do trustAnchors vazio inválido.

Na minha instalação Amazon EC2 Opensuse12, o problema era que o ficheiro apontado pelos cacerts no directório de segurança JRE era inválido:

$ java -version
java version "1.7.0_09"
OpenJDK Runtime Environment (IcedTea7 2.3.4) (suse-3.20.1-x86_64)
OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)

$ ls -l /var/lib/ca-certificates/
-rw-r--r-- 1 root    363 Feb 28 14:17 ca-bundle.pem

$ ls -l /usr/lib64/jvm/jre/lib/security/
lrwxrwxrwx 1 root    37 Mar 21 00:16 cacerts -> /var/lib/ca-certificates/java-cacerts
-rw-r--r-- 1 root  2254 Jan 18 16:50 java.policy
-rw-r--r-- 1 root 15374 Jan 18 16:50 java.security
-rw-r--r-- 1 root    88 Jan 18 17:34 nss.cfg
Então resolvi instalar um antigo Opensuse 11 certificados válidos. (desculpe por isso!!)
$ ll
total 616
-rw-r--r-- 1 root 220065 Jan 31 15:48 ca-bundle.pem
-rw-r--r-- 1 root    363 Feb 28 14:17 ca-bundle.pem.old
-rw-r--r-- 1 root 161555 Jan 31 15:48 java-cacerts
Percebi que podias usar o teclado para gerar um novo. ([10]} http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008961.html provavelmente terei de o fazer em breve.

Relativamente a: lellis

 2
Author: Paulo Henrique Lellis Gonalves, 2013-03-21 03:59:05

Tenho o mesmo problema. Resolveu-o instalando o pacote de certificados ca do Mozilla:

$ zypper in ca-certificates-mozilla
The following NEW package is going to be installed:
ca-certificates-mozilla 

1 new package to install.
Retrieving package ca-certificates-mozilla-1.85-8.8.1.noarch
(1/1), 143.7 KiB (239.1 KiB unpacked)
Retrieving: ca-certificates-mozilla-1.85-8.8.1.noarch.rpm.....................[done]
Installing: ca-certificates-mozilla-1.85-8.8.1 ...............................[done]
Additional rpm output:
Updating certificates in /etc/ssl/certs...
144 added, 0 removed.
creating /var/lib/ca-certificates/ca-bundle.pem ...
creating /var/lib/ca-certificates/java-cacerts ...
144 added, 0 removed.

$ ll /var/lib/ca-certificates/
total 392
drwxr-xr-x  2 root root   4096 Apr 26 07:25 ./
drwxr-xr-x 30 root root   4096 Apr 25 15:00 ../
-rw-r--r--  1 root root 220196 Apr 26 07:25 ca-bundle.pem
-rw-r--r--  1 root root 161555 Apr 26 07:25 java-cacerts

P. S.

$ cat /etc/SuSE-release
openSUSE 12.2 (x86_64)
VERSION = 12.2
CODENAME = Mantis
$ java -version
java version "1.7.0_09"
OpenJDK Runtime Environment (IcedTea7 2.3.4) (suse-3.20.1-x86_64)
OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)
 0
Author: user2322889, 2013-04-26 08:10:37
Isto acontece porque o privilégio de acesso varia de SO a so. A hierarquia de acesso ao Windows é diferente do Unix. No entanto, isto pode ser superado seguindo estes passos simples:
  1. aumentar a acessibilidade com AccessController.doPrivileged(java.security.PrivilegedAction subclass)
  2. defina a sua própria subclasse como propriedade de segurança. seguranca.insertProviderAt (novo , 2);
  3. Ajuste o seu algoritmo com Security.setProperty("ssl.TrustManagerFactory.algorithm" , “XTrust509”);
 0
Author: Pijush, 2014-02-12 10:20:09
Tenho o mesmo erro na minha máquina do Windows 7 quando as permissões no meu ficheiro cacerts estão no meu ficheiro. C:\Program os ficheiros\Java\jdk1.7.0_51\jre\lib\pasta de segurança não estão definidos correctamente.

Para resolver o problema, permito que o serviço e os utilizadores interactivos tenham todas as permissões de modificação nos cacerts excepto "mudar as permissões" e "tomar posse" (das configurações avançadas, nas propriedades de segurança). Presumo que permitir a estes serviços ler e escrever atributos alargados pode ter algo a ver com o erro desaparecer.

 0
Author: Fuzzy Analysis, 2014-06-27 07:40:59