Erro - o parâmetro trustAnchors deve estar não vazio

492

Estou tentando configurar meu email no Jenkins / Hudson e recebo constantemente o erro:

java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be
    non-empty

Vi muitas informações on-line sobre o erro, mas não consegui trabalhar. Estou usando o JDK da Sun no Fedora Linux (não o OpenJDK).

Aqui estão algumas coisas que eu tentei. Tentei seguir os conselhos deste post , mas copiar as cacerts do Windows para minha caixa do Fedora que hospedava Jenkins não funcionou. Tentei seguir este guia enquanto tentava configurar o Gmail como meu servidor SMTP, mas também não funcionou. Também tentei baixar e mover esses arquivos cacert manualmente e movê-los para minha pasta Java usando uma variação dos comandos neste guia .

Estou aberto a sugestões, pois estou preso no momento. Consegui fazê-lo funcionar em um servidor Windows Hudson, mas estou com dificuldades no Linux.

David Gill
fonte

Respostas:

513

Essa mensagem bizarra significa que o armazenamento confiável que você especificou foi:

  • esvaziar,
  • não encontrado ou
  • não pôde ser aberto (devido a permissões de acesso, por exemplo).

Veja também a resposta de @ AdamPlumb abaixo .

Para depurar esse problema (escrevi sobre ele aqui ) e entender qual armazenamento confiável está sendo usado, você pode adicionar a propriedade javax.net.debug = all e filtrar os logs sobre o armazenamento confiável. Você também pode jogar com a propriedade javax.net.ssl.trustStore para especificar um armazenamento confiável específico. Por exemplo :


    java -Djavax.net.debug=all -Djavax.net.ssl.trustStore=/Another/path/to/cacerts -jar test_get_https-0.0.1-SNAPSHOT-jar-with-dependencies.jar https://www.calca.com.py 2>&1| grep -i truststore
Marquês de Lorne
fonte
1
Obrigado EJP, vi sua postagem aqui, mas não tinha certeza de como verificar se o armazenamento confiável está lá. Também trouxe meu arquivo server.xml, mas não tinha certeza de como verificar se o armazenamento confiável está instalado. Acabei de verificar o pref keystoreFile = "conf / .keystore" (o keystoreFile não estava presente nesse arquivo)?
David Gill
2
A resposta foi com como eu estava importando. Eu parecia ter perdido um passo crucial. Consulte [Erro Java InvalidAlgorithmParameterException] [1] [1]: jyotirbhandari.blogspot.com/2011/09/…
David Gill
2
Confirmado que esta resposta está correta. Eu estava recebendo o erro no Tomcat. Eu tinha meu armazenamento confiável, ${CATALINA_HOME}\confmas CATALINA_HOMEnão estava sendo definido, então o Tomcat estava procurando \confpelo armazenamento confiável.
SingleShot 21/02
4
@BubblewareTechnology Não, o erro estava no nome do arquivo, não na maneira como você importou o certificado no arquivo. Seu blog não está correto. Você também não deve recomendar a modificação do arquivo JRE $ / cacerts. Mudará a próxima atualização do Java. Você precisa de um processo que o copie, inclua seu próprio certificado na cópia e use a cópia como armazenamento confiável. Repita cada atualização do Java. E você não precisa informar ao Java sobre seu próprio armazenamento confiável, apenas sobre o seu, se for diferente.
Marquês de Lorne
3
Vou acrescentar um toque: mesmo quando o armazenamento confiável existe, está acessível, está no formato correto, se estiver completamente vazio, esse é o erro que você pode obter com várias bibliotecas (incluindo o Apache HttpClient).
Alan Franzoni
265

No Ubuntu 18.04 , esse erro tem uma causa diferente (JEP 229, alterne do jksformato padrão de keystore para o pkcs12formato e a geração de arquivos cacerts do Debian usando o padrão para novos arquivos) e solução alternativa :

# Ubuntu 18.04 and various Docker images such as openjdk:9-jdk throw exceptions when
# Java applications use SSL and HTTPS, because Java 9 changed a file format, if you
# create that file from scratch, like Debian / Ubuntu do.
#
# Before applying, run your application with the Java command line parameter
#  java -Djavax.net.ssl.trustStorePassword=changeit ...
# to verify that this workaround is relevant to your particular issue.
#
# The parameter by itself can be used as a workaround, as well.

# 0. First make yourself root with 'sudo bash'.

# 1. Save an empty JKS file with the default 'changeit' password for Java cacerts.
#    Use 'printf' instead of 'echo' for Dockerfile RUN compatibility.
/usr/bin/printf '\xfe\xed\xfe\xed\x00\x00\x00\x02\x00\x00\x00\x00\xe2\x68\x6e\x45\xfb\x43\xdf\xa4\xd9\x92\xdd\x41\xce\xb6\xb2\x1c\x63\x30\xd7\x92' > /etc/ssl/certs/java/cacerts

# 2. Re-add all the CA certs into the previously empty file.
/var/lib/dpkg/info/ca-certificates-java.postinst configure

Status (07/08/2018) , o bug foi corrigido no Ubuntu Bionic LTS 18.04.1 e Ubuntu Cosmic 18.10.


🗹 Ubuntu 1770553: back-end [SRU] ca-certificates-java da cosmic (20180413ubuntu1)

176 Ubuntu 1769013: Por favor, mescle ca-certificate-java 20180413 (main) do Debian unstable (main)

🗹 Ubuntu 1739631: A nova instalação com o JDK 9 não pode usar o arquivo de armazenamento de chaves cacerts PKCS12 gerado

🗹 Imagem do docker-library 145: 9-jdk tem problemas de SSL

🗹 Debian 894979: ca-certificates-java: não funciona com o OpenJDK 9, os aplicativos falham com InvalidAlgorithmParameterException: o parâmetro trustAnchors deve estar vazio

🗹 JDK-8044445: JEP 229: criar keystores PKCS12 por padrão

🖺 JEP 229: criar PKCS12 por padrão


Se o problema persistir após esta solução alternativa, convém verificar se você está realmente executando a distribuição Java que acabou de corrigir.

$ which java
/usr/bin/java

Você pode definir as alternativas Java para 'auto' com:

$ sudo update-java-alternatives -a
update-alternatives: error: no alternatives for mozilla-javaplugin.so

Você pode verificar novamente a versão Java que está executando:

$ java --version
openjdk 10.0.1 2018-04-17
OpenJDK Runtime Environment (build 10.0.1+10-Ubuntu-3ubuntu1)
OpenJDK 64-Bit Server VM (build 10.0.1+10-Ubuntu-3ubuntu1, mixed mode)

Também existem soluções alternativas, mas elas têm seus próprios efeitos colaterais, que exigirão manutenção futura extra, sem nenhum retorno.

A próxima melhor solução alternativa é adicionar a linha

javax.net.ssl.trustStorePassword=changeit

para os arquivos

/etc/java-9-openjdk/management/management.properties
/etc/java-11-openjdk/management/management.properties

o que existir.

A terceira solução menos problemática é alterar o valor de

keystore.type=pkcs12

para

keystore.type=jks

nos arquivos

/etc/java-9-openjdk/security/java.security
/etc/java-11-openjdk/security/java.security

o que existir, remova o cacertsarquivo e gere-o novamente da maneira descrita na última linha do script de solução alternativa na parte superior da postagem.

Mikael Gueck
fonte
50
Usuários do Ubuntu 18, leia isto! isso economizará muitas horas de sua vida! Obrigado!
vak 3/05/19
5
Esta resposta me ajudou a corrigir o mesmo erro do maven no Ubuntu 18.04. Eu tive que mudar o proprietário do arquivo / etc / ssl / certs / java / cacerts do root para mim mesmo para poder escrever nele. Então eu mudei de volta.
Yuri Gor
77
Executei o sudo rm / etc / ssl / certs / java / cacerts e depois o sudo update-ca-certificates -f e isso corrigiu meu problema no kubuntu 18.04.
JSN
2
@jsn, graças para as soluções, funciona em Linux Mint 19, bem como que é baseado no Ubuntu 18.04
Samrat
2
@ solução da JSN também trabalhou para Debian estiramento + openjdk8
HRJ
105

Isso corrigiu o problema para mim no Ubuntu:

sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure

(encontrado aqui: https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/1396760 )

ca-certificates-java não é uma dependência no Oracle JDK / JRE, portanto, isso deve ser explicitamente instalado.

Michael Condouris
fonte
2
Obrigado, isso corrigiu o problema para mim quando o encontrei no Ubuntu 15.04.
22415 Macil
Trabalhou no Raspbian no Raspberry Pi
Defozo 9/05/16
1
Corri para esse problema com os backports estáveis ​​do Debian jesse com o OpenJDK8 e isso corrigiu o problema. Estava usando isso ao criar imagens do Docker. :)
Tuxdude
9
Infelizmente não funciona no Ubuntu MATE 18.04. Vou tentar reinstalar o Java.
Pranav A.
1
@ cododx - Eu fiz o que você sugere e não funciona - no Ubuntu 18.x com Java 10 (padrão).
Mzedeler
69

No Ubuntu 18.04, a causa raiz é um conflito entre o openjdk-11-jdk (que é o padrão) e outros pacotes, dependendo dele. Ele já foi corrigido no Debian e será incluído no Ubuntu em breve. Enquanto isso, a solução mais simples é rebaixar seu java para a versão 8. Outras soluções empregandoca-certificates-java são muito mais complicadas.

Primeiro remova pacotes conflitantes:

sudo apt-get remove --purge openjdk* java-common default-jdk
sudo apt-get autoremove --purge

Verifique se você removeu com êxito todos os pacotes relacionados:

sudo update-alternatives --config java

O sistema solicitará que não haja Java disponível para configuração , caso contrário, essa solução alternativa falhará .

Em seguida, reinstale os pacotes necessários:

sudo apt-get install openjdk-8-jdk
shvahabi
fonte
Essa descrição é factualmente incorreta e apenas corrige o problema no mesmo sentido em que reinstalar o Windows pode corrigir um problema. Não há necessidade de remover todos os pacotes Java. Se você deseja seguir esse caminho, você só precisa instalar o openjdk-8-jdkpacote, remover o /etc/ssl/certs/java/cacertsarquivo e executar, sudo update-ca-certificates -fque é a maneira indireta de alternar de um pkcs12arquivo cacerts formatado para um arquivo jksformatado, como descrito em outras partes deste encadeamento.
Mikael Gueck
1
@MikaelGueck Embora a lógica pareça estar do seu lado, estou aqui para garantir que fiz anteriormente exatamente o que está descrito em seu comentário e nas outras respostas votadas, e em 18.04 essa é a única resposta que funcionou . Eu acho que seu voto negativo deve se transformar em um voto positivo, ou pelo menos desaparecer, pois é altamente imerecido.
Andrea Ligios
@AndreaLigios, você pode ler os scripts, eles são bem curtos. Eles têm um conjunto codificado de caminhos JAVA_HOME de 8 a 10, tentam um de cada vez, chamam o gerador de arquivos Debian CA, que você também pode ler, que usa o formato de arquivo existente, porque o código do manipulador de arquivos de chave JDK, que você pode ler, possui um modo de fallback de compatibilidade. Se o seu computador executar esse software simples de maneira diferente, você poderá ter outros problemas. Você modificou suas alternativas java e chamou outra JVM, porque a remoção pode ter redefinido as alternativas?
Mikael Gueck
1
@MikaelGueck sim, em uma das tentativas anteriores eu modifiquei minhas alternativas java, então provavelmente foi isso. Eu sou o primeiro que gosta de descobrir o código fonte e descobrir como as coisas funcionam, mas esse hoje não era meu objetivo, era apenas um entre 5 e 6 diferentes obstáculos inesperados que eu tinha no caminho para o meu objetivo real. Esta resposta me permitiu resolver o problema em menos de 2 minutos! Quanto tempo devo dedicar para analisar os scripts e encontrar uma solução melhor? E para quê, economizar alguns megabytes? Esta é drástica, mas obras (e não importa qual é o problema), então um grande obrigado ao OP para aqueles ocupados como o inferno
Andrea Ligios
1
Estou procurando uma solução há 2 dias e sua resposta resolveu meu problema, obrigado. Acabei de mudar para o Kubuntu 18.04, isso funcionou.
Guepardomar
55

O EJP basicamente respondeu à pergunta (e eu sei que isso tem uma resposta aceita), mas lidei com essa pegadinha e queria imortalizar minha solução.

Eu tive o InvalidAlgorithmParameterExceptionerro em um Jira hospedado servidor que eu havia configurado anteriormente para acesso somente SSL. O problema foi que eu havia configurado meu keystore no formato PKCS # 12, mas meu armazenamento confiável estava no formato JKS.

No meu caso, editei meu server.xmlarquivo para especificar o keystoreType para PKCS, mas não especifiquei o truststoreType, portanto, o padrão é o que seja o keystoreType. Especificar o truststoreType explicitamente como o JKS resolveu para mim.

Adam Plumb
fonte
bem, eu ajudo você a imortalizar a solução para o seu problema. é aí que fica interessante.
N611x007
2
Este foi exatamente o meu problema. Eu estava usando o Spring Boot 1.4.2.RELEASE e tinha um armazenamento de chaves de hardware e armazenamento confiável de software. Especifiquei o provedor e o tipo para o keystore, mas não o armazenamento confiável. Como resultado, o provedor e o tipo incorretos foram usados ​​pelo armazenamento confiável. A especificação desses (SUN e JKS) resolveu o problema.
Kenco
12
como exatamente você fez isso? (windows here)
tatsu
2
Se deparar com isso com o meu Android Grandle hoje, eu quase entendo o que você diz, mas você não diz como resolvê-lo. Resposta não útil
Lothar
52

Corri para esta solução a partir da postagem do blog Corrigindo o problema trustAnchors ao executar o OpenJDK 7 no OS X :

Corrigindo o problema trustAnchors ao executar o OpenJDK 7 no OS X. Se você estiver executando o OpenJDK 7 no OS X e viu esta exceção:

Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors
    parameter must be non-empty

Há uma solução simples. Basta vincular o mesmo arquivo cacerts que o JDK 1.6 da Apple usa:

cd $(/usr/libexec/java_home -v 1.7)/jre/lib/security
ln -fsh /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts

Você precisa fazer isso para todas as versões do OpenJDK instaladas. Apenas mude -v 1.7para a versão que você deseja corrigir. Execute /usr/libexec/java_home -Vpara ver todos os JREs e JDKs que você instalou.

Talvez o pessoal do OpenJDK possa adicionar isso aos scripts de instalação.

Peter Kriens
fonte
1
Meu comando "ln" (no OSX 10.6.8) não possui uma opção "h"; o que isso significa fazer?
Andrew Swan
1
Ah, eu tinha dois comandos "ln", um em / usr / bin (o padrão) e um em / bin; o último tinha uma opção "h" e funcionou.
Andrew Swan
Corrigi minha instalação 1.6 quebrada vinculando a cacerts da instalação do sistema 1.8 com esta técnica ln. Obrigado!
A21z
1
Para futuros leitores: parece que você também precisa os outros 3 arquivos que estão na securitypasta ( blacklisted.certs, local_policy.jare US_export_policy.jar) para Java para ser feliz.
awksp
@ Peter Kriens, porque ligada à cacertssob jrediretório?
BAE
45

No Ubuntu 12.10 (Quantal Quetzal) ou posterior, os certificados são mantidos no pacote ca-certificates-java . O uso -Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacertsirá buscá-los, independentemente do JDK que você estiver usando.

yvesr
fonte
54
Eu achei que eu precisava para executar update-ca-certificates -fmanualmente, para preencher o arquivo cacerts
Portablejim
4
@Portablejim Thanks. Seu comentário resolveu o primeiro problema que eu criei no Apache Spark no Ubuntu 15.04beta.
Paul
1
Obrigado @Portablejim, seu comentário funcionou para mim no Ubuntu 15.04.
David Berg
Obrigado. Foi corrigido o meu problema com o JDK corrigido pelo PhpStrom +. Eu escrevi essa chave no arquivo "phpstorm64.vmoptions".
Vijit
Não estou trabalhando para mim no ubuntu 18.04 e o JDK é 1.8.0_62 #
Devendra Singraul
34

Corri para esse problema exato no OS X, usando o JDK 1.7, depois de atualizar para o OS X v10.9 (Mavericks). A correção que funcionou para mim foi simplesmente reinstalar a versão Apple do Java, disponível em http://support.apple.com/kb/DL1572 .

KiwiMartin
fonte
Encontrei isso com o Java 6 usado pelo Grails no OSX. Eu também tinha o Java 7 da Oracle instalado e também atualizei para o Mavericks. A reinstalação do Java 6 no site da Apple também corrigiu o problema para mim.
Pm_labs 9/09/14
Deparei com isso ao instalar o jdk 6 aberto em uma caixa de nuvem do ubuntu. É bom ver um rosto familiar, BTW
Ben Hutchison
30

Eu corri

sudo update-ca-certificates -f

para criar um arquivo de certificado e, em seguida:

sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure

Eu estava de volta aos negócios, obrigado pessoal. É uma pena que não esteja incluído na instalação, mas cheguei lá no final.

Johnny
fonte
Quando eu corro sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure**eu recebo #sudo: /var/lib/dpkg/info/ca-certificates-java.postinst: command not found
1525 Magick
Apenas sudo update-ca-certificates -fé suficiente no Debian jessie com openjdk-8-jre-headlessjessie-backports, desde que ca-certificates-javaesteja instalado. Acho que a ordem da instalação é importante (o JRE depois ca-certificates-javapode causar isso, pois o último não possui gatilhos para o Java 8 com backport).
mirabilos
2
sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure sem estrelas **
Yu Jiaao
update-ca-certificates -fé a coisa que consertou isso. Eu não precisava do segundo comando
Mark Jeronimus 04/06
17

O erro diz que o sistema não pode encontrar o truststore no caminho fornecido com o parâmetro javax.net.ssl.trustStore.

No Windows, copiei o cacertsarquivo jre/lib/securitypara o diretório de instalação do Eclipse (mesmo local que o eclipse.iniarquivo) e adicionei as seguintes configurações em eclipse.ini:

-Djavax.net.ssl.trustStore=cacerts
-Djavax.net.ssl.trustStorePassword=changeit
-Djavax.net.ssl.trustStoreType=JKS

Eu tive alguns problemas com o caminho para as cacerts (a variável de ambiente% java_home% é de alguma forma substituída), então usei essa solução trivial.

A idéia é fornecer um caminho válido para o arquivo de armazenamento confiável - o ideal seria usar um caminho relativo. Você também pode usar um caminho absoluto.

Para garantir que o tipo de loja seja JKS, execute o seguinte comando:

keytool -list -keystore cacerts

Keystore type: JKS
Keystore provider: SUN
razvanone
fonte
2
Esta é a única resposta que realmente funcionou. Obrigado @razvanone
Patel
1
Consegui acertar uma pequena "pegadinha": as três linhas no arquivo eclipse.ini devem estar em três linhas separadas reais. Inicialmente, coloquei todos eles em uma linha e o eclipse não percebeu isso.
22918 SiKing
16

Remover o pacote ca-certificate-java e instalá-lo novamente funcionou para mim ( Ubuntu MATE 17.10 (Artful Aardvark)).

sudo dpkg --purge --force-depends ca-certificates-java

sudo apt-get install ca-certificates-java

Obrigado, jdstrand: Comentário 1 para o bug 983302, Re: ca-certificate-java falha ao instalar o Java cacerts no Oneiric Ocelot .

ericek111
fonte
11

Eu tive muitos problemas de segurança após atualizar para o OS X v10.9 (Mavericks):

  • Problema de SSL com o Amazon AWS
  • Par não autenticado com Maven e Eclipse
  • trustAnchors parâmetro não deve estar vazio

Apliquei esta atualização do Java e ela corrigiu todos os meus problemas: http://support.apple.com/kb/DL1572?viewlocale=en_US

Freddy Boucher
fonte
5
Ugh. O Java 6 já passou muitos anos do fim do suporte público e certamente está cheio de falhas de segurança. A Apple disponibiliza para download o software mais antigo que não pode ser executado com Java 7/8, mas não deve ser usado para fazer conexões SSL com serviços na Internet pública, como 1. AWS, 2. Maven Central, 3. qualquer outra coisa.
Zac Thompson
10

Eu esperava coisas assim, sendo que eu uso uma JVM alternativa no meu Talend Open Studio (o suporte existe no momento apenas até o JDK 1.7). Eu uso 8 para fins de segurança ... de qualquer maneira

  • Atualize seu armazenamento de certificados:

    sudo update-ca-certificates -f

então

  • adicione um novo valor nos seus parâmetros de inicialização

    sudo gedit $(path to your architecture specific ini i.e. TOS_DI...ini)
    
    Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts

Para mim, a segunda entrada funcionou. Acho que, dependendo da versão do Talend Open Studio / TEnt + JVM, ele tem um nome de parâmetro diferente, mas procura o mesmo arquivo de armazenamento de chaves.

steveoams
fonte
4
De onde você tirou a propriedade javax.net.ssl.trustAnchors? Não é mencionado na documentação do JSSE.
Marquês de Lorne
10

Para mim, isso foi causado pela falta de uma TrustCertEntry no armazenamento confiável.

Para testar, use:

keytool -list -keystore keystore.jks

Isso me dá:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

cert-alias, 31-Jul-2017, PrivateKeyEntry

Embora meu PrivateKeyEntry contenha uma CA, ele precisa ser importado separadamente :

keytool -import -alias root-ca1 -file rootca.crt -keystore keystore.jks

Ele importa o certificado e, em seguida, a nova execução keytool -list -keystore keystore.jksagora fornece:

Your keystore contains 2 entries

cert-alias, 31-Jul-2017, PrivateKeyEntry,
Certificate fingerprint (SHA1):
<fingerprint>
root-ca1, 04-Aug-2017, trustedCertEntry,
Certificate fingerprint (SHA1):
<fingerprint>

Agora, ele possui um confiávelCertEntry e o Tomcat será iniciado com êxito.

muttonUp
fonte
Verificação NB baeldung tutorial com um Makefile útil como atalho para criar keystore e truststore (spring-security-x509 projeto) baeldung.com/x-509-authentication-in-spring-security
hello_earth
9

Alguns lançamentos de fornecedores do OpenJDK causaram isso ao ter um cacertsarquivo vazio distribuído com o binário. O bug é explicado aqui: https://github.com/AdoptOpenJDK/openjdk-build/issues/555

Você pode copiar para adoptOpenJdk8\jre\lib\security\cacertso arquivo de uma instalação antiga, comoc:\Program Files\Java\jdk1.8.0_192\jre\lib\security\cacerts .

A versão com bug do AdoptOpenJDK é https://github.com/AdoptOpenJDK/openjdk8-releases/releases/download/jdk8u172-b11/OpenJDK8_x64_Win_jdk8u172-b11.zip

raisercostin
fonte
Eu acho que esse foi o meu caso também. No AdoptOpenJDK 202, esse bug está presente e, no 222, ele funciona. Portanto, atualize seu jdk, se possível.
Marty
6

Se você experimentar isso no Ubuntu com JDK9 e Maven, poderá adicionar esta opção JVM - primeiro verifique se o caminho existe:

-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts

Se o arquivo estiver ausente, tente instalar o ca-certificates-java como alguém observou:

sudo apt install ca-certificates-java
dmatej
fonte
Se você usar janela de encaixe, então você também pode tentar "maven: 3-jdk-9-slim" imagem em vez de "maven: 3-jdk-9"
Konstantin Pavlov
Obrigado, isso funcionou para mim no openjdk-8-jdk no ubuntu 18.04
Aftab Naveed
4

Eu tive essa mensagem de erro no Java 9.0.1 no Linux. Isso ocorreu devido a um bug conhecido do JDK, onde o arquivo cacerts está vazio no pacote binário .tar.gz (baixado de http://jdk.java.net/9/ ).

Consulte o parágrafo "problemas conhecidos" das Notas da Versão do JDK 9.0.1 , dizendo "TLS não funciona por padrão no OpenJDK 9".

No Debian / Ubuntu (e provavelmente em outras derivadas), uma solução simples é substituir o arquivo cacerts pelo arquivo do pacote "ca-certificates-java":

sudo apt install ca-certificates-java
cp /etc/ssl/certs/java/cacerts /path/to/jdk-9.0.1/lib/security/cacerts

No Red Hat Linux / CentOS, você pode fazer o mesmo no pacote "ca-certificates":

sudo yum install ca-certificates
cp /etc/pki/java/cacerts /path/to/jdk-9.0.1/lib/security/cacerts
Mossroy
fonte
4

Eu tive esse problema ao tentar usar o Maven 3, depois de atualizar o Ubuntu 16.04 LTS (Xenial Xerus) para o Ubuntu 18.04 LTS (Bionic Beaver).

A verificação de / usr / lib / jvm / java-8-oracle / jre / lib / security mostrou que meu arquivo cacerts era um link simbólico apontando para /etc/ssl/certs/java/cacerts .

Eu também tinha um arquivo com nome suspeito cacerts.original.

Eu mudei o nome cacerts.originalpara cacerts, e isso corrigiu o problema.

John Deverall
fonte
O cacerts.originalarquivo estava no jksformato e foi gerado com o Java 8 do Ubuntu 16.04, que usava esse formato como padrão. O cacertsarquivo estava no pkcs12formato, gerado pelo Java 10 do Ubuntu 18.04, que usa esse formato como padrão. Conforme explicado em outra parte deste segmento, o novo formato requer que você passe a senha ao executável. Mas desde que você gere um novo jks cacertsarquivo vazio ou copie um antigo, o próximo processo de geração de cacerts esvaziará o arquivo existente e o recarregará com os certificados de CA do sistema de arquivos.
Mikael Gueck
3

Também encontrei isso no OS X após atualizar o OS X v10.9 (Mavericks), quando o antigo Java 6 estava sendo usado e tentei acessar uma URL HTTPS. A solução foi o inverso de Peter Kriens; Eu precisava copiar o cacertsespaço 1.7 para o local vinculado pela versão 1.6:

(as root)
umask 022
mkdir -p /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security
cp $(/usr/libexec/java_home -v 1.7)/jre/lib/security/cacerts \
    /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security
Parcialmente nublado
fonte
1
O comando aqui tenta copiar um diretório para um arquivo; não faz nenhum sentido.
Praseodym
Concordo com a avaliação do uso de uma solução reversa. Eu descobri que o jdk1.6 tinha um link com defeito /Library/Java/JavaVirtualMachines/1.6.0_33-b03-424.jdk/Contents/Home/lib/security/cacerts -> /System/Library/Java/Support/CoreDeploy.bundle / Conteúdo / Página inicial / lib / security / cacerts. Então, marquei o link flexível quebrado e copiei os cacerts da instalação do jdk1.7.
James A Wilson
OBSERVAÇÃO: quando terminar, você poderá criar o arquivo cacerts que copiou para validar as permissões.
Grey
Além disso, corrigiu o cp para ir na direção correta e adicionou umask para mkdir e cp.
Grey
3

No meu caso, o arquivo JKS usado no aplicativo cliente foi corrompido. Criei um novo e importei os certificados SSL do servidor de destino. Em seguida, usei o novo arquivo JKS no aplicativo cliente como um armazenamento confiável, como:

System.setProperty("javax.net.ssl.trustStore",path_to_your_cacerts_file);

Fonte: SSL Java e armazenamento de chaves do certificado

Eu uso a ferramenta (KeyStore Explorer) para criar o novo JKS. Você pode baixá-lo neste link, KeyStore Explorer .

Salman
fonte
O keystore-explorer fez o trabalho por mim. Você apenas precisa criar o keystore padrão e examinar e salvar o arquivo de certificado para o site / host.
Shantha Kumara
3

Você também pode encontrar esse erro após atualizar para o Spring Boot 1.4.1 (ou mais recente) porque ele traz o Tomcat 8.5.5 como parte de suas dependências.

O problema é devido à maneira como o Tomcat lida com o armazenamento confiável. Se você especificou seu local de armazenamento confiável como o mesmo que seu keystore na configuração do Spring Boot, provavelmente receberá a trustAnchors parameter must be non-emptymensagem ao iniciar o aplicativo.

server.ssl.key-store=classpath:server.jks
server.ssl.trust-store=classpath:server.jks

Simplesmente remova a server.ssl.trust-storeconfiguração, a menos que você saiba que precisa, nesse caso, consulte os links abaixo.

Os seguintes problemas contêm mais detalhes sobre o problema:

Robert Hunt
fonte
3

Encontrei esse problema com o SDK do Android SDK. Para mim, esta solução funcionou:

  1. Vamos para /usr/lib/jvm/java-8-oracle/jre/lib/security/
  2. Substitua cacertporcacert.original

O cacertarquivo era pequeno (22B). Eu instalei a oracle-java8-installerpartir de ppa:webupd8team/java(de acordo com este manual: https://docs.nativescript.org/start/ns-setup-linux ).

Tyg
fonte
2

Para o registro, nenhuma das respostas aqui funcionou para mim. Minha compilação Gradle começou a falhar misteriosamente com esse erro, incapaz de buscar o HEAD da central do Maven para um arquivo POM específico .

Aconteceu que eu tinha JAVA_HOME definido para minha compilação pessoal do OpenJDK, que eu havia criado para depurar um problema javac. A configuração de volta ao JDK instalado no meu sistema foi corrigida.

user3562927
fonte
... o que fez com que o armazenamento confiável não fosse encontrado, como em outras respostas.
Marquês de Lorne
1
Sim, mas saber que o armazenamento confiável não pode ser encontrado é totalmente inútil se você não consegue descobrir por que ele não está sendo encontrado. Existem muitas maneiras possíveis de dar errado, e é frustrante quando nenhuma delas é a maneira particular de falhar em seu próprio sistema.
user3562927
Todos eles 'acontecem' com o mesmo erro: o armazenamento confiável especificado não pôde ser aberto ou estava vazio. Existem milhões de maneiras pelas quais essa situação pode surgir e não há espaço suficiente no SO para enumerar todas elas.
Marquês de Lorne
1

No Red Hat Linux, resolvi esse problema importando os certificados para /etc/pki/java/cacerts.

ak1
fonte
1
System.setProperty("javax.net.ssl.trustStore", "C:\\Users\\user-id\\Desktop\\tomcat\\cacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "passwd");

Você precisa adicionar as duas linhas acima ao seu código. Não é possível encontrar o armazenamento confiável.

Divyesh Kalbhor
fonte
2
Caso contrário, ele usará o armazenamento confiável do JRE e certamente será capaz de encontrá-lo. O erro é causado por valores incorretos nesses parâmetros, não por sua ausência. O arquivo nomeado no seu código se aplica apenas à sua instalação, geralmente não.
Marquês de Lorne #
A maneira correta de definir essas propriedades é transmitindo-as na linha de comando: java -Djavax.net.ssl.trustStore=/tmp/cacerts ...ou se você deseja defini-las globalmente para todos os programas executados com um JDK, adicione a linha ao management.propertiesarquivo do JDK .
Mikael Gueck
1

Eu enfrentei esse problema ao executar um conjunto específico de Android para testar no Ubuntu 14.04 (Trusty Tahr). Duas coisas funcionaram para mim, como sugerido por shaheen:

sudo update-ca-certificates -f

sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure
DPKGRG
fonte
1

Nenhuma das soluções que encontrei na Internet funcionou, mas uma versão modificada da resposta de Peter Kriens parece fazer o trabalho.

Primeiro encontre sua pasta Java executando /usr/libexec/java_home. Para mim foi a 1.6.0.jdkversão. Em seguida, vá para a lib/securitysubpasta (para mim/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security ).

Em seguida, exclua o cacertsarquivo se já houver um e procure um no sistema com sudo find / -name "cacerts". Ele encontrou vários itens para mim, nas versões do Xcode ou outros aplicativos que eu havia instalado, mas também nos /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacertsquais eu escolhi.

Use esse arquivo e faça um link simbólico para ele (enquanto estava dentro da pasta Java de antes) sudo ln -fsh "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts", e ele deve funcionar.

Eu tenho os dois - Java do download da Apple 2017-001 ( https://support.apple.com/kb/dl1572 - presumo que sejam esses os certificados corretos) e o Oracle instalado no Mac OS X v10.12 (Sierra) .

shw
fonte
1

no ubuntu 14.04 com o openjdk 11 do ppa: openjdk-r / ppa funcionou para mim:

em java.security, altere o tipo de keystore para

keystore.type=jks

então:

sudo dpkg --purge --force-depends ca-certificates-java
sudo apt-get install ca-certificates-java

ao verificar se funcionou, verifique se não está usando nenhum daemon com o java antigo ainda em execução (por exemplo, --no-daemonopção para gradle)

esse bug descreve tudo bem e ajuda você a entender o que está acontecendo https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/1739631

Piotrek
fonte
1

No Ubuntu 18.04, eu precisava usar o OpenJDK 1.7 para a manutenção de um projeto antigo. Eu baixei o pacote binário. Mas quando eu executei meu script, recebi o mesmo erro.

A solução foi remover o cacertsarquivo do JDK baixado na jre/lib/securitypasta e, em seguida, criá-lo como link simbólico para o cacertsarquivo de sistemas em /etc/ssl/certs/java/:

sudo ln -s /etc/ssl/certs/java/cacerts /path/to/downloaded/java/jre/lib/security/cacerts

Mike
fonte
1

Uma pequena chance de ajudar alguém, exceto ... para quem executa o Java 8 a partir de uma imagem do Docker em um Raspberry Pi (usando CPU AMD), obtive o seguinte Dockerfile para compilar e executar com êxito para mim

FROM hypriot/rpi-java
USER root

WORKDIR /usr/build/

RUN /usr/bin/printf '\xfe\xed\xfe\xed\x00\x00\x00\x02\x00\x00\x00\x00\xe2\x68\x6e\x45\xfb\x43\xdf\xa4\xd9\x92\xdd\x41\xce\xb6\xb2\x1c\x63\x30\xd7\x92' > /etc/ssl/certs/java/cacerts
RUN update-ca-certificates -f
RUN /var/lib/dpkg/info/ca-certificates-java.postinst configure

EXPOSE 8080

ARG JAR_FILE=target/app-0.0.1-SNAPSHOT.jar

ADD ${JAR_FILE} app.jar

ENTRYPOINT ["java", "-Djavax.net.ssl.trustStorePassword=changeit", "-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts", "-jar", "app.jar"]
Christian Bartram
fonte