Error: el parámetro trustAnchors no debe estar vacío

492

Estoy tratando de configurar mi correo electrónico en Jenkins / Hudson, y constantemente recibo el error:

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

He visto una buena cantidad de información en línea sobre el error, pero no he conseguido que funcione. Estoy usando Sun's JDK en Fedora Linux (no OpenJDK).

Aquí hay algunas cosas que he probado. Intenté seguir los consejos de esta publicación , pero copiar los cacerts de Windows a mi caja Fedora que alojaba a Jenkins no funcionó. Intenté seguir esta guía mientras intento configurar Gmail como mi servidor SMTP, pero tampoco funcionó. También intenté descargar y mover esos archivos cacert manualmente y moverlos a mi carpeta Java usando una variación de los comandos de esta guía .

Estoy abierto a cualquier sugerencia ya que actualmente estoy atrapado en este momento. Lo hice funcionar desde un servidor de Windows Hudson, pero estoy teniendo problemas con Linux.

David Gill
fuente

Respuestas:

513

Este mensaje extraño significa que el almacén de confianza que especificó fue:

  • vacío,
  • no encontrado, o
  • no se pudo abrir (debido a permisos de acceso, por ejemplo).

Vea también la respuesta de @ AdamPlumb a continuación .

Para depurar este problema (lo escribí aquí ) y comprender qué almacén de confianza se está utilizando, puede agregar la propiedad javax.net.debug = all y luego filtrar los registros sobre el almacén de confianza. También puede jugar con la propiedad javax.net.ssl.trustStore para especificar un almacén de confianza específico. Por ejemplo :


    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
fuente
1
Gracias EJP, vi tu publicación aquí pero no estaba seguro de cómo verificar que el almacén de confianza está allí. También saqué mi archivo server.xml pero no estaba seguro de cómo verificar que el almacén de confianza esté en su lugar. ¿Solo verifico el prefijo keystoreFile = "conf / .keystore" (keystoreFile no estaba presente en ese archivo)?
David Gill
2
La respuesta fue con cómo lo estaba importando. Parecía haber perdido un paso crucial. Ver [Java Error InvalidAlgorithmParameterException] [1] [1]: jyotirbhandari.blogspot.com/2011/09/…
David Gill
2
Confirmó que esta respuesta es correcta. Estaba recibiendo el error en Tomcat. Tenía mi almacén de confianza ${CATALINA_HOME}\confpero CATALINA_HOMEno me estaba configurando, así que Tomcat estaba buscando \confel almacén de confianza.
SingleShot
44
@BubblewareTechnology No, el error estaba en el nombre del archivo, no en cómo importó el certificado al archivo. Tu blog no es correcto Tampoco debería recomendar la modificación del archivo JRE $ / cacerts. Cambiará la próxima actualización de Java. Necesita un proceso que lo copie, agregue su propio certificado a la copia y use la copia como el almacén de confianza. Repita cada actualización de Java. Y no necesita decirle a Java sobre su propio almacén de confianza, solo sobre el suyo, si es diferente.
Marqués de Lorne
3
Agregaré un giro: incluso cuando el almacén de confianza existe, es accesible, está en el formato correcto, si está COMPLETAMENTE VACÍO, ese es el error que puede obtener con varias bibliotecas (incluido Apache HttpClient).
Alan Franzoni
265

En Ubuntu 18.04 , este error tiene una causa diferente (JEP 229, cambia del jksformato predeterminado del almacén de claves al pkcs12formato y la generación de archivos Cacerts de Debian usa el predeterminado para los archivos nuevos) y solución 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

Estado (2018-08-07) , el error se ha corregido en Ubuntu Bionic LTS 18.04.1 y Ubuntu Cosmic 18.10.


🗹 Ubuntu 1770553: [SRU] backport ca-certificados-java de cosmic (20180413ubuntu1)

🗹 Ubuntu 1769013: Combine ca-certificados-java 20180413 (principal) de Debian inestable (principal)

🗹 Ubuntu 1739631: la instalación nueva con JDK 9 no puede usar el archivo de almacén de claves generado por PKCS12 generado

🗹 docker-library 145: la imagen 9-jdk tiene problemas de SSL

🗹 Debian 894979: ca-certificados-java: no funciona con OpenJDK 9, las aplicaciones fallan con InvalidAlgorithmParameterException: el parámetro trustAnchors no debe estar vacío

D JDK-8044445: JEP 229: Crear almacenes de claves PKCS12 de forma predeterminada

EP JEP 229: Crear almacenes de claves PKCS12 por defecto


Si el problema continúa después de esta solución alternativa, es posible que desee asegurarse de que realmente está ejecutando la distribución de Java que acaba de solucionar.

$ which java
/usr/bin/java

Puede configurar las alternativas de Java a 'auto' con:

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

Puede verificar la versión de Java que está ejecutando:

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

También existen soluciones alternativas, pero tienen sus propios efectos secundarios que requerirán un mantenimiento adicional futuro, sin ningún beneficio.

La siguiente mejor solución es agregar la fila

javax.net.ssl.trustStorePassword=changeit

a los archivos

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

lo que exista

La tercera solución alternativa menos problemática es cambiar el valor de

keystore.type=pkcs12

a

keystore.type=jks

en los archivos

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

lo que exista, y luego elimine el cacertsarchivo y vuelva a generarlo de la manera descrita en la última fila del script de solución alternativa en la parte superior de la publicación.

Mikael Gueck
fuente
50
Usuarios de Ubuntu 18, ¡lean esto! ¡Esto te ahorrará muchas horas de tu vida! ¡Gracias!
vak
55
Esta respuesta me ayudó a corregir el mismo error con maven en Ubuntu 18.04. Tuve que cambiar el propietario del archivo / etc / ssl / certs / java / cacerts de la raíz a mí mismo para poder escribir en él. Luego lo cambié de nuevo.
Yuri Gor
77
Corrí sudo rm / etc / ssl / certs / java / cacerts y luego sudo update-ca-f certificados y esto fija mi problema en Kubuntu 18.04.
jsn
2
@jsn, gracias por las soluciones, también funciona en linux mint 19, que se basa en ubuntu 18.04
Samrat
2
La solución de @ jsn también funcionó para Debian Stretch + openjdk8
HRJ
105

Esto solucionó el problema para mí en Ubuntu:

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

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

ca-certificates-java no es una dependencia en Oracle JDK / JRE, por lo que debe instalarse explícitamente

Michael Condouris
fuente
2
Gracias, esto solucionó el problema cuando me encontré con Ubuntu 15.04.
Macil
Trabajó en Raspbian en Raspberry Pi
Defozo
1
Encontré este problema con los backports estables de Debian Jesse con OpenJDK8 y esto solucionó el problema. Estaba usando esto mientras construía imágenes de Docker. :)
Tuxdude
99
Lamentablemente, no funciona en Ubuntu MATE 18.04. Intentaré reinstalar Java.
Pranav A.
1
@codefx: he hecho lo que sugiere y no funciona, en Ubuntu 18.x con Java 10 (predeterminado).
mzedeler
69

En Ubuntu 18.04, la causa raíz es un conflicto entre openjdk-11-jdk (que es el valor predeterminado) y otros paquetes que dependen de él. Ya se ha solucionado en Debian y se incluirá en Ubuntu en breve. Mientras tanto, la solución más simple es degradar su Java a la versión 8. Otras soluciones empleadas ca-certificates-javason mucho más complicadas.

Primero elimine los paquetes en conflicto:

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

Compruebe si eliminó con éxito todos los paquetes relacionados:

sudo update-alternatives --config java

El sistema le indicará que no hay Java disponible para configurar , de lo contrario, esta solución falla .

Luego reinstale los paquetes requeridos:

sudo apt-get install openjdk-8-jdk
shvahabi
fuente
Esta descripción es objetivamente incorrecta y solo soluciona el problema en el mismo sentido que reinstalar Windows podría solucionar un problema. No es necesario eliminar todos los paquetes de Java. Si desea seguir este camino, solo necesita instalar el openjdk-8-jdkpaquete, eliminar el /etc/ssl/certs/java/cacertsarchivo y ejecutar, sudo update-ca-certificates -fque es la forma indirecta de cambiar de un pkcs12archivo cacerts jksformateado a uno formateado, como se describe en otra parte de este hilo.
Mikael Gueck
1
@MikaelGueck Si bien la lógica parece estar de tu lado, estoy aquí para asegurarte que hice exactamente lo que se describe en tu comentario y en la mayoría de las otras respuestas votadas, y en 18.04 esta es la única respuesta que funcionó . Creo que su voto negativo debería convertirse en un voto positivo, o al menos desaparecer, ya que es muy inmerecido.
Andrea Ligios
@AndreaLigios, puedes leer los guiones tú mismo, son bastante cortos. Tienen un conjunto codificado de rutas JAVA_HOME de 8 a 10, las prueban de una en una, llaman al generador de archivos CA de Debian que también puede leer, que usa el formato de archivo existente, porque el código del controlador de archivos de claves JDK, que puede leer, tiene un modo de respaldo de compatibilidad. Si su computadora ejecuta este software simple de manera diferente, es posible que tenga otros problemas con él. ¿Modificó sus alternativas de Java y llamó a alguna otra JVM, porque la eliminación podría haber restablecido las alternativas?
Mikael Gueck
1
@MikaelGueck sí, en uno de los intentos anteriores modifiqué mis alternativas de Java, así que probablemente fue eso. Soy el primero al que le gusta profundizar en el código fuente y encontrar cómo funcionan las cosas, pero este no era mi objetivo hoy, era solo uno de los 5-6 obstáculos inesperados diferentes que tuve en el camino hacia mi objetivo real. ¡Esta respuesta me permitió resolver el problema en menos de 2 minutos! ¿Cuánto tiempo debería haber dedicado a buscar en los scripts y encontrar una mejor solución? ¿Y para qué, para salvar algunos megabytes? Esto es drástico, pero funciona (y no importa cuál sea el problema), así que muchas gracias a OP para aquellos ocupados como el infierno
Andrea Ligios
1
He estado buscando una solución durante 2 días, y su respuesta resolvió mi problema, gracias. Me acabo de mudar a Kubuntu 18.04, esto funcionó.
guepardomar
55

Básicamente, EJP respondió la pregunta (y me doy cuenta de que esta tiene una respuesta aceptada), pero acabo de lidiar con este problema de caso extremo y quería inmortalizar mi solución.

Tuve el InvalidAlgorithmParameterExceptionerror en un servidor Jira alojado que había configurado previamente para acceso solo SSL. El problema era que había configurado mi almacén de claves en el formato PKCS # 12, pero mi almacén de confianza estaba en el formato JKS.

En mi caso, había editado mi server.xmlarchivo para especificar el keytoreType a PKCS, pero no especifiqué el truststoreType, por lo que el valor predeterminado es cualquiera que sea el keystoreType. Especificando el truststoreType explícitamente como JKS lo resolvió para mí.

Adam Plumb
fuente
bueno, te ayudo a inmortalizar la solución a tu problema del caso. ahí es donde se pone interesante.
n611x007
2
Este fue exactamente mi problema. Estaba usando Spring Boot 1.4.2.RELEASE, y tenía un almacén de claves de hardware y un almacén de confianza de software. Especifiqué el proveedor y el tipo para el almacén de claves, pero no el almacén de confianza. Como resultado, el almacén de confianza usó el proveedor y el tipo incorrectos. Especificar aquellos (SUN y JKS) resolvió el problema.
Kenco
12
¿Cómo hiciste esto exactamente? (Windows aquí)
tatsu
2
Me encuentro con esto con mi abuela de Android hoy, casi entiendo lo que dices, pero no dices cómo resolverlo. Respuesta no útil
Lothar
52

Me encontré con esta solución desde la publicación del blog Solucionando el problema trustAnchors al ejecutar OpenJDK 7 en OS X :

Solución del problema trustAnchors al ejecutar OpenJDK 7 en OS X. Si está ejecutando OpenJDK 7 en OS X y ha visto esta excepción:

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

Hay una solución simple. Simplemente enlace en el mismo archivo cacerts que utiliza JDK 1.6 de Apple:

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

Debe hacer esto para cada versión de OpenJDK que haya instalado. Simplemente cambie -v 1.7a la versión que desea arreglar. Ejecute /usr/libexec/java_home -Vpara ver todos los JRE y JDK que ha instalado.

Quizás los chicos de OpenJDK podrían agregar esto a sus scripts de instalación.

Peter Kriens
fuente
1
Mi comando "ln" (en OSX 10.6.8) no tiene una opción "h"; ¿Qué se supone que debe hacer?
Andrew Swan
1
Ah, tenía dos comandos "ln", uno en / usr / bin (el predeterminado) y uno en / bin; este último tenía una opción "h" y funcionaba.
Andrew Swan
Arreglé mi instalación de 1.6 rota vinculada a los cacerts desde la instalación del sistema 1.8 con esta técnica. ¡Gracias!
A21z
1
Para los lectores futuros: parece que también necesita los otros 3 archivos que se encuentran en la securitycarpeta ( blacklisted.certs, local_policy.jary US_export_policy.jar) para Java para ser feliz.
awksp
@Peter Kriens, ¿por qué vincularse a cacertsbajo jredirectorio?
BAE
45

En Ubuntu 12.10 (Quantal Quetzal) o posterior, los certificados se encuentran en el paquete ca-certificados-java . El uso -Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacertslos recogerá independientemente de qué JDK esté usando.

yvesr
fuente
54
Descubrí que necesitaba ejecutar update-ca-certificates -fmanualmente, para llenar el archivo cacerts
Portablejim
44
@ Portablejim Gracias. Su comentario resolvió el primer problema que llegué a construir Apache Spark en Ubuntu 15.04beta.
Paul
1
Gracias @Portablejim, tu comentario funcionó para mí en Ubuntu 15.04.
David Berg
Gracias. Esto se solucionó mi problema con PhpStrom + parcheado JDK. Escribí esta clave en el archivo "phpstorm64.vmoptions".
Vijit
No funciona para mí en Ubuntu 18.04 y JDK es 1.8.0_62
Devendra Singraul
34

Me encontré con este problema exacto en OS X, usando JDK 1.7, después de actualizar a OS X v10.9 (Mavericks). La solución que funcionó para mí fue simplemente reinstalar la versión de Apple de Java, disponible en http://support.apple.com/kb/DL1572 .

KiwiMartin
fuente
Encontré esto con Java 6 utilizado por Grails en OSX. También tenía Java 7 de Oracle instalado y también actualizado a Mavericks. La reinstalación de Java 6 desde el sitio web de Apple también me solucionó el problema.
pm_labs
Me encontré con esto al instalar jdk 6 abierto en una caja de nube de ubuntu. Es agradable ver una cara familiar, por cierto
Ben Hutchison
30

Yo corri

sudo update-ca-certificates -f

para crear un archivo de certificado y luego:

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

Estaba de vuelta en el negocio, gracias chicos. Es una pena que no esté incluido en la instalación, pero al final llegué allí.

Johnny
fuente
Cuando corro sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure**me salesudo: /var/lib/dpkg/info/ca-certificates-java.postinst: command not found
Magick
Solo sudo update-ca-certificates -fes suficiente en Debian jessie con openjdk-8-jre-headlessjessie-backports, siempre que ca-certificates-javaesté instalado. Creo que el orden de instalación es importante (JRE después ca-certificates-javapuede causar esto, ya que este último no tiene ningún desencadenante para el Java 8 compatible).
mirabilos
2
sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure sin estrellas **
Yu Jiaao
update-ca-certificates -fes lo que lo solucionó. No necesitaba el segundo comando
Mark Jeronimus
17

El error indica que el sistema no puede encontrar el almacén de confianza en la ruta provista con el parámetro javax.net.ssl.trustStore.

En Windows, copié el cacertsarchivo jre/lib/securityen el directorio de instalación de Eclipse (mismo lugar que el eclipse.iniarchivo) y agregué la siguiente configuración en eclipse.ini:

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

Tuve algunos problemas con la ruta a los cacerts (la variable de entorno% java_home% se sobrescribe de alguna manera), por lo que utilicé esta solución trivial.

La idea es proporcionar una ruta válida al archivo del almacén de confianza, idealmente sería usar uno relativo. También puede usar una ruta absoluta.

Para asegurarse de que el tipo de tienda es JKS, debe ejecutar el siguiente comando:

keytool -list -keystore cacerts

Keystore type: JKS
Keystore provider: SUN
razvanone
fuente
2
Esta es la única respuesta que realmente funcionó. Gracias @razvanone
Akshar Patel
1
Me las arreglé para golpear un pequeño "gotcha": las tres líneas en el archivo eclipse.ini deben estar en tres líneas separadas reales. Inicialmente los puse a todos en una línea y el eclipse no lo captó.
SiKing
16

Eliminar el paquete ca-certificados-java e instalarlo nuevamente funcionó para mí ( Ubuntu MATE 17.10 (Artful Aardvark)).

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

sudo apt-get install ca-certificates-java

Gracias, jdstrand: Comentario 1 para el error 983302, Re: ca-certificados-java no puede instalar los cacerts de Java en Oneiric Ocelot .

ericek111
fuente
11

He tenido muchos problemas de seguridad después de actualizar a OS X v10.9 (Mavericks):

  • Problema SSL con Amazon AWS
  • Compañero no autenticado con Maven y Eclipse
  • trustAnchors el parámetro no debe estar vacío

Apliqué esta actualización de Java y solucionó todos mis problemas: http://support.apple.com/kb/DL1572?viewlocale=en_US

Freddy Boucher
fuente
55
Ugh Java 6 ha pasado muchos años de su fin de soporte público, y seguramente está lleno de agujeros de seguridad. Apple lo pone a disposición para su descarga, de modo que el software anterior que no puede ejecutarse con Java 7/8 pueda continuar ejecutándose, pero no debe usarse para realizar conexiones SSL a servicios en Internet público, como 1. AWS, 2. Maven Central, 3. cualquier otra cosa.
Zac Thompson
10

Esperaba cosas como esta, ya que uso un JVM alternativo en mi Talend Open Studio (el soporte actualmente solo existe hasta JDK 1.7). Yo uso 8 por motivos de seguridad ... de todos modos

  • Actualice su tienda de certificados:

    sudo update-ca-certificates -f

entonces

  • agregue un nuevo valor en sus parámetros de inicialización

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

Para mí, la segunda entrada funcionó. Creo que, dependiendo de la versión de Talend Open Studio / TEnt + JVM, tiene un nombre de parámetro diferente, pero busca el mismo archivo de almacén de claves.

chimeneas
fuente
44
¿De dónde sacaste la propiedad javax.net.ssl.trustAnchors? No se menciona en la documentación de JSSE.
Marqués de Lorne
10

Para mí fue causado por la falta de un TrustedCertEntry en el almacén de confianza.

Para probar, use:

keytool -list -keystore keystore.jks

Me da:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

cert-alias, 31-Jul-2017, PrivateKeyEntry

Aunque mi PrivateKeyEntry contiene una CA, se debe importar por separado :

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

Importa el certificado y luego volver a ejecutarlo keytool -list -keystore keystore.jksahora proporciona:

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>

Ahora tiene un TrustedCertEntry, y Tomcat comenzará con éxito.

cordero
fuente
Nota: consulte el tutorial de baeldung con un útil Makefile como acceso directo para crear el almacén de claves y el almacén de confianza (proyecto spring-security-x509) baeldung.com/x-509-authentication-in-spring-security
hello_earth el
9

Algunos lanzamientos de proveedores de OpenJDK causaron esto al tener un cacertsarchivo vacío distribuido con el binario. El error se explica aquí: https://github.com/AdoptOpenJDK/openjdk-build/issues/555

Puede copiar al adoptOpenJdk8\jre\lib\security\cacertsarchivo desde una instalación antigua como c:\Program Files\Java\jdk1.8.0_192\jre\lib\security\cacerts.

La versión con errores de AdoptOpenJDK es https://github.com/AdoptOpenJDK/openjdk8-releases/releases/download/jdk8u172-b11/OpenJDK8_x64_Win_jdk8u172-b11.zip

raisercostin
fuente
Creo que este también fue mi caso. En AdoptOpenJDK 202 este error está presente, y en 222 funciona. Así que actualiza tu jdk si es posible.
Marty
6

Si experimenta esto en Ubuntu con JDK9 y Maven, puede agregar esta opción JVM: primero verifique si la ruta existe:

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

Si falta el archivo, intente instalar ca-certificados-java como alguien señaló:

sudo apt install ca-certificates-java
dmatej
fuente
Si usa docker, entonces también puede probar la imagen "maven: 3-jdk-9-slim" en lugar de "maven: 3-jdk-9"
Konstantin Pavlov
Gracias, esto funcionó para mí para openjdk-8-jdk en ubuntu 18.04
Aftab Naveed
4

Recibí este mensaje de error en Java 9.0.1 en Linux. Fue debido a un error conocido del JDK, donde el archivo cacerts está vacío en el paquete binario .tar.gz (descargado de http://jdk.java.net/9/ ).

Consulte el párrafo "problemas conocidos" de las notas de la versión JDK 9.0.1 , que dice "TLS no funciona de manera predeterminada en OpenJDK 9".

En Debian / Ubuntu (y probablemente otras derivadas), una solución simple es reemplazar el archivo cacerts con el del paquete "ca-certificados-java":

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

En Red Hat Linux / CentOS, puede hacer lo mismo desde el paquete "ca-certificados":

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

Tuve este problema al intentar usar Maven 3, después de actualizar de Ubuntu 16.04 LTS (Xenial Xerus) a Ubuntu 18.04 LTS (Bionic Beaver).

Comprobar / usr / lib / jvm / java-8-oracle / jre / lib / security mostró que mi archivo cacerts era un enlace simbólico que apuntaba a /etc/ssl/certs/java/cacerts .

También tenía un archivo sospechosamente nombrado cacerts.original.

Cambié el nombre cacerts.originala cacerts, y eso solucionó el problema.

John Deverall
fuente
El cacerts.originalarchivo tenía el jksformato y se generó con Java 8 de Ubuntu 16.04, que usaba ese formato como predeterminado. El cacertsarchivo estaba en el pkcs12formato, generado por Java 10 de Ubuntu 18.04, que utiliza este formato como predeterminado. Como se explica en otra parte de este hilo, el nuevo formato requiere que pase la contraseña al ejecutable. Pero siempre que genere un nuevo jks cacertsarchivo vacío o copie uno antiguo, el siguiente proceso de generación de cacerts vaciará el archivo existente y lo rellenará con los certificados de CA del sistema de archivos.
Mikael Gueck el
3

También encontré esto en OS X después de actualizar OS X v10.9 (Mavericks), cuando se usaba el antiguo Java 6 e intentaba acceder a una URL HTTPS. La solución fue la inversa de Peter Kriens; Necesitaba copiar cacertsdesde el espacio 1.7 a la ubicación vinculada por la versión 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
fuente
1
El comando aquí intenta copiar un directorio a un archivo; no tiene ningún sentido
praseodym
Estoy de acuerdo con la evaluación del uso de una solución inversa. Encontré que jdk1.6 tenía un enlace suave roto /Library/Java/JavaVirtualMachines/1.6.0_33-b03-424.jdk/Contents/Home/lib/security/cacerts -> /System/Library/Java/Support/CoreDeploy.bundle / Contenido / Inicio / lib / security / cacerts. Así que arreglé el enlace blando roto, luego copié sobre los cacerts de la instalación jdk1.7.
James A Wilson el
NOTA: cuando haya terminado, debería poder capturar el archivo cacerts que copió para validar los permisos.
Grey
Además, arreglé el cp para ir en la dirección correcta y agregué la umask para mkdir y cp.
Grey
3

En mi caso, el archivo JKS utilizado en la aplicación cliente estaba dañado. Creé uno nuevo e importé los certificados SSL del servidor de destino. Luego usé el nuevo archivo JKS en la aplicación cliente como un almacén de confianza, como:

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

Fuente: Java SSL y certificado de almacén de claves

Uso la herramienta (KeyStore Explorer) para crear el nuevo JKS. Puede descargarlo desde este enlace, KeyStore Explorer .

Salman
fuente
keytore-explorer hizo el trabajo por mí. Solo tiene que crear un almacén de claves predeterminado y examinar y guardar el archivo de certificado para el sitio / host.
Shantha Kumara
3

También puede encontrar este error después de actualizar a Spring Boot 1.4.1 (o más reciente) porque trae Tomcat 8.5.5 como parte de sus dependencias.

El problema se debe a la forma en que Tomcat trata con la tienda de confianza. Si ha especificado que la ubicación de su tienda de confianza es la misma que su almacén de claves en la configuración de Spring Boot, es probable que reciba el trustAnchors parameter must be non-emptymensaje al iniciar la aplicación.

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

Simplemente elimine la server.ssl.trust-storeconfiguración a menos que sepa que la necesita, en cuyo caso consulte los enlaces a continuación.

Los siguientes problemas contienen más detalles sobre el problema:

Robert Hunt
fuente
3

Encontré este problema con el SDK de Android SDKmanager. Para mí esta solución funcionó:

  1. Ir /usr/lib/jvm/java-8-oracle/jre/lib/security/
  2. Reemplazar cacertconcacert.original

El cacertarchivo era pequeño (22B). He instalado oracle-java8-installerdesde ppa:webupd8team/java(de acuerdo con este manual: https://docs.nativescript.org/start/ns-setup-linux ).

Tyg
fuente
2

Para el registro, ninguna de las respuestas aquí funcionó para mí. Mi compilación de Gradle comenzó a fallar misteriosamente con este error, incapaz de obtener HEAD desde Maven central para un archivo POM particular .

Resultó que tenía JAVA_HOME configurado en mi propia versión personal de OpenJDK, que había creado para depurar un problema de javac. Ajustándolo nuevamente al JDK instalado en mi sistema lo arregló.

usuario3562927
fuente
... lo que provocó que no se encontrara el almacén de confianza, según otras respuestas.
Marqués de Lorne
1
Sí, pero saber que no se puede encontrar el almacén de confianza es completamente inútil si no puede averiguar por qué no se está encontrando. Hay muchas formas posibles de que pueda salir mal, y es frustrante cuando ninguna de ellas es la forma particular en que falla su propio sistema.
user3562927
Todos 'suceden' por el mismo error: el almacén de confianza especificado no se pudo abrir o estaba vacío. Hay un millón de formas en que podría surgir esta situación, y no hay suficiente espacio en SO para enumerarlas a todas.
Marqués de Lorne
1

En Red Hat Linux resolví este problema importando los certificados /etc/pki/java/cacerts.

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

Debe agregar las dos líneas anteriores a su código. No puede encontrar el almacén de confianza.

Divyesh Kalbhor
fuente
2
Si no lo hace, utilizará el almacén de confianza de JRE, y ciertamente podrá encontrarlo. El error es causado por valores incorrectos en estos parámetros, no por su ausencia. El archivo nombrado en su código solo se aplica a su instalación, generalmente no.
Marqués de Lorne
La forma correcta de establecer esas propiedades es pasándolas en la línea de comando: java -Djavax.net.ssl.trustStore=/tmp/cacerts ...o si desea establecerlas globalmente para todos los programas ejecutados con un JDK, agregue la fila al management.propertiesarchivo del JDK .
Mikael Gueck
1

Enfrenté este problema mientras ejecutaba un conjunto particular de Android para probar en Ubuntu 14.04 (Trusty Tahr). Dos cosas funcionaron para mí como lo sugirió shaheen:

sudo update-ca-certificates -f

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

Ninguna de las soluciones que encontré en Internet funcionó, pero una versión modificada de la respuesta de Peter Kriens parece hacer el trabajo.

Primero encuentre su carpeta Java ejecutando /usr/libexec/java_home. Para mí fue la 1.6.0.jdkversión. Luego ve a su lib/securitysubcarpeta (para mí /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security).

Luego elimine el cacertsarchivo si ya hay uno y busque uno en el sistema con sudo find / -name "cacerts". Encontró varios elementos para mí, en versiones de Xcode u otras aplicaciones que había instalado, pero también en las /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacertsque elegí.

Use ese archivo y cree un enlace simbólico (dentro de la carpeta Java de antes) sudo ln -fsh "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts", y debería funcionar.

Tengo ambos: Java de la descarga 2017-001 de Apple ( https://support.apple.com/kb/dl1572 - Supongo que es de allí de donde provienen los certificados correctos) y uno de Oracle instalado en Mac OS X v10.12 (Sierra) .

shw
fuente
1

en ubuntu 14.04 con openjdk 11 de ppa: openjdk-r / ppa esto funcionó para mí:

en java.security cambie el tipo de almacén de claves a

keystore.type=jks

entonces:

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

cuando verifique si funcionó, asegúrese de no estar usando ningún demonio con Java antiguo aún ejecutándose (p. ej. --no-daemon opción para gradle)

Este error describe todo muy bien y lo ayudará a comprender lo que está sucediendo https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/1739631

piotrek
fuente
1

En Ubuntu 18.04 necesitaba usar OpenJDK 1.7 para el mantenimiento de un proyecto antiguo. Descargué el paquete binario. Pero cuando ejecuté mi script en él, obtuve el mismo error.

La solución fue eliminar el cacertsarchivo del JDK descargado en la jre/lib/securitycarpeta y luego crearlo como enlace simbólico al cacertsarchivo del sistema en /etc/ssl/certs/java/:

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

Miguel
fuente
1

Es poco probable que esto ayude a cualquier persona, pero ... para cualquiera que ejecute Java 8 desde una imagen Docker en una Raspberry Pi (usando CPU AMD) Obtuve el siguiente Dockerfile para construir y ejecutar con éxito para mí

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
fuente