Resolviendo javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Error en la construcción de la ruta PKIX ¿Error?

Editar: Traté de formatear la pregunta y acepté la respuesta de una manera más presentable en mi blog.

Aquí está el número original.

Estoy recibiendo este error:

mensaje detallado sun.security.validator.ValidatorException: Error en la construcción de la ruta PKIX:
sun.security.provider.certpath.SunCertPathBuilderException: no se puede encontrar una ruta de certificación válida para el objetivo solicitado

causa javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: error en la construcción de la ruta PKIX: sun.security.provider.certpath.SunCertPathBuilderException: no se puede 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. Diga App1 (puerto 8443) y App2 (puerto 443). App1 se conecta a App2. Cuando App1 se conecta a App2, aparece el error anterior. Sé que este es un error muy común, así que encontré muchas soluciones en diferentes foros y sitios. Tengo la siguiente entrada en server.xml de ambos Tomcats:

keystoreFile="c:/.keystore" 
keystorePass="changeit"

Todos los sitios dicen la misma razón por la que el certificado proporcionado por app2 no está en la tienda confiable de app1 jvm. Esto parece ser cierto también cuando intenté acceder a 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 en este sitio web). Pero cuando el cliente Java accede a la misma URL (en mi caso), aparece el error anterior. Entonces, 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

Resultado

Pero nada funcionó.

Lo que finalmente funcionó está ejecutando el enfoque de 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é los tres enfoques mencionados anteriormente no funcionaron cuando mencioné los mismos valores en server.xml del servidor App2 y los mismos valores en el almacén de confianza configurando

System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

en el programa App1.

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());

preguntado el 08 de marzo de 12 a las 14:03

posible duplicado de HttpClient y SSL -

Por extraño que parezca, recibí este error al comunicarme entre servidores agrupados que no tenían problemas de SSL individualmente. Una vez que configuré correctamente domainname en mis servidores RHEL, el problema desapareció. Espero que ayude a alguien. -

Otra cosa que debe verificar es que tiene la última versión de Java; recibí un error similar debido a esto. -

stackoverflow.com/questions/2893819/… - también relevante y una respuesta fantástica. -

En primer lugar, importe su archivo crt en {JAVA_HOME} / jre / security / cacerts, si aún se enfrenta a esta excepción, cambie su versión jdk. Por ejemplo, de jdk1.8.0_17 a jdk1.8.0_231 -

30 Respuestas

Necesita agregar el certificado para App2 al archivo de almacén de confianza del utilizado JVM situado 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 es necesario que proporcione 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>

Ejemplo:

keytool -import -noprompt -trustcacerts -alias myFancyAlias -file /path/to/my/cert/myCert.cer -keystore /path/to/my/jdk/jre/lib/security/cacerts/keystore.jks -storepass changeit

Después de la importación, puede ejecutar el primer comando nuevamente para verificar si se agregó su certificado.

Se puede encontrar información de Sun / Oracle aquí.

respondido 16 nov., 21:16

Tendrá que usar la ruta completa, por ejemplo, c: \ java \ jdk \ lib \ security \ cacerts - SimonSez

Como dijo SimonSez, no necesita una contraseña, pero si la desea, la contraseña predeterminada es "changeit". - Felix

Además, en Windows debe ejecutar el terminal como administrador, de lo contrario obtendrá el error keytool error: java.io.FileNotFoundException ... (Access is denied) cuando intenta importar su certificado. - Felix

Ah @SimonSez eres mi dios. Pero para agregarlo, uno debe especificar la ubicación y la contraseña de la tienda de confianza como lo menciona @M Sach para que funcione. - BrotesNanKis

Continuó teniendo problemas con Java 1.8. Es necesario agregar el certificado como se describe y usar Java <1.8 - Tom Howard

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: error en la construcción de la ruta PKIX: sun.security.provider.certpath.SunCertPathBuilderException: no se puede encontrar la ruta de certificación válida para el destino solicitado

• Cuando recibí el error, intenté buscar en Google el significado de la expresión y encontré que este problema ocurre cuando un servidor cambia su certificado HTTPS SSL 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 Base64 (.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 niegue a reconocer la URL. A este respecto, debo mencionar que busqué en Google que la información del certificado raíz permanece de forma predeterminada en el JDK \ jre \ lib \ seguridad ubicación, y la contraseña predeterminada para acceder es: cambialo.

Para ver la información de los 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).

• Ir a tu Java/jreX/bin directorio

• Escriba lo siguiente

keytool -list -keystore D:\Java\jdk1.5.0_12\jre\lib\security\cacerts

Proporciona la lista de los certificados actuales contenidos en el almacén de claves. Se parece a esto:

C:\Documents and Settings\NeelanjanaG>keytool -list -keystore D:\Java\jdk1.5.0_12\jre\lib\security\cacerts

Enter keystore password:  changeit

Keystore type: jks

Keystore provider: SUN

Your keystore contains 44 entries

verisignclass3g2ca, Mar 26, 2004, trustedCertEntry,

Certificate fingerprint (MD5): A2:33:9B:4C:74:78:73:D4:6C:E7:C1:F3:8D:CB:5C:E9

entrustclientca, Jan 9, 2003, trustedCertEntry,

Certificate fingerprint (MD5): 0C:41:2F:13:5B:A0:54:F5:96:66:2D:7E:CD:0E:03:F4

thawtepersonalbasicca, Feb 13, 1999, trustedCertEntry,

Certificate fingerprint (MD5): E6:0B:D2:C9:CA:2D:88:DB:1A:71:0E:4B:78:EB:02:41

addtrustclass1ca, May 1, 2006, trustedCertEntry,

Certificate fingerprint (MD5): 1E:42:95:02:33:92:6B:B9:5F:C0:7F:DA:D6:B2:4B:FC

verisignclass2g3ca, Mar 26, 2004, trustedCertEntry,

Certificate fingerprint (MD5): F8:BE:C4:63:22:C9:A8:46:74:8B:B8:1D:1E:4A:2B:F6

• Ahora tenía que incluir el certificado previamente instalado en los cacerts.

• Para ello el siguiente es el procedimiento:

keytool -import -noprompt -trustcacerts -alias ALIASNAME -file FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass PASSWORD

Si está utilizando Java 7:

keytool -importcert -trustcacerts -alias ALIASNAME -file PATH_TO_FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass changeit

• Luego agregará la información del certificado en el archivo cacert.

¡Es la solución que encontré para la excepción mencionada anteriormente!

respondido 18 nov., 21:08

¿Qué haces cuando caduca el certificado? ¿Repetir todo (anualmente)? - ggkmath

¿Hay alguna forma de hacer esto mediante programación? - moomoohk

Para las personas que se enfrentan al error de PKIX, "La ruta no se encadena con ninguno de los anclajes de confianza", esta solución no me solucionó ese problema, desafortunadamente. - IcedDante

Una pregunta: ¿El aliasName es la dirección web para la que estamos importando el certificado? Por ejemplo, si la URL es dominio.site.com/pages/service.asmx entonces, ¿debería ser el alias domain.site.com o la URL completa (domain.site.com/pages/service.asmx) o también debería tener el prefijo http: // o es solo un nombre arbitrario? - nanosoft

ruta: \ lib \ security> keytool -import -noprompt -trustcacerts -alias webCert -file webCertResource.cer -keystore c: / Users / Jackie / Desktop -storepass changeit Me sale "el sistema no puede encontrar el archivo especificado" - Jesse

Cómo trabajarlo en Tomcat 7

Quería admitir un certificado autofirmado en una aplicación Tomcat, pero el siguiente fragmento no funcionó

import java.io.DataOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HTTPSPlayground {
    public static void main(String[] args) throws Exception {

        URL url = new URL("https:// ... .com");
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
        httpURLConnection.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream());

        String serializedMessage = "{}";
        wr.writeBytes(serializedMessage);
        wr.flush();
        wr.close();

        int responseCode = httpURLConnection.getResponseCode();
        System.out.println(responseCode);
    }
}

esto es lo que resolvió mi problema:

1) Descargue el .crt presentar

echo -n | openssl s_client -connect <your domain>:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/<your domain>.crt
  • reemplazar <your domain> con su dominio (p. ej. jossef.com)

2) Aplicar el .crt archivo en Java cacerts tienda de certificados

keytool -import -v -trustcacerts -alias <your domain> -file ~/<your domain>.crt -keystore <JAVA HOME>/jre/lib/security/cacerts -keypass changeit -storepass changeit
  • reemplazar <your domain> con su dominio (p. ej. jossef.com)
  • reemplazar <JAVA HOME> con su directorio de inicio de Java

3) Hackearlo

Aunque instalé mi certificado en Javaalmacenes de certificados predeterminados, Tomcat ignora eso (parece que no está configurado para usar los almacenes de certificados predeterminados de Java).

Para piratear esto, agregue lo siguiente en algún lugar de su código:

String certificatesTrustStorePath = "<JAVA HOME>/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);

// ...

Respondido el 20 de junio de 20 a las 10:06

El paso 2 me ayudó con SpringBoot y Tomcat 7. Gracias. - tim perry

¿Tengo que usar keytool de java que usa tomcat? Porque en un servidor puedo tener muchos java - vikifor

@vikifor sí. También puede ejecutarlo para todos los directorios de Java instalados en su sistema: Jossef Harush

¡Esto funcionó! ¡Muchas gracias @JossefHarush por una respuesta tan útil! - Tom Taylor

mi problema se resolvió después de agregar el segmento de código de @Jossef Harush en mi código. - Chamod Pathirana

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 de JVM resolvió el problema: -Dcom.sun.security.enableAIAcaIssuers=true

El soporte para el método de acceso de emisores de la extensión de Acceso a la información de la autoridad está disponible. Está deshabilitado de forma predeterminada por compatibilidad y se puede habilitar configurando la propiedad del sistema com.sun.security.enableAIAcaIssuers al valor verdadero.

Si se establece en verdadero, la implementación PKIX de Sun de CertPathBuilder utiliza la información en la extensión AIA de un certificado (además de CertStores que se especifican) para encontrar el certificado de CA emisor, siempre que sea un URI de tipo ldap, http o ftp.

Fuente

Respondido el 20 de junio de 20 a las 10:06

Otra razón podría ser una versión desactualizada de JDK. Estaba usando jdk versión 1.8.0_60, simplemente actualizando a la última versión resolvió el problema del certificado.

Respondido el 23 de diciembre de 17 a las 13:12

Yo también tuve el mismo problema. Es posible que llamar a una API con un certificado Lets Encrypt no funcione con versiones anteriores de Java porque no lo reconocen las autoridades de certificación raíz de confianza. La actualización de Java solucionará este problema. - hertg

Es posible deshabilitar la verificación SSL mediante programación. Funciona en un apuro para desarrolladores, pero no se recomienda para producción, ya que querrá usar la verificación SSL "real" allí o instalar y usar sus propias claves confiables y luego seguir usando la verificación SSL "real".

El siguiente código funciona para mí:

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

public class TrustAnyTrustManager implements X509TrustManager {

  public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  }

  public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  }

  public X509Certificate[] getAcceptedIssuers() {
    return null;
  }
}

             HttpsURLConnection conn = null;
             URL url = new URL(serviceUrl);
             conn = (HttpsURLConnection) url.openConnection();
             SSLContext sc = SSLContext.getInstance("SSL");  
             sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());  
                    // Create all-trusting host name verifier
             HostnameVerifier allHostsValid = new HostnameVerifier() {
               public boolean verify(String hostname, SSLSession session) {
                return true;
              }
            };
            conn.setHostnameVerifier(allHostsValid);

O si no controlas el Connections debajo, también puede anular la verificación SSL globalmente para todas las conexiones https://stackoverflow.com/a/19542614/32453

Si está utilizando Apache HTTPClient, debe deshabilitarlo "de manera diferente" (lamentablemente): https://stackoverflow.com/a/2703233/32453

Respondido 23 Feb 21, 18:02

Este código es totalmente inseguro y no debe utilizarse. - user207421

@ user207421 ¿Por qué es inseguro? Qué está sucediendo en el código brevemente. - Govinda Sakhare

Esto es omitir todas las validaciones de certificados, básicamente está permitiendo que se acepte cualquier certificado. La forma en que funcionan los certificados es que hay un certificado raíz (literalmente) protegido físicamente, en varias autoridades certificadoras. Este certificado se utiliza luego para emitir otros certificados secundarios, que se pueden validar hasta la autoridad certificadora raíz. Esto es omitir todas las comprobaciones anteriores, lo que significa que puedo enviar cualquier certificado SSL (incluso autogenerado) y su aplicación lo aceptará como seguro, aunque mi identidad como URL no esté verificada. - Scott Taylor

Estaba usando jdk1.8.0_171 cuando me enfrenté al mismo problema. Probé 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 a 1.8.0_181 Y funcionó como un encanto.

Respondido 25 Jul 18, 04:07

Mi archivo cacerts estaba totalmente vacío. Resolví esto copiando el archivo cacerts de mi máquina con Windows (que usa Oracle Java 7) y lo puse en mi caja de Linux (OpenJDK).

cd %JAVA_HOME%/jre/lib/security/
scp cacerts mylinuxmachin:/tmp

y luego en la máquina linux

cp /tmp/cacerts /etc/ssl/certs/java/cacerts

Ha funcionado muy bien hasta ahora.

Respondido 26 Jul 13, 21:07

Esto funciona de maravilla si el problema es que está utilizando una versión anterior de Java que no tiene los certificados más recientes. - atripati

@atripathi ¿qué tal una Mac? - iOSAndroidWindowsMobileAppsDev

Había algo muy mal con la instalación de Java si el archivo cacerts estaba vacío. Deberías haberlo reinstalado todo. - user207421

Quizás, pero esta solución funcionó y nada salió mal después. - ryan shillington

Usando Tomcat 7 en Linux, esto funcionó.

String certificatesTrustStorePath = "/etc/alternatives/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Bajo Linux, $JAVA_HOME no siempre está configurado, pero por lo general /etc/alternatives/jre puntos a $JAVA_HOME/jre

Respondido el 06 de diciembre de 17 a las 16:12

Para mí, este error también apareció al intentar conectarme a un proceso detrás de un proxy inverso NGINX que estaba manejando el SSL.

Resultó que el problema era un certificado sin toda la cadena de certificados concatenada. Cuando agregué certificados intermedios, el problema se resolvió.

Espero que esto ayude.

Respondido 23 Abr '17, 15:04

eso parece lo que estoy teniendo. ¿Puede explicar cómo agregó los certificados intermedios y dónde. Estoy usando httpd revers proxy y no NGINX. - asaf magén

esto me ayudó en mi caso porque estoy usando httpd: access.redhat.com/solutions/43575 - asaf magén

Con nginx, solo usa archivos .key y .pem para la configuración SSL. Primero convierte .crt a .pem (simplemente: cp yourfile.crt yourfile.pem) y luego para la cadena de certificados SSL: agrega el archivo .cer al último de .pem (cat yourfile.cer >> yourfile.pem) - El Anh Nguyen

SOLUCIÓN DESPLEGABLE (Alpine Linux)

Para poder solucionar este problema en nuestros entornos de aplicación, hemos preparado los siguientes comandos de terminal de Linux:

cd ~

Generará un archivo de certificado en el directorio de inicio.

apk add openssl

Este comando instala openssl en alpine Linux. Puede encontrar los comandos adecuados para otras distribuciones de Linux.

openssl s_client -connect <host-dns-ssl-belongs> < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > public.crt

Se generó el archivo de certificado necesario.

sudo $JAVA_HOME/bin/keytool -import -alias server_name -keystore $JAVA_HOME/lib/security/cacerts -file public.crt -storepass changeit -noprompt

Se aplicó el archivo generado al JRE con el programa 'keytool'.

Nota: Reemplace su DNS con <host-dns-ssl-belongs>

Note2: Por favor, tenga en cuenta que -noprompt no solicitará el mensaje de verificación (sí / no) y -storepass changeit El parámetro desactivará la solicitud de contraseña y proporcionará la contraseña necesaria (la predeterminada es 'changeit'). Estas dos propiedades le permitirán usar esos scripts en los entornos de su aplicación, como construir una imagen de Docker.

Note3 Si está implementando su aplicación a través de Docker, puede generar el archivo secreto una vez y colocarlo en los archivos del proyecto de su aplicación. No necesitará generarlo una y otra vez.

Respondido 10 Feb 20, 10:02

Escribí un pequeño script de win32 (WinXP 32bit testet) estúpido cmd (línea de comandos) que busca todas las versiones de Java en archivos de programa y les agrega un certificado. La contraseña debe ser la predeterminada "changeit" o cámbiela usted mismo en el script :-)

@echo off

for /F  %%d in ('dir /B %ProgramFiles%\java') do (
    %ProgramFiles%\Java\%%d\bin\keytool.exe -import -noprompt -trustcacerts -file some-exported-cert-saved-as.crt -keystore %ProgramFiles%\Java\%%d\lib\security\cacerts -storepass changeit
)

pause

Respondido el 06 de diciembre de 12 a las 15:12

por seguridad, no debemos utilizar certificados autofirmados en nuestra implementación. Sin embargo, cuando se trata de desarrollo, a menudo tenemos que usar entornos de prueba que tienen certificados autofirmados. Intenté solucionar este problema mediante programación en mi código y fallé. Sin embargo, al agregar el certificado a jre trust-store, solucioné mi problema. Encuentre los pasos a continuación,

  1. Descargue el certificado del sitio,

  2. Copie el certificado (por ejemplo: cert_file.cer) en el directorio $ JAVA_HOME \ Jre \ Lib \ Security

  3. Abra CMD en Administrador y cambie el directorio a $ JAVA_HOME \ Jre \ Lib \ Security

  4. Importe el certificado a un almacén de confianza usando el siguiente comando,

keytool -importación -alias ca -archivo archivo_cert.cer -keystore cacerts -storepass changeit

Si tiene un error que dice que keytool no es reconocible, por favor refiera esto.

Tipo si como abajo

Confíe en este certificado: [Sí]

  1. Ahora intente ejecutar su código o acceder a la URL mediante programación usando java.

Noticias

Si su servidor de aplicaciones es jboss, intente agregar la propiedad del sistema a continuación

System.setProperty("org.jboss.security.ignoreHttpsHost","true");

¡Espero que esto ayude!

respondido 06 mar '19, 02:03

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:

  1. Vaya a la URL (p. Ej. https://localhost:8443/yourpath) donde la certificación no está funcionando.
  2. Exporta la certificación como se describe en la publicación mencionada.
  3. En su máquina con Windows, abra: Manage computer certificates
  4. Utilice la herramienta Trusted Root Certification Authorities -> Certificates
  5. Importa aquí tu your_certification_name.cer archivo.

respondido 28 nov., 19:11

Este parece un lugar tan bueno como cualquier otro para documentar otra posible razón del infame mensaje de error de PKIX. Después de pasar demasiado tiempo mirando el almacén de claves y el contenido del almacén de confianza y varias configuraciones de instalación de Java, me di cuenta de que mi problema se debía a ... un error tipográfico.

El error tipográfico significaba que también estaba usando el almacén de claves como 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 (esto es prod config, estaba bien en otros lugares) 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.

contestado el 19 de mayo de 20 a las 16:05

Para MacOS X a continuación, el comando exacto funcionó para mí, donde tuve que probar con doble hypen en la opción 'importcert' que funcionó:

sudo keytool -–importcert -file /PathTo/YourCertFileDownloadedFromBrowserLockIcon.crt -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre/lib/security/cacerts -alias "Cert" -storepass changeit

contestado el 13 de mayo de 19 a las 10:05

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.

Respondido 10 Feb 17, 14:02

Lo mismo para mi. Una actualización de Java 1.8.0_91 a 1.8.0_121 resolvió el problema. Obtuve la excepción al usar Apache HTTPClient. - Devabc

Todavía tengo este problema al usar la autenticación Oauth2 - Sofiane

Quiero intervenir ya que tengo un entorno QEMU donde tengo que descargar archivos en java. Resulta que el /etc/ssl/certs/java/cacerts en QEMU tiene un problema porque no coincide con el /etc/ssl/certs/java/cacerts en el entorno de acogida. 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 a los archivos primero. 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 tienes 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 de host a la cárcel chroot de QEMU, y luego Java podría descargar los archivos normalmente en QEMU.

Una mejor solución sería montar el /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.

respondido 30 mar '20, 07:03

Mis dos centavos: En mi caso, cacerts no era una carpeta, sino un archivo, y también estaba presente en dos rutas. Después de descubrirlo, el error desapareció después de copiar el archivo .jks sobre ese archivo.

# locate cacerts    
/usr/java/jdk1.8.0_221-amd64/jre/lib/security/cacerts
/usr/java/jre1.8.0_221-amd64/lib/security/cacerts

Después de hacer una copia de seguridad de ellos, copio el .jks.

cp /path_of_jks_file/file.jks /usr/java/jdk1.8.0_221-amd64/jre/lib/security/cacerts
cp /path_of_jks_file/file.jks /usr/java/jre1.8.0_221-amd64/lib/security/cacerts

Nota: este truco básico resuelve este error en un proyecto Genexus, a pesar de que file.jks también está en el archivo server.xml del Tomcat.

Respondido el 03 de diciembre de 20 a las 13:12

Estoy usando flutter y recibí este error de la nada. Entonces, lo que básicamente sucede es que las líneas dentro de sus dependencias dentro android/build.gradle archivo como:

  classpath 'com.android.tools.build:gradle:4.1.0'
  classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

Requiere certificación de que el archivo de calificación se descarga de Internet. Pero cuando hay algo que bloquea el gradle para descargar esos certificados, esto generalmente se muestra.

Intenté exportar el certificado y agregarlo manualmente, pero no pareció funcionar para mí. Lo que funcionó para mí, después de innumerables rasguños en la cabeza, fue deshabilitar los proxies de sus preferencias de red. En algún lugar se mencionó que deshabilitar Charles Proxy lo solucionaría, pero en ese momento, no tenía ni idea de qué era Charles y qué era el proxy. Y en mi caso, no tenía el proxy de Charles, así que continué buscando los proxies en la configuración de preferencias de red en Mac (se puede encontrar en algún lugar de la configuración de red para Windows). Tenía Socks habilitado dentro del proxy. ¡Lo desactivé y luego reconstruí el gradle y TA-DAH! Trabajó suave como la mantequilla.

Hay algunas cosas para recordar. Si crea su proyecto justo después de deshabilitar el proxy sin cerrar la pestaña de preferencias de red, la deshabilitación de proxies no funcionará y mostrará el mismo error. Además, si ya ha creado el proyecto y lo está ejecutando nuevamente después de deshabilitar los proxies, es probable que muestre el mismo error (podría deberse a las cachés IDE). Cómo funcionó para mí: reinicie la Mac, abra algunas pestañas en el navegador (para algunas llamadas de red), verifique las preferencias de red desde las preferencias del sistema >> wifi y deshabilite los proxies, cierre la aplicación de preferencias del sistema y compile el proyecto.

Respondido 21 Jul 21, 09:07

Para Tomcat que se ejecuta en el servidor Ubuntu, para averiguar qué Java se está utilizando, use el comando "ps -ef | grep tomcat":

Muestra:

/home/mcp01$ **ps -ef |grep tomcat**
tomcat7  28477     1  0 10:59 ?        00:00:18 **/usr/local/java/jdk1.7.0_15/bin/java** -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -Djava.awt.headless=true -Xmx512m -XX:+UseConcMarkSweepGC -Djava.net.preferIPv4Stack=true -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp org.apache.catalina.startup.Bootstrap start
1005     28567 28131  0 11:34 pts/1    00:00:00 grep --color=auto tomcat

Entonces, podemos entrar a: cd /usr/local/java/jdk1.7.0_15/jre/lib/seguridad

Predeterminado cacerts archivo se encuentra aquí. Inserte el certificado que no es de confianza en él.

Respondido 21 Abr '15, 09:04

  • Asegúrese de la ubicación de su JVM. Puede haber media docena de JRE en su sistema. ¿Cuál está usando realmente tu Tomcat? En cualquier lugar dentro del código que se ejecuta en su Tomcat, escriba println (System.getProperty ("java.home")). Tenga en cuenta esta ubicación. En El archivo / lib / security / cacerts son los certificados que utiliza su Tomcat.
  • Busque el certificado raíz que falla. Esto se puede encontrar activando la depuración SSL usando -Djavax.net.debug = all. Ejecute su aplicación y observe desde la consola ssl los registros de la CA que está fallando. Su URL estará disponible. En mi caso, me sorprendió descubrir que un zscaler proxy era el que estaba fallando, ya que en realidad estaba procesando mis llamadas y devolviendo su propio certificado de CA.
  • Pegue la URL en el navegador. El certificado se descargará.
  • Importe este certificado a cacerts usando keytool import.

Respondido el 04 de enero de 21 a las 01:01

Me encontré con este problema mientras hacía llamadas REST desde mi servidor de aplicaciones que se ejecuta en AWS EC2. Los siguientes pasos me solucionaron el problema.

  1. curl -vs https: // your_rest_path
  2. echo | openssl s_client -conecta tu_dominio: 443
  3. sudo apt-get install ca -ificates

curl -vs https: // ¡your_rest_path ahora funcionará!

Respondido el 14 de enero de 21 a las 17:01

También tengo el mismo problema en Apache Tomcat / 7.0.67 y Java JVM Version: 1.8.0_66-b18. Con la actualización de Java a JRE 1.8.0_241 y parece que el problema se resolvió.

respondido 20 mar '21, 18:03

Si está utilizando JDK 11, la carpeta ya no tiene JRE. La ubicación de los certificados es jdk-11.0.11 / lib / security / cacerts.

Respondido el 08 de junio de 21 a las 00:06

Para OkHttpClient, esta solución funcionó para mí. Podría ayudar a alguien a usar la biblioteca ...

try {

            String proxyHost = "proxy_host";
            String proxyUsername = "proxy_username";
            String proxyPassword = "proxy_password";

            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, "port goes here"));

            // Create a trust manager that does not validate certificate chains
            TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[]{};
                    }
                    @Override
                    public void checkClientTrusted(
                            java.security.cert.X509Certificate[] certs, String authType) {
                    }
                    @Override
                    public void checkServerTrusted(
                            java.security.cert.X509Certificate[] certs, String authType) {
                    }
                }
            };

            // Install the all-trusting trust manager
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
            // Create an ssl socket factory with our all-trusting manager
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient client = new OkHttpClient().newBuilder()
                    .sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0])
                    .hostnameVerifier((hostname, session) -> true)
                    .connectTimeout(timeout, TimeUnit.SECONDS)
                    .proxy(proxy)
                    .proxyAuthenticator((route, response) -> {
                        String credential = Credentials.basic(proxyUsername, proxyPassword);
                        return response.request().newBuilder()
                                .header("Proxy-Authorization", credential)
                                .build();
                    })
                    .build();

            MediaType mediaType = MediaType.parse("application/json");
            RequestBody requestBody = RequestBody.create(payload, mediaType);

            Request request = new Request.Builder()
                    .url(url)
                    .header("Authorization", "authorization data goes here")
                    .method(requestMethod, requestBody)
                    .build();

            Response response = client.newCall(request).execute();

            resBody = response.body().string();

            int responseCode = response.code();

        } catch (Exception ex) {
        }

respondido 15 nov., 21:12

Tenía este problema con Android Studio cuando estaba detrás de un proxy. Estaba usando Crashlytics que intenta cargar el archivo de mapeo durante una compilación.

Agregué el certificado de 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

Respondido 08 Oct 19, 09:10

Solo un pequeño truco. Actualice la URL en el archivo "hudson.model.UpdateCenter.xml" de https a http

<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>http://updates.jenkins.io/update-center.json</url>
  </site>
</sites>

Respondido el 30 de diciembre de 19 a las 15:12

Tenga cuidado con la gran respuesta para @NDeveloper. Copiar y pegar, por supuesto, cambiar los valores y estaba obteniendo

Illegal option:  ?import

Verifiqué los guiones y vi que en esa respuesta estaba el guión usando el ASCII

– 8211

Si tiene problemas, compruebe que el código ASCII que me sirvió fue este código = 45

- 45

Mi código

keytool -import -noprompt -trustcacerts -alias Certificado -file "C:\Users\JavIut\Desktop\Company\Certificados\Certificado.cer" -keystore "C:\Program Files\Java\jdk1.8.0_121\jre\lib\security\cacerts"

Respondido 28 ago 21, 11:08

En caso de necesidad, puede deshabilitar SSL por completo o por conexión (tenga en cuenta que esto no se recomienda para producción) consulte https://stackoverflow.com/a/19542614/32453

Respondido 22 Feb 21, 16:02

Las respuestas de solo código generalmente están mal vistas en este sitio. ¿Podría editar su respuesta para incluir algunos comentarios o una explicación de su código? Las explicaciones deben responder preguntas como: ¿Qué hace? ¿Cómo lo hace? ¿A dónde va? ¿Cómo resuelve el problema de OP? - mipetlion

agrega esto a tu código No. No agregue esto a su código. La creación de un SSLContext de esta manera elimina todos los controles de seguridad que verifican la identidad del servidor al que se está conectando. La respuesta al problema de perder sus llaves es NO para eliminar todas las cerraduras de todo lo que posee. - andres henle

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.