Tengo un cliente Java intentando acceder a un servidor con un certificado autofirmado.
Cuando intento publicar en el servidor, aparece el siguiente error:
no se puede encontrar la ruta de certificación válida para el objetivo solicitado
Después de investigar un poco sobre el tema, hice lo siguiente.
- Guarde el nombre de dominio de mis servidores como un
root.cer
archivo. - En el JRE de mi servidor Glassfish, ejecuté esto:
keytool -import -alias example -keystore cacerts -file root.cer
- Para comprobar que el certificado se agregó a mi cacert con éxito, hice esto:
keytool -list -v -keystore cacerts
puedo ver que el certificado está presente. - Luego reinicié Glassfish y retiré la 'publicación'.
Todavía recibo el mismo error.
Tengo la sensación de que esto se debe a que mi Glassfish en realidad no está leyendo el archivo cacert que he modificado, sino quizás otro.
¿Alguno de ustedes tuvo este problema y puede empujarme en la dirección correcta?
Respuestas:
Desafortunadamente, podrían ser muchas cosas, y muchos servidores de aplicaciones y otros 'envoltorios' de Java son propensos a jugar con propiedades y su 'propia' versión de llaveros y demás. Por lo tanto, puede estar mirando algo totalmente diferente.
A falta de armadura, probaría:
para ver si eso ayuda. En lugar de 'todos', también se puede establecer en 'ssl', administrador de claves y administrador de confianza, lo que puede ayudar en su caso. Si lo configura como 'ayuda', se enumerará algo como a continuación en la mayoría de las plataformas.
En cualquier caso, asegúrese de comprender completamente la diferencia entre el almacén de claves (en el que tiene la clave privada y el certificado con el que demuestra su propia identidad) y el almacén de confianza (que determina en quién confía), y el hecho de que su propia identidad también tiene una "cadena" de confianza para la raíz, que está separada de cualquier cadena a una raíz que necesita para descubrir "en quién" confía.
Fuente: # Ver http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug
fuente
Aquí está la solución, siga el siguiente enlace paso a paso:
http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/
ARCHIVO JAVA: que falta en el blog
fuente
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0];}
Debe configurar las propiedades del sistema JSSE, específicamente apuntar al almacén de certificados del cliente.
Vía linea de comando:
o a través del código Java:
Para obtener más información, consulte los detalles en el sitio de RedHat .
fuente
(vuelva a publicar desde mi otra respuesta )
Use la herramienta de herramientas cli de la distribución de software java para importar (¡y confíe! ) los certificados necesarios
Muestra:
Desde cli, cambie el directorio a jre \ bin
Compruebe el almacén de claves (archivo encontrado en el directorio jre \ bin)
keytool -list -keystore .. \ lib \ security \ cacerts La
contraseña es changeit
Descargue y guarde todos los certificados en cadena del servidor necesario.
Agregue certificados (antes de eliminar el atributo "solo lectura" en el archivo ".. \ lib \ security \ cacerts"), ejecute: keytool -alias REPLACE_TO_ANY_UNIQ_NAME -import -keystore .. \ lib \ security \ cacerts -file "r: \ root.crt "
accidentalmente encontré un consejo tan simple. Otras soluciones requieren el uso de InstallCert.Java y JDK
fuente: http://www.java-samples.com/showtutorial.php?tutorialid=210
fuente
Tuve el mismo problema con sbt .
Intentó obtener dependencias de repo1.maven.org a través de ssl,
pero dijo que "no se pudo encontrar la ruta de certificación válida para la URL de destino solicitada".
así que seguí esta publicación y aún no pude verificar una conexión.
Entonces leí al respecto y descubrí que el
certificado raíz no es suficiente, como lo sugirió la publicación, así que lo que funcionó para mí fue importar los certificados de CA intermedios en el almacén de claves .
De hecho, agregué todos los certificados de la cadena y funcionó de maravilla.
fuente
Solución al migrar de JDK 8 a JDK 10
certs
JDK 10
JDK 8
Pasos para arreglar
jlink
como/opt/jdk/bin/jlink \ --module-path /opt/jdk/jmods...
Entonces, aquí están las diferentes rutas y la secuencia de los comandos ...
fuente
Estoy trabajando en un tutorial para los servicios web REST en www.udemy.com (REST Java Web Services). El ejemplo en el tutorial decía que para tener SSL, debemos tener una carpeta llamada "trust_store" en mi proyecto "cliente" de eclipse que debería contener un archivo "almacén de claves" (teníamos un proyecto "cliente" para llamar al servicio y proyecto de "servicio" que contenía el servicio web REST: 2 proyectos en el mismo espacio de trabajo de eclipse, uno para el cliente y otro para el servicio). Para simplificar las cosas, dijeron que copie "keystore.jks" del servidor de aplicaciones glassfish (glassfish \ domains \ domain1 \ config \ keystore.jks) que estamos usando y lo coloque en esta carpeta "trust_store" que me hicieron hacer El proyecto del cliente. Eso parece tener sentido: los certificados autofirmados en el servidor ' s key_store correspondería a los certificados en el cliente trust_store. Ahora, al hacer esto, recibí el error que menciona la publicación original. Lo busqué en Google y leí que el error se debe al archivo "keystore.jks" en el cliente que no contiene un certificado de confianza / firmado, que el certificado que encuentra es autofirmado.
Para mantener las cosas claras, permítanme decir que, según tengo entendido, el "keystore.jks" contiene certificados autofirmados y el archivo "cacerts.jks" contiene certificados de CA (firmados por la CA). El "keystore.jks" es el "almacén de claves" y el "cacerts.jks" es el "almacén de confianza". Como "Bruno", un comentarista, dice arriba, "keystore.jks" es local y "cacerts.jks" es para clientes remotos.
Entonces, me dije a mí mismo, hey, glassfish también tiene el archivo "cacerts.jks", que es el archivo trust_store de glassfish. Se supone que cacerts.jsk contiene certificados de CA. Y aparentemente necesito que mi carpeta trust_store contenga un archivo de almacén de claves que tenga al menos un certificado de CA. Entonces, intenté poner el archivo "cacerts.jks" en la carpeta "trust_store" que había creado, en mi proyecto de cliente, y cambiar las propiedades de VM para que apunte a "cacerts.jks" en lugar de "keystore.jks". Eso eliminó el error. Supongo que todo lo que necesitaba era un certificado CA para funcionar.
Esto puede no ser ideal para la producción, o incluso para el desarrollo más allá de hacer que algo funcione. Por ejemplo, probablemente podría usar el comando "keytool" para agregar certificados de CA al archivo "keystore.jks" en el cliente. Pero de todos modos, con suerte, esto al menos reduce los posibles escenarios que podrían estar ocurriendo aquí para causar el error.
TAMBIÉN: mi enfoque parecía ser útil para el cliente (certificado del servidor agregado al cliente trust_store), parece que los comentarios anteriores para resolver la publicación original son útiles para el servidor (certificado del cliente agregado al servidor trust_store). Salud.
Configuración del proyecto Eclipse:
--- cacerts.jks --- keystore.jks
Fragmento del archivo MyClientProject.java:
fuente
Mi problema fue que se instaló un agente de seguridad de acceso a la nube, NetSkope, en mi computadora portátil de trabajo a través de una actualización de software. Esto estaba alterando la cadena de certificados y todavía no podía conectarme al servidor a través de mi cliente java después de importar toda la cadena a mi almacén de claves cacerts. Inhabilité NetSkope y pude conectarme con éxito.
fuente
En mi caso, estaba enfrentando el problema porque en mi proceso tomcat se proporcionó un almacén de claves específico usando
Mientras importaba el certificado al certificado de JRE / lib / security y los cambios no se reflejaban. Luego hice el siguiente comando donde /tmp/cert1.test contiene el certificado del servidor de destino
Podemos verificar si la importación del certificado es exitosa
y vea si su servidor taget se encuentra contra alias rapidssl-myserver
fuente
¡Comprueba si el archivo
$JAVA_HOME/lib/security/cacerts
existe! En mi caso, no era un archivo sino un enlace/etc/ssl/certs/java/cacerts
y también era un enlace a sí mismo (¿QUÉ ???), por lo que JVM no puede encontrar el archivo.Solución: copie el archivo cacerts real ( puede hacerlo desde otro JDK ) al
/etc/ssl/certs/java/
directorio y resolverá su problema :)fuente
rm -f /opt/jdk-minimal/jre/lib/security/cacerts ; ln -s /etc/ssl/certs/java/cacerts /opt/jdk-minimal/jre/lib/security/cacerts
Digamos si está utilizando variables classpath como $ {JAVA_HOME} en pom.xml.
En los objetivos, agregue las variables classpath. es decir, -DANT_HOME, -DJAVA_HOME
fuente