Editar: - Intenté formatear la pregunta y acepté la respuesta de una manera más presentable en el mío Blog
Aquí está el problema original.
Recibo este error:
mensaje detallado sun.security.validator.ValidatorException: falló la construcción de la ruta PKIX:
sun.security.provider.certpath.SunCertPathBuilderException: no se pudo encontrar la ruta de certificación válida para el objetivo solicitadocausa javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: falló la construcción de la ruta PKIX: sun.security.provider.certpath.SunCertPathBuilderException: no se pudo encontrar la ruta de certificación válida para el objetivo solicitado
Estoy usando Tomcat 6 como servidor web. Tengo dos aplicaciones web HTTPS instaladas en diferentes Tomcats en diferentes puertos pero en la misma máquina. Di App1(port 8443)
y
App2(port 443)
. App1
se conecta a App2
. Cuando se App1
conecta a App2
me sale el error anterior. Sé que este es un error muy común, por lo que encontré muchas soluciones en diferentes foros y sitios. Tengo la siguiente entrada server.xml
de ambos Tomcats:
keystoreFile="c:/.keystore"
keystorePass="changeit"
Todos los sitios dicen la misma razón por la que el certificado otorgado por app2 no se encuentra en la tienda de confianza de app1 jvm. Esto parece ser cierto también cuando traté de golpear la misma URL en el navegador IE, funciona (con el calentamiento, hay un problema con el certificado de seguridad de este sitio web. Aquí digo que continúe con este sitio web). Pero cuando el cliente Java alcanza la misma URL (en mi caso) obtengo el error anterior. Para ponerlo en el almacén de confianza probé estas tres opciones:
Opción 1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Opción 2 Configuración a continuación en la variable de entorno
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Opción 3 Configuración a continuación en la variable de entorno
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Pero nada funcionó .
Lo que finalmente funcionó es ejecutar el enfoque Java sugerido en Cómo manejar certificados SSL no válidos con Apache HttpClient? por Pascal Thivent, es decir, ejecutando el programa InstallCert.
Pero este enfoque está bien para la configuración de devbox, pero no puedo usarlo en el entorno de producción.
Me pregunto por qué tres enfoques mencionados anteriormente no funcionó cuando he mencionado los mismos valores en el server.xml
de app2
los valores del servidor y en el mismo almacén de confianza por el ajuste
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
en el app1
programa
Para obtener más información, así es como estoy haciendo la conexión:
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
if (conn instanceof HttpsURLConnection) {
HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();
conn1.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
reply.load(conn1.getInputStream());
domainname
mis servidores RHEL, el problema desapareció. Espero que ayude a alguien.Respuestas:
Debe agregar el certificado para App2 al archivo del almacén de confianza de la JVM utilizada ubicada en
%JAVA_HOME%\lib\security\cacerts
.Primero puede verificar si su certificado ya está en el almacén de confianza ejecutando el siguiente comando:
keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"
(no necesita proporcionar una contraseña)Si falta su certificado, puede obtenerlo descargándolo con su navegador y agregarlo al almacén de confianza con el siguiente comando:
keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password>
Después de la importación, puede ejecutar el primer comando nuevamente para verificar si se agregó su certificado.
La información de Sun / Oracle se puede encontrar aquí .
fuente
keytool error: java.io.FileNotFoundException ... (Access is denied)
cuando intente importar su certificado.• Cuando recibí el error, intenté buscar en Google el significado de la expresión y descubrí que este problema se produce cuando un servidor cambia su certificado SSL HTTPS y nuestra versión anterior de Java no reconoce la autoridad de certificación raíz (CA) .
• Si puede acceder a la URL HTTPS en su navegador, entonces es posible actualizar Java para reconocer la CA raíz.
• En su navegador, vaya a la URL HTTPS a la que Java no pudo acceder. Haga clic en la cadena de certificados HTTPS (hay un icono de candado en Internet Explorer), haga clic en el candado para ver el certificado.
• Vaya a "Detalles" del certificado y "Copiar a archivo". Copiarlo en base 64 (.cer) formato. Se guardará en su escritorio.
• Instale el certificado ignorando todas las alertas.
• Así es como reuní la información del certificado de la URL a la que intentaba acceder.
Ahora tenía que hacer mi versión de Java para conocer el certificado para que no se negara a reconocer la URL. A este respecto, debo mencionar que busqué en Google que la información del certificado raíz permanezca por defecto en la ubicación de seguridad de JDK \ jre \ lib \ , y la contraseña predeterminada para acceder es: changeit.
Para ver la información de cacerts, los siguientes son los procedimientos a seguir:
• Haga clic en el botón Inicio -> Ejecutar
• Escriba cmd. Se abre el símbolo del sistema (es posible que deba abrirlo como administrador).
• Ve a tu
Java/jreX/bin
directorio• Escriba lo siguiente
Da la lista de los certificados actuales contenidos en el almacén de claves. Se parece a esto:
• Ahora tenía que incluir el certificado previamente instalado en los cacerts.
• Para esto, el siguiente es el procedimiento:
Si está utilizando Java 7:
• Luego agregará la información del certificado al archivo cacert.
¡Es la solución que encontré para la excepción mencionada anteriormente!
fuente
Cómo trabajarlo en Tomcat 7
Quería admitir un certificado autofirmado en una aplicación Tomcat, pero el siguiente fragmento no funcionó
Esto es lo que resolvió mi problema:
1) Descargar el
.crt
archivo<your domain>
con su dominio (por ejemplojossef.com
)2) Aplicar el
.crt
archivo en elcacerts
almacén de certificados de Java<your domain>
con su dominio (por ejemplojossef.com
)<JAVA HOME>
con su directorio de inicio de Java3) piratearlo
Aunque instalé mi certificado en
Java
los almacenes de certificados predeterminados, Tomcat lo ignora (parece que no está configurado para usar los almacenes de certificados predeterminados de Java).Para hackear esto, agrega lo siguiente en algún lugar de tu código:
fuente
En mi caso, el problema era que el servidor web solo enviaba el certificado y la CA intermedia, no la CA raíz. Agregar esta opción JVM resolvió el problema:
-Dcom.sun.security.enableAIAcaIssuers=true
Fuente
fuente
Otra razón podría ser una versión desactualizada de JDK. Estaba usando jdk versión 1.8.0_60, simplemente actualizar a la última versión solucionó el problema del certificado.
fuente
Mi archivo de cacerts estaba totalmente vacío. Resolví esto copiando el archivo cacerts de mi máquina Windows (que usa Oracle Java 7) y lo scp'd a mi caja de Linux (OpenJDK).
y luego en la máquina de Linux
Ha funcionado muy bien hasta ahora.
fuente
Para mí, este error también apareció al intentar conectarse a un proceso detrás de un proxy inverso NGINX que manejaba el SSL.
Resultó que el problema era un certificado sin toda la cadena de certificados concatenados. Cuando agregué certificados intermedios, el problema se resolvió.
Espero que esto ayude.
fuente
Usando Tomcat 7 bajo Linux, esto hizo el truco.
En Linux,
$JAVA_HOME
no siempre se configura, pero generalmente/etc/alternatives/jre
apunta a$JAVA_HOME/jre
fuente
El siguiente código funciona para mí:
fuente
Estaba usando
jdk1.8.0_171
cuando me enfrenté al mismo problema. Intenté las 2 mejores soluciones aquí (agregando un certificado usando keytool y otra solución que tiene un truco) pero no funcionaron para mí.Actualicé mi JDK
1.8.0_181
y funcionó de maravilla.fuente
escribí un pequeño script estúpido de cmd (línea de comando) win32 (WinXP 32bit testet) que busca todas las versiones de java en los archivos de programa y les agrega un certificado. La contraseña debe ser el "changeit" predeterminado o cámbielo usted mismo en el script :-)
fuente
Para MacOS X a continuación, el comando exacto funcionó para mí, donde tuve que probar con doble bombo en la opción 'importcert' que funcionó:
fuente
Para mí no funcionó la solución reconocida de esta publicación: https://stackoverflow.com/a/9619478/4507034 .
En cambio, logré resolver el problema importando la certificación a las certificaciones confiables de mi máquina.
Pasos:
https://localhost:8443/yourpath
) Donde la certificación no funciona.Manage computer certificates
Trusted Root Certification Authorities
->Certificates
your_certification_name.cer
archivo.fuente
Para que Tomcat se ejecute en el servidor Ubuntu, para averiguar qué Java se está utilizando, use el comando "ps -ef | grep tomcat":
Muestra:
Luego, podemos ingresar a: cd /usr/local/java/jdk1.7.0_15/jre/lib/security
El archivo cacerts predeterminado se encuentra aquí. Inserte el certificado no confiable en él.
fuente
por seguridad no debemos usar certificados autofirmados en nuestra implementación. Sin embargo, cuando se trata de desarrollo, a menudo tenemos que usar entornos de prueba que obtuvieron certificados autofirmados. Traté de solucionar este problema mediante programación en mi código y fallo. Sin embargo, al agregar el certificado al jre trust-store se solucionó mi problema. Por favor encuentre los pasos a continuación,
Descargue el certificado del sitio,
Copie el certificado (ej: cert_file.cer) en el directorio $ JAVA_HOME \ Jre \ Lib \ Security
Abra CMD en Administrador y cambie el directorio a $ JAVA_HOME \ Jre \ Lib \ Security
Importe el certificado a un almacén de confianza con el siguiente comando,
Si recibió un error diciendo que keytool no es reconocible, consulte esto.
Escriba yes como abajo
Actualizar
Si su servidor de aplicaciones es jboss, intente agregar debajo de la propiedad del sistema
¡Espero que esto ayude!
fuente
SOLUCIÓN DESPLEGABLE (Alpine Linux)
Para poder solucionar este problema en nuestros entornos de aplicación, hemos preparado los comandos de terminal de Linux de la siguiente manera:
Generará un archivo cert en el directorio de inicio.
Este comando instala openssl en alpine Linux. Puede encontrar los comandos adecuados para otras distribuciones de Linux.
Generado el archivo cert necesario.
Aplica el archivo generado al JRE con el programa 'keytool'.
Nota: Reemplace su DNS con
<host-dns-ssl-belongs>
Nota 2 : tenga en cuenta que
-noprompt
no se solicitará el mensaje de verificación (sí / no) y el-storepass changeit
parámetro deshabilitará la solicitud de contraseña y proporcionará la contraseña necesaria (el valor predeterminado es 'changeit'). Estas dos propiedades le permitirán usar esos scripts en los entornos de su aplicación, como crear una imagen de Docker.Nota3 Si está implementando su aplicación a través de Docker, puede generar el archivo secreto una vez y ponerlo en los archivos de proyecto de su aplicación. No necesitará generarlo una y otra vez.
fuente
Tengo este problema también.
Intenté casi todo agregando el certificado SSL a .keystore, pero no funcionaba con Java1_6_x. Para mí, ayudó si comenzamos a usar una versión más nueva de Java, Java1_8_x como JVM.
fuente
Estaba teniendo este problema con Android Studio cuando estoy detrás de un proxy. Estaba usando Crashlytics que intenta cargar el archivo de mapeo durante una compilación.
Agregué el certificado proxy faltante al almacén de confianza ubicado en
/Users/[username]/Documents/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts
con el siguiente comando:
keytool -import -trustcacerts -keystore cacerts -storepass [password] -noprompt -alias [alias] -file [my_certificate_location]
por ejemplo con la contraseña predeterminada del almacén de confianza
keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias myproxycert -file /Users/myname/Downloads/MyProxy.crt
fuente
Solo un pequeño truco. Actualice la URL en el archivo "hudson.model.UpdateCenter.xml" de https a http
fuente
Quiero intervenir ya que tengo un entorno QEMU donde tengo que descargar archivos en Java. Resulta que
/etc/ssl/certs/java/cacerts
en QEMU tiene problemas porque no coincide/etc/ssl/certs/java/cacerts
con el entorno del host. El entorno de host está detrás de un proxy de la empresa, por lo que java cacerts es una versión personalizada.Si está utilizando un entorno QEMU, asegúrese de que el sistema host pueda acceder primero a los archivos. Por ejemplo puedes intentar este script en su máquina host primero para ver. Si el script se ejecuta bien en la máquina host pero no en QEMU, entonces está teniendo el mismo problema que yo.
Para resolver este problema, tuve que hacer una copia de seguridad del archivo original en QEMU, copiar el archivo en el entorno host a la cárcel chroot de QEMU, y luego Java podría descargar archivos normalmente en QEMU.
Una mejor solución sería montarlo
/etc
en el entorno QEMU; Sin embargo, no estoy seguro de si otros archivos se verán afectados en este proceso. Así que decidí usar esta solución fea pero fácil.fuente
Este parece un lugar tan bueno como cualquier otro para documentar otra posible razón para el infame mensaje de error PKIX. Después de pasar demasiado tiempo mirando el contenido del almacén de claves y del almacén de confianza y varias configuraciones de instalación de Java, me di cuenta de que mi problema se había reducido a ... un error tipográfico.
El error tipográfico significaba que también estaba usando el almacén de claves como el almacén de confianza. Como la CA raíz de mi empresa no se definió como un certificado independiente en el almacén de claves, sino solo como parte de una cadena de certificados, y no se definió en ningún otro lugar (es decir, cacerts) seguí recibiendo el error PKIX.
Después de un lanzamiento fallido (esta es la configuración de prod, estuvo bien en otro lugar) y dos días de rascarse la cabeza finalmente vi el error tipográfico, y ahora todo está bien.
Espero que esto ayude a alguien.
fuente
agregue esto a su código:
fuente