"Falló la construcción de la ruta PKIX" y "no se pudo encontrar la ruta de certificación válida para el objetivo solicitado"

423

Estoy tratando de obtener tweets usando la biblioteca twitter4j para mi proyecto java. En mi primera ejecución recibí un error sobre el certificado sun.security.validator.ValidatorExceptiony sun.security.provider.certpath.SunCertPathBuilderException. Luego agregué el certificado de Twitter por:

C:\Program Files\Java\jdk1.7.0_45\jre\lib\security>keytool -importcert -trustcacerts -file PathToCert -alias ca_alias -keystore "C:\Program Files\Java\jdk1.7.0_45\jre\lib\security\cacerts"

Pero sin éxito. Aquí está el procedimiento para obtener tweets:

public static void main(String[] args) throws TwitterException {
    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb.setDebugEnabled(true)
        .setOAuthConsumerKey("myConsumerKey")
        .setOAuthConsumerSecret("myConsumerSecret")
        .setOAuthAccessToken("myAccessToken")
        .setOAuthAccessTokenSecret("myAccessTokenSecret");

    TwitterFactory tf = new TwitterFactory(cb.build());
    Twitter twitter = tf.getInstance();

    try {
        Query query = new Query("iphone");
        QueryResult result;
        result = twitter.search(query);
        System.out.println("Total amount of tweets: " + result.getTweets().size());
        List<Status> tweets = result.getTweets();

        for (Status tweet : tweets) {
            System.out.println("@" + tweet.getUser().getScreenName() + " : " + tweet.getText());
        }
    } catch (TwitterException te) {
        te.printStackTrace();
        System.out.println("Failed to search tweets: " + te.getMessage());
    }

Y aquí está el error:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Relevant discussions can be found on the Internet at:
    http://www.google.co.jp/search?q=d35baff5 or
    http://www.google.co.jp/search?q=1446302e
TwitterException{exceptionCode=[d35baff5-1446302e 43208640-747fd158 43208640-747fd158 43208640-747fd158], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.5}
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177)
    at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
    at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:81)
    at twitter4j.TwitterImpl.get(TwitterImpl.java:1929)
    at twitter4j.TwitterImpl.search(TwitterImpl.java:306)
    at jku.cc.servlets.TweetsAnalyzer.main(TweetsAnalyzer.java:38)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
    at sun.security.ssl.Handshaker.processLoop(Unknown Source)
    at sun.security.ssl.Handshaker.process_record(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.HttpURLConnection.getResponseCode(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
    at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:34)
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:141)
    ... 5 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
    at sun.security.validator.Validator.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    ... 20 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
    at java.security.cert.CertPathBuilder.build(Unknown Source)
    ... 26 more
Failed to search tweets: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Docena
fuente
66
Hola, compruebe la URL a continuación. Estoy seguro de que esto te ayudará. java-samples.com/showtutorial.php?tutorialid=210 confluence.atlassian.com/display/JIRAKB/… . Debe agregar su certificado SSL al certificado de Java Truststore (Ruta: jre / lib / security / cacerts).
sus007
Consulte esta respuesta para obtener la solución y confirme que está empaquetando su software como paquete integrado. en caso afirmativo, copie su sistema de formulario de archivo cacerts y reemplace ese archivo jre cacerts empaquetado.
positivecrux el
intente esto stackoverflow.com/a/9210661/4741746 puede ser esta su respuesta
sushant gosavi
2
Acabo de usar este código Java y para https no olvides especificar el puerto como 443. Código Java en github.com/escline/InstallCert/blob/master/InstallCert.java Tomará tu archivo CACERTS y agregará todos esos más El certificado actual de la URL que proporcione como entrada. En mi caso, codifiqué los valores para host = "mywebservice.uat.xyz.com"; puerto = 443; frase de contraseña = "changeit" .toCharArray (); Luego, el programa crea un nuevo archivo llamado "jssecacerts" que tendrá todo. Cambie el nombre de esto a "cacerts" y use esto. Estarás todo listo.
Reddymails

Respuestas:

575
  1. Vaya a URL en su navegador:
    • firefox: haga clic en la cadena de certificados HTTPS (el icono de candado al lado de la dirección URL). Haga clic "more info" > "security" > "show certificate" > "details" > "export..". Elija el nombre y elija el tipo de archivo example.cer
    • Chrome: haga clic en el icono del sitio que se encuentra a la izquierda en la barra de direcciones, seleccione "Certificado" -> "Detalles" -> "Exportar" y guárdelo en formato "Binario codificado en Der, certificado único".
  2. Ahora tiene un archivo con el almacén de claves y debe agregarlo a su JVM. Determinar la ubicación de los archivos cacerts, por ejemplo. C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.

  3. Luego importe el example.cerarchivo en cacerts en la línea de comando:

keytool -import -alias example -keystore C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts -file example.cer

Se le pedirá una contraseña cuyo valor predeterminado es changeit

Reinicie su JVM / PC.

fuente: http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html

MagGGG
fuente
27
Tuve que poner el camino entre comillas y también guardarlo como Base64 en lugar de DER
Theodore K.
3
wow..ha funcionado como una magia por cierto en Chrome solo tienes que hacer clic en el ícono de candado en la barra de direcciones izquierda, y luego hacer clic en detalles además de que no es necesario reiniciar
como el
8
Tenga en cuenta que las instrucciones deben repetirse para todos los certificados de la cadena. Además, el aliasnombre del certificado en la línea de comando debe ser único.
Lu55
55
Si su hogar es un JDK, asegúrese de especificar que jre se encuentra dentro de eso: keytool -import -alias example -keystore "C: \ Program Files \ Java \ jdk1.8.0_73 \ jre \ lib \ security \ cacerts" -file example.cer
Jack BeNimble
12
Para cualquier persona que obtenga un error de "acceso denegado", asegúrese de estar ejecutando el símbolo del sistema como administrador.
Walker Christie
81

Después de muchas horas tratando de crear archivos cert para que mi instalación de Java 6 funcione con los nuevos certificados de twitter, finalmente me topé con una solución increíblemente simple enterrada en un comentario en uno de los paneles de mensajes. Simplemente copie el archivo cacerts de una instalación de Java 7 y sobrescriba el de su instalación de Java 6. Probablemente sea mejor hacer una copia de seguridad del archivo cacerts primero, pero luego simplemente copie el nuevo y ¡BOOM! Simplemente funciona.

Tenga en cuenta que en realidad copié un archivo de Windows Cacerts en una instalación de Linux y funcionó bien.

El archivo se encuentra en jre/lib/security/cacertslas antiguas y nuevas instalaciones Java jdk.

Espero que esto le ahorre a alguien más horas de molestia.

Jeremy Goodell
fuente
44
Estoy tratando de acceder a un servidor SSL con un certificado autofirmado, intenté agregar su certificado usando keytool, pero no tuve suerte, ¿alguna sugerencia?
Oleg Belousov
1
Me alegro de que funcionó ... Pero, ¿sabes cuál fue la causa raíz? lo que lo hizo a fallar con Java 6 certs .. y cómo el Java 7 certs solucionó el problema
Vishwanath gowda k
Esto lo hizo, aunque pasé de icedtea 1.6 a Oracle 1.7. :)
nperson325681
Considere también esta solución: stackoverflow.com/questions/33439905/…
Piohen
10
Para aquellos que como yo a veces extrañamos lo obvio, asegúrate de que no lo hagas $JAVA_HOME/jre/lib, $JAVA_HOME/libpasé un poco de tiempo perdiendo ese detalle.
Ryan Heathcote
36

MI enfoque UI:

  1. Descargue el explorador de almacén de claves desde aquí
  2. Abra $ JAVA_HOME / jre / lib / security / cacerts
  3. ingrese PW: changeit (se puede cambiarme en Mac)
  4. Importa tu archivo .crt

Línea CMD:

  1. keytool -importcert -file jetty.crt -alias jetty -keystore $JAVA_HOME/jre/lib/security/cacerts
  2. ingrese PW: changeit(Puede cambiarse en Mac)
Mike Mitterer
fuente
1
En mac, con CMD-Line, debe usar sudo para ejecutar el comando. # sudo keytool -importcert -file jetty.crt -alias jetty -keystore $ JAVA_HOME / jre / lib / security / cacerts
malajisi
1
En Windows, el comando que funciona:keytool -importcert -file dinardap_cert.cer –alias dinardap –keystore “%JAVA_HOME%/jre/lib/security/cacerts”
Patricio Bonilla
¿De dónde obtener el archivo cert? No puedo decir a qué URL ir. jetty.com ?
kraftydevil
Obtuve mi certificado al exportarlo desde el navegador web, acción contextual en el candado
rtbf
28

Me he topado con este problema, que tardó muchas horas de investigación en solucionarse, especialmente con los certificados autogenerados, que a diferencia de los oficiales, son bastante complicados y a Java no le gustan mucho.

Por favor, consulte el siguiente enlace: Resolver problemas con certificados en Java

Básicamente, debe agregar el certificado del servidor a los certificados de Java Home.

  1. Genere u obtenga su certificado y configure Tomcat para usarlo en Servers.xml
  2. Descargue el código fuente Java de la clase InstallCerty ejecútelo mientras se ejecuta el servidor, proporcionando los siguientes argumentos server[:port]. No se necesita contraseña, ya que la contraseña original funciona para los certificados de Java ("changeit").
  3. El programa se conectará al servidor y Java lanzará una excepción, analizará el certificado proporcionado por el servidor y le permitirá crear un jssecertsarchivo dentro del directorio donde ejecutó el programa (si se ejecuta desde Eclipse, asegúrese de configurar el trabajo directorio en Run -> Configurations).
  4. Copie manualmente ese archivo a $JAVA_HOME/jre/lib/security

Después de seguir estos pasos, las conexiones con el certificado ya no generarán excepciones dentro de Java.

El siguiente código fuente es importante y desapareció de los blogs de Oracle (Sun), la única página que encontré estaba en el enlace proporcionado, por lo tanto, lo adjunto en la respuesta para cualquier referencia.

/*
 * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Sun Microsystems nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
/**
 * Originally from:
 * http://blogs.sun.com/andreas/resource/InstallCert.java
 * Use:
 * java InstallCert hostname
 * Example:
 *% java InstallCert ecc.fedora.redhat.com
 */

import javax.net.ssl.*;
import java.io.*;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

/**
 * Class used to add the server's certificate to the KeyStore
 * with your trusted certificates.
 */
public class InstallCert {

    public static void main(String[] args) throws Exception {
        String host;
        int port;
        char[] passphrase;
        if ((args.length == 1) || (args.length == 2)) {
            String[] c = args[0].split(":");
            host = c[0];
            port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
            String p = (args.length == 1) ? "changeit" : args[1];
            passphrase = p.toCharArray();
        } else {
            System.out.println("Usage: java InstallCert [:port] [passphrase]");
            return;
        }

        File file = new File("jssecacerts");
        if (file.isFile() == false) {
            char SEP = File.separatorChar;
            File dir = new File(System.getProperty("java.home") + SEP
                    + "lib" + SEP + "security");
            file = new File(dir, "jssecacerts");
            if (file.isFile() == false) {
                file = new File(dir, "cacerts");
            }
        }
        System.out.println("Loading KeyStore " + file + "...");
        InputStream in = new FileInputStream(file);
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        ks.load(in, passphrase);
        in.close();

        SSLContext context = SSLContext.getInstance("TLS");
        TrustManagerFactory tmf =
                TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(ks);
        X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
        SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
        context.init(null, new TrustManager[]{tm}, null);
        SSLSocketFactory factory = context.getSocketFactory();

        System.out.println("Opening connection to " + host + ":" + port + "...");
        SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
        socket.setSoTimeout(10000);
        try {
            System.out.println("Starting SSL handshake...");
            socket.startHandshake();
            socket.close();
            System.out.println();
            System.out.println("No errors, certificate is already trusted");
        } catch (SSLException e) {
            System.out.println();
            e.printStackTrace(System.out);
        }

        X509Certificate[] chain = tm.chain;
        if (chain == null) {
            System.out.println("Could not obtain server certificate chain");
            return;
        }

        BufferedReader reader =
                new BufferedReader(new InputStreamReader(System.in));

        System.out.println();
        System.out.println("Server sent " + chain.length + " certificate(s):");
        System.out.println();
        MessageDigest sha1 = MessageDigest.getInstance("SHA1");
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        for (int i = 0; i < chain.length; i++) {
            X509Certificate cert = chain[i];
            System.out.println
                    (" " + (i + 1) + " Subject " + cert.getSubjectDN());
            System.out.println("   Issuer  " + cert.getIssuerDN());
            sha1.update(cert.getEncoded());
            System.out.println("   sha1    " + toHexString(sha1.digest()));
            md5.update(cert.getEncoded());
            System.out.println("   md5     " + toHexString(md5.digest()));
            System.out.println();
        }

        System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
        String line = reader.readLine().trim();
        int k;
        try {
            k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
        } catch (NumberFormatException e) {
            System.out.println("KeyStore not changed");
            return;
        }

        X509Certificate cert = chain[k];
        String alias = host + "-" + (k + 1);
        ks.setCertificateEntry(alias, cert);

        OutputStream out = new FileOutputStream("jssecacerts");
        ks.store(out, passphrase);
        out.close();

        System.out.println();
        System.out.println(cert);
        System.out.println();
        System.out.println
                ("Added certificate to keystore 'jssecacerts' using alias '"
                        + alias + "'");
    }

    private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

    private static String toHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 3);
        for (int b : bytes) {
            b &= 0xff;
            sb.append(HEXDIGITS[b >> 4]);
            sb.append(HEXDIGITS[b & 15]);
            sb.append(' ');
        }
        return sb.toString();
    }

    private static class SavingTrustManager implements X509TrustManager {

        private final X509TrustManager tm;
        private X509Certificate[] chain;

        SavingTrustManager(X509TrustManager tm) {
            this.tm = tm;
        }

        public X509Certificate[] getAcceptedIssuers() {
            throw new UnsupportedOperationException();
        }

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

        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            this.chain = chain;
            tm.checkServerTrusted(chain, authType);
        }
    }
}
will824
fuente
2
Tenga en cuenta que el archivo creado es jssecacerts!
DeanDP
Intenté usar esta solución para Java 7 y 8. Mientras se ejecutaba en Java 7, obtuve protocol_version o handshake_failure para todas las URL de repositorio remoto con las que intenté. SandeepanNath:test sandeepan.nath$ java InstallCert repo1.maven.org:443 Loading KeyStore /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/security/cacerts... Opening connection to repo1.maven.org:443 ... Starting SSL handshake... javax.net.ssl.SSLException: Received fatal alert: protocol_version .. Could not obtain server certificate chain
Sandeepan Nath
20

1. Verifique el certificado

Intente cargar la URL de destino en el navegador y ver el certificado del sitio (generalmente se puede acceder mediante el icono con el signo de bloqueo. Está en el lado izquierdo o derecho de la barra de direcciones del navegador) ya sea que haya expirado o no sea de confianza por algún otro motivo.

2. Instale las últimas versiones de JRE y JDK

Las nuevas versiones generalmente vienen con el conjunto actualizado de los certificados de confianza.

Además, si es posible, desinstale las versiones anteriores. Esto hará explícitos los errores de configuración incorrecta.

3. Verifique su configuración:

  • Compruebe hacia dónde apunta su variable de entorno JAVA_HOME.
  • Compruebe qué versión de Java utiliza para ejecutar el programa. En IntelliJ verifique:
    • Archivo -> Estructura del proyecto ... -> Configuración del proyecto -> Proyecto -> Proyecto SDK:
    • Archivo -> Estructura del proyecto ... -> Configuración de la plataforma -> SDK

4. Copie todo el almacén de claves de la nueva versión de Java

Si desarrolla bajo el JDK que no sea el último disponible, intente reemplazar el %JAVA_HOME%/jre/lib/security/cacertsarchivo con el nuevo del último JRE instalado (haga una copia de seguridad primero) como sugiere @ jeremy-goodell en su respuesta

5. Agregue certificado (s) a su almacén de claves

Si nada de lo anterior resuelve su problema, use keytoolpara guardar los certificados en el almacén de claves de Java:

keytool -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit -importcert -alias <alias_name> -file <path_to_crt_file>

El archivo con el certificado se puede obtener del navegador como @MagGGG sugiere en su respuesta .

Nota 1: es posible que deba repetir esto para cada certificado de la cadena al certificado de su sitio. Comience desde la raíz.

Nota 2: <alias_name>debe ser única entre las claves de la tienda okeytool mostrará un error.

Para obtener una lista de todos los certificados en la tienda, puede ejecutar:

keytool -list -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit

En caso de que algo salga mal, esto lo ayudará a eliminar el certificado de la tienda:

keytool -delete -alias <alias_name> -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit
Lu55
fuente
Con lo bien elaborado que sea esto, debería ser la respuesta aceptada.
Egor Hans
13
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

Se utiliza para saltar la validación del certificado.

Advertencia ¡El uso solo con fines de desarrollo para esto no es seguro!

gorums
fuente
44
Se utiliza para saltar la validación del certificado
gorums el
2
@gorums ¿Cómo configurarlo en Eclipse?
malajisi
66
NO haga esto a menos que quiera arriesgarse a ejecutar código malicioso arbitrario en su máquina. Votado en contra ya que corre el riesgo de comprometer cualquier máquina que lo ejecute.
Bryan
1
El hecho de que "funcione" no significa que sea seguro, está poniendo en riesgo a todos los que siguen este consejo. Tengo mi voto negativo
Paradoxis
1
@AceKing El punto es que no es un código confiable si no valida el certificado. Dicho esto, creo que esta sigue siendo una respuesta útil. Las personas que lo hacen solo necesitan entender los riesgos.
Michael Mior
12

Tuve una situación ligeramente diferente, cuando JDK y JRE 1.8.0_112 estaban presentes en mi sistema.

Importé los nuevos certificados de CA para [JDK_FOLDER]\jre\lib\security\cacertsusar el comando ya conocido:

keytool -import -trustcacerts -keystore cacerts -alias <new_ca_alias> -file <path_to_ca_cert_file>

Aún así, seguí obteniendo el mismo error de construcción de ruta PKIX fallido .

Agregué información de depuración a la CLI de Java, usando java -Djavax.net.debug=all ... > debug.log. En el archivo debug.log, la línea que comienza con trustStore es: en realidad apunta al almacén de cacerts que se encuentra en[JRE_FOLDER]\lib\security\cacerts .

En mi caso, la solución fue copiar el archivo cacerts utilizado por JDK (que tenía las nuevas CA agregadas) sobre el utilizado por JRE y que solucionó el problema.

MF
fuente
Importé directamente los certificados que necesitaba en JRE / lib / security / cacerts usando keytool, pero no cambió nada para mí :( todavía obteniendo el mismo error, también los agregué a través del IDE, o incluso en el classpath y agregué un Bean a especificar la ubicación del almacén de claves !! Es una locura AF!
Alex
8

Antecedentes del problema:

Recibí el siguiente error cuando intento ejecutar mvn clean install en mi proyecto y a través de Netbeans IDE clean and build option. Este problema se debe a que el certificado no está disponible cuando lo descargamos a través de NET beans IDE / mediante el símbolo del sistema, pero podemos descargar los archivos a través del navegador.

Error :

Caused by: org.eclipse.aether.transfer.ArtifactTransferException: Could not transfer artifact com.java.project:product:jar:1.0.32 from/to repo-local (https://url/local-repo): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target  

Resolución:

1. Descargue el certificado de la URL en cuestión:

  • Inicie IE mediante "ejecutar como administrador" (de lo contrario, no podremos descargar el certificado)
  • Ingrese la url en IE-> https: // url / local-repo (en mi caso, esta url tenía un certificado no confiable ingrese la descripción de la imagen aquí).
  • Descargue el certificado haciendo clic en Error de certificado -> ver certificado
  • Seleccione la pestaña Detalles -> copiar en archivo -> siguiente -> seleccione "DER binario codificado X.509 (.CER)
  • guarde el certificado en alguna ubicación, por ejemplo: c: /user/sheldon/desktop/product.cer
  • Felicidades! ha descargado con éxito el certificado del sitio

2. Ahora instale el almacén de claves para solucionar el problema.

  • Ejecute el comando keytool para agregar el almacén de claves descargado al archivo de certificado existente.
  • Comando: debajo del comando en la carpeta bin de jdk (JAVA_HOME) .

C: \ Archivos de programa \ Java \ jdk1.8.0_141 \ jre \ bin> keytool -importcert -file "C: /user/sheldon/desktop/product.cer" -alias product -keystore "C: / Program Files / Java / jdk1.8.0_141 / jre / lib / security / cacerts ".

  • Se le pedirá que ingrese la contraseña. Ingrese la contraseña del almacén de claves: ingrese "changeit" nuevamente para "¿Confíe en este certificado? [No]:", ingrese "yes"

Ejemplo de comandos / salida de línea de comando:

keytool -importcert -file "C:/Users/sheldon/Desktop/product.cer" -alias product -keystore "C:/Program iles/Java/jdk1.8.0_141/jre/lib/security/cacerts"
Enter keystore password:
Trust this certificate? [no]:  yes
Certificate was added to keystore
  • Contgrats! ahora debería haberse librado del error "La construcción de ruta PKIX falló: sun.security.provider.certpath.SunCertPathBuilderException" en su IDE de Netbeans.
Barani r
fuente
Hola, seguí todos los pasos pero no
tuve
¿Tiene algún otro certificado en la ruta que no sean cacerts? si tiene algún otro, intente agregarlo a ese certificado
Barani r
Gracias @Barani r, fue mi error ejecutar un comando desde jre y usar JDK en mi eclipse
ManishNegi
No se pudo descargar el certificado pero después, "ejecutar como administrador", funcionó bien.
Otro codificador el
8

Quería importar un certificado para smtp.gmail.com

La única solución que funcionó para mí es 1. Ingrese el comando para ver este certificado

D: \ openssl \ bin \ openssl.exe s_client -connect smtp.gmail.com:465

  1. Copie y guarde las líneas entre "----- BEGIN CERTIFICATE -----" y "----- END CERTIFICATE -----" en un archivo, gmail.cer

  2. correr

    keytool -import -alias smtp.gmail.com -keystore "% JAVA_HOME% / jre / lib / security / cacerts" -file C: \ Users \ Admin \ Desktop \ gmail.cer

  3. Ingrese la contraseña chageit

  4. Haga clic en Sí para importar el certificado.

  5. Reiniciar java

ahora ejecuta el comando y listo

Sneha Shejwal
fuente
¡Gracias hombre! Eso me salvó el día. Esta fue la única solución adecuada en mi caso.
Andrew Gans
También me salvó el día. Gracias.
Kris
6

Esta no es una respuesta específica de Twitter, pero esta es la pregunta que surge cuando busca este error. Si su sistema recibe este error cuando se conecta a un sitio web que parece tener un certificado válido cuando se ve en un navegador web , eso probablemente significa que el sitio web tiene una cadena de certificados incompleta .

Para un breve resumen del problema: las autoridades de certificación no usan su certificado raíz para firmar cualquier certificado antiguo. En cambio, (generalmente) firman certificados intermedios que también tienen establecido el indicador de Autoridad de certificación (es decir, pueden firmar certificados). Luego, cuando compra un certificado de una CA, firman su CSR con uno de estos certificados intermedios.

Su tienda de confianza Java probablemente solo tenga el Root Cert, no los intermedios.

Un sitio mal configurado podría devolver solo su certificado firmado. Problema: se firmó con un certificado intermedio que no está en su tienda de confianza. Los navegadores manejarán este problema descargando o usando un certificado intermedio en caché; Esto maximiza la compatibilidad del sitio web. Java y herramientas como OpenSSL, sin embargo, no lo harán. Y eso causará el error en la pregunta.

Puede verificar esta sospecha utilizando la Prueba Qualys SSL . Si ejecuta eso contra un sitio y dice

La cadena de certificados de este servidor está incompleta.

entonces eso lo confirma. También puede ver esto mirando las rutas de certificación y viendo el texto Descarga adicional .

Cómo solucionarlo: el administrador del servidor necesita configurar el servidor web para que también devuelva los certificados intermedios. Para Comodo, por ejemplo, aquí es donde el .ca-bundlearchivo resulta útil. Por ejemplo, en una configuración de Apache con mod_ssl, usaría la SSLCertificateChainFileconfiguración. Para nginx, debe concatenar los certificados intermedios y el certificado firmado y usarlo en la configuración del certificado SSL. Puede encontrar más buscando "cadena de certificados incompleta" en línea.

Reid
fuente
Eres brillante. ¡Gracias! ¡Tuve un problema con la nueva compilación de mi servidor Java porque olvidé eliminar el # delante de SSLCertificateChainFile! Muy bien explicado.
KisnardOnline
6

La razón por la que obtenemos el error anterior es que JDK se incluye con muchos certificados de autoridad de certificación (CA) confiables en un archivo llamado 'cacerts', pero este archivo no tiene idea de nuestro certificado autofirmado. En otras palabras, el archivo cacerts no tiene nuestro certificado autofirmado importado y, por lo tanto, no lo trata como una entidad confiable y, por lo tanto, da el error anterior.

Cómo arreglar el error anterior

Para corregir el error anterior, todo lo que necesitamos es importar el certificado autofirmado en el archivo cacerts.

Primero, ubique el archivo cacerts. Tendremos que averiguar la ubicación de JDK. Si está ejecutando su aplicación a través de uno de los IDE como Eclipse o IntelliJ Idea, vaya a la configuración del proyecto y descubra cuál es la ubicación del JDK. Por ejemplo, en una Mac OS, la ubicación típica del archivo cacerts sería en esta ubicación / Library / Java / JavaVirtualMachines / {{JDK_version}} / Contents / Home / jre / lib / security en la máquina de Windows, estaría en {{Installation_directory} } / {{JDK_version}} / jre / lib / security

Una vez que haya localizado el archivo cacerts, ahora necesitamos importar nuestro certificado autofirmado a este archivo cacerts. Consulte el último artículo, si no sabe cómo generar el certificado autofirmado correctamente.

Si no tiene un archivo de certificado (.crt) y solo tiene un archivo .jks, puede generar un archivo .crt utilizando el siguiente comando. En caso de que ya tenga un archivo .crt / .pem, puede ignorar el siguiente comando

## Para generar el certificado del almacén de claves (archivo .jks) ####

keytool -export -keystore keystore.jks -alias selfsigned -file selfsigned.crt

El paso anterior generará un archivo llamado selfsigned.crt. Ahora importe el certificado a cacerts

Ahora agregue el certificado a JRE / lib / security / cacerts (trustore)
keytool -importcert -file selfsigned.crt -alias selfsigned -keystore {{cacerts path}}

por ej.

keytool -importcert -file selfsigned.nextgen.crt -alias selfsigned.nextgen -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts

Eso es todo, reinicie su aplicación y debería funcionar bien. Si aún no funciona y obtén una excepción de protocolo de enlace SSL. Probablemente significa que está utilizando un dominio diferente al registrado en el certificado.

El enlace con explicación detallada y resolución paso a paso está aquí.

Abhishek Galoda
fuente
4

Agregar cacertsno funcionó para mí. Después de habilitar el registro con la bandera -Djavax.net.debug=all, luego conocí la lectura de Java jssecacerts.

Importar a jssecacertstrabajado finalmente.

alk453
fuente
2
La explicación que falta aquí es que Java usará jssecacertssi está presente, de lo contrario cacerts.
Marqués de Lorne
3

Esta es una solución pero en forma de mi historia con este problema:

Estaba casi muerto probando toda la solución dada anteriormente (durante 3 días) y nada funcionó para mí.

Perdí toda esperanza.

Me puse en contacto con mi equipo de seguridad con respecto a esto porque estaba detrás de un proxy y me dijeron que habían actualizado recientemente su política de seguridad.

Los regañé mucho por no informar a los Desarrolladores.

Más tarde emitieron un nuevo archivo "cacerts" que contiene todos los certificados.

Eliminé el archivo cacerts que está presente dentro de% JAVA_HOME% / jre / lib / security y resolvió mi problema.

Entonces, si se enfrenta a este problema, podría ser de su equipo de red también de esta manera.

Vikash Kumar
fuente
2

Me encontré con esta pregunta al intentar instalar el complemento Cucumber-Eclipse en Eclipse a través de su sitio de actualización. Recibí el mismo error de SunCertPathBuilderException:

Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
    Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
    sun.security.validator.ValidatorException: PKIX path building failed: 
   sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Si bien algunas de las otras respuestas son apropiadas y útiles para la situación dada de esta pregunta, sin embargo, fueron inútiles y engañosas para mi problema.

En mi caso, el problema era que la URL proporcionada para su sitio de actualización es:

https://cucumber.io/cucumber-eclipse/update-site

Sin embargo, cuando se navega a través de un navegador, se redirige a (tenga en cuenta el " .github " agregado ):

http://cucumber.github.io/cucumber-eclipse/update-site/

Entonces, la resolución es simplemente usar la versión redirigida de la URL del sitio de actualización al agregar el sitio de actualización en eclipse.

royfripple
fuente
3
¿Estás seguro de que estás respondiendo la pregunta correcta? No se menciona el pepino en la pregunta original ...
Done Data Solutions
Siento que lo soy. Recibí el mismo error de SunCertPathBuilderException y mientras buscaba una resolución, encontré esta pregunta tan bien como esta . Sin embargo, ninguno de ellos tenía la solución adecuada para mi situación. No estaba tratando de responder la pregunta específica de cómo agregar el sitio del complemento Cucumber-Eclipse al eclipse. Quería proporcionar contexto para el problema que enfrenté (redirección de URL) y explicar cómo se resolvió.
royfripple
He actualizado mi respuesta para dejar en claro que recibí el mismo error, señalando que el problema y la solución subyacentes eran diferentes. Creo que esto es válido ya que otros pueden encontrar esta pregunta al buscar el mismo error. Considere cambiar su voto si cree que esto tiene sentido.
royfripple
Gracias. Hace las cosas mucho más claras, revirtió mi voto negativo
Done Data Solutions
¡De nada! Y gracias por tomarse el tiempo de revisarlo nuevamente.
royfripple
2

Estaba enfrentando el mismo problema y lo resolví usando los siguientes pasos simples:

1) Descargue InstallCert.java de google

2) Compílelo usando javac InstallCert.java

3) Ejecute InstallCert.java usando java InstallCert.java , con el nombre de host y el puerto https, y presione “1” cuando solicite información. Agregará el "localhost" como un almacén de claves de confianza y generará un archivo llamado "jssecacerts" como se muestra a continuación:

Java InstallCert localhost: 443

4) copie jssecacerts en la carpeta $ JAVA_HOME / jre / lib / security

La fuente principal para resolver el problema aquí es:

https://ankurjain26.blogspot.in/2017/11/javaxnetsslsslhandshakeexception.html

Ankur jain
fuente
1

Resolví este problema en Windows Server 2016 con Java 8, importando el certificado de la pkcs12tienda al cacertsalmacén de claves.

Ruta a la tienda pkcs12:
C:\Apps\pkcs12.pfx

Ruta a los cacerts de Java:
C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts

Ruta a keytool:
C:\Program Files\Java\jre1.8.0_151\bin

después de posicionarse en la carpeta con keytool en el símbolo del sistema (como administrador), el comando para importar el certificado de pkcs12a cacertses el siguiente:
keytool -v -importkeystore -srckeystore C:\Apps\pkcs12.pfx -srcstoretype PKCS12 -destkeystore "C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts" -deststoretype JKS

Se le pedirá que:
1. ingrese la contraseña del almacén de claves de destino (contraseña de cacerts, el valor predeterminado es "changeit")
2. ingrese la contraseña del almacén de claves de origen (contraseña pkcs12)


Para que los cambios surtan efecto, reinicie la máquina del servidor (o simplemente reinicie JVM).

ognjenkl
fuente
1
Usé este enfoque en una Mac y simplemente funcionó. Por supuesto, mi certificado fue autofirmado y generado para importar el archivo .pfx que había generado en mi servidor Windows Adfs. Uso de Java 10 para mi aplicación Gracias
Shashikant Soni
0

Aquí, normalmente, este tipo de excepción se produce cuando no hay coincidencia en la RUTA del certificado de confianza. Verifique la configuración o ruta donde se requiere este certificado de servidor para una comunicación segura.

ketan
fuente
¿Puede decirme la configuración exacta donde puedo instalar el certificado? En realidad, estoy teniendo problemas con esto, instalé el certificado con respecto a este problema usando keytool , esto funciona durante unos 20-30 minutos y luego el servidor emite el mismo error nuevamente. Por favor, ayúdame. He estado atrapado en este problema durante 2 días.
Deepak Gangore
Creo que el certificado cambia cada 20-30 minutos
Vishwanath gowda k
Me enfrento a un problema similar, pero el problema es: MI java elige la ubicación predeterminada para $ JAVA_HOME / lib / security / cacerts de aplicaciones Java, aunque he proporcionado -Djavax.net.ssl.trustStore = / myapp / app.jks ¿Alguien puede ayudarme? en esto: stackoverflow.com/questions/33821785/…
Laxman G
0

Para mí, apareció un error de certificado porque tenía el violinista ejecutándose en segundo plano y eso se equivoca con el certificado. Actúa como un proxy tan cerca que reinicia el eclipse.

Atihska
fuente
el mismo problema ocurre en eclipse, incluso después de cerrar todas las aplicaciones
arvindwill
0

metas:

  1. usar conexiones https
  2. verificar cadenas SSL
  3. no trates con cacerts
  4. agregar certificado en tiempo de ejecución
  5. no pierda certificados de cacerts

Cómo hacerlo:

  1. definir propio almacén de claves
  2. poner certificado en el almacén de claves
  3. redefinir el contexto predeterminado SSL con nuestra clase personalizada
  4. ???
  5. lucro

Mi archivo contenedor Keystore:

public class CertificateManager {

    private final static Logger logger = Logger.getLogger(CertificateManager.class);

    private String keyStoreLocation;
    private String keyStorePassword;
    private X509TrustManager myTrustManager;
    private static KeyStore myTrustStore;

    public CertificateManager(String keyStoreLocation, String keyStorePassword) throws Exception {
        this.keyStoreLocation = keyStoreLocation;
        this.keyStorePassword = keyStorePassword;
        myTrustStore = createKeyStore(keyStoreLocation, keyStorePassword);
    }

    public void addCustomCertificate(String certFileName, String certificateAlias)
            throws Exception {
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init((KeyStore) null);
        Certificate certificate = myTrustStore.getCertificate(certificateAlias);
        if (certificate == null) {
            logger.info("Certificate not exists");
            addCertificate(certFileName, certificateAlias);
        } else {
            logger.info("Certificate exists");
        }
        tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(myTrustStore);
        for (TrustManager tm : tmf.getTrustManagers()) {
            if (tm instanceof X509TrustManager) {
                setMytrustManager((X509TrustManager) tm);
                logger.info("Trust manager found");
                break;
            }
        }
    }

    private InputStream fullStream(String fname) throws IOException {
        ClassLoader classLoader = getClass().getClassLoader();
        InputStream resource = classLoader.getResourceAsStream(fname);
        try {
            if (resource != null) {
                DataInputStream dis = new DataInputStream(resource);
                byte[] bytes = new byte[dis.available()];
                dis.readFully(bytes);
                return new ByteArrayInputStream(bytes);
            } else {
                logger.info("resource not found");
            }
        } catch (Exception e) {
            logger.error("exception in certificate fetching as resource", e);
        }
        return null;
    }

    public static KeyStore createKeyStore(String keystore, String pass) throws Exception {
        try {
            InputStream in = CertificateManager.class.getClass().getResourceAsStream(keystore);
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(in, pass.toCharArray());
            logger.info("Keystore was created from resource file");
            return keyStore;
        } catch (Exception e) {
            logger.info("Fail to create keystore from resource file");
        }

        File file = new File(keystore);
        KeyStore keyStore = KeyStore.getInstance("JKS");
        if (file.exists()) {
            keyStore.load(new FileInputStream(file), pass.toCharArray());
            logger.info("Default keystore loaded");
        } else {
            keyStore.load(null, null);
            keyStore.store(new FileOutputStream(file), pass.toCharArray());
            logger.info("New keystore created");
        }
        return keyStore;
    }

    private void addCertificate(String certFileName, String certificateAlias) throws CertificateException,
            IOException, KeyStoreException, NoSuchAlgorithmException {
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream certStream = fullStream(certFileName);
        Certificate certs = cf.generateCertificate(certStream);
        myTrustStore.setCertificateEntry(certificateAlias, certs);
        FileOutputStream out = new FileOutputStream(getKeyStoreLocation());
        myTrustStore.store(out, getKeyStorePassword().toCharArray());
        out.close();
        logger.info("Certificate pushed");
    }

    public String getKeyStoreLocation() {
        return keyStoreLocation;
    }

    public String getKeyStorePassword() {
        return keyStorePassword;
    }
    public X509TrustManager getMytrustManager() {
        return myTrustManager;
    }
    public void setMytrustManager(X509TrustManager myTrustManager) {
        this.myTrustManager = myTrustManager;
    }
}

Esta clase creará un almacén de claves si es necesario y podrá administrar certificados dentro de él. Ahora clase para contexto SSL:

public class CustomTrustManager implements X509TrustManager {

    private final static Logger logger = Logger.getLogger(CertificateManager.class);

    private static SSLSocketFactory socketFactory;
    private static CustomTrustManager instance = new CustomTrustManager();
    private static List<CertificateManager> register = new ArrayList<>();

    public static CustomTrustManager getInstance() {
        return instance;
    }

    private X509TrustManager defaultTm;

    public void register(CertificateManager certificateManager) {
        for(CertificateManager manager : register) {
            if(manager == certificateManager) {
                logger.info("Certificate manager already registered");
                return;
            }
        }
        register.add(certificateManager);
        logger.info("New Certificate manager registered");
    }

    private CustomTrustManager() {
        try {
            String algorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm);

            tmf.init((KeyStore) null);
            boolean found = false;
            for (TrustManager tm : tmf.getTrustManagers()) {
                if (tm instanceof X509TrustManager) {
                    defaultTm = (X509TrustManager) tm;
                    found = true;
                    break;
                }
            }
            if(found) {
                logger.info("Default trust manager found");
            } else {
                logger.warn("Default trust manager was not found");
            }

            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, new TrustManager[]{this}, null);
            SSLContext.setDefault(sslContext);
            socketFactory = sslContext.getSocketFactory();
            HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);


            logger.info("Custom trust manager was set");
        } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
            logger.warn("Custom trust manager can't be set");
            e.printStackTrace();
        }
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        List<X509Certificate> out = new ArrayList<>();
        if (defaultTm != null) {
            out.addAll(Arrays.asList(defaultTm.getAcceptedIssuers()));
        }
        int defaultCount = out.size();
        logger.info("Default trust manager contain " + defaultCount + " certficates");
        for(CertificateManager manager : register) {
            X509TrustManager customTrustManager = manager.getMytrustManager();
            X509Certificate[] issuers = customTrustManager.getAcceptedIssuers();
            out.addAll(Arrays.asList(issuers));
        }
        logger.info("Custom trust managers contain " + (out.size() - defaultCount) + " certficates");
        X509Certificate[] arrayOut = new X509Certificate[out.size()];
        return out.toArray(arrayOut);
    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain,
                                   String authType) throws CertificateException {
        for(CertificateManager certificateManager : register) {
            X509TrustManager customTrustManager = certificateManager.getMytrustManager();
            try {
                customTrustManager.checkServerTrusted(chain, authType);
                logger.info("Certificate chain (server) was aproved by custom trust manager");
                return;
            } catch (Exception e) {
            }
        }
        if (defaultTm != null) {
            defaultTm.checkServerTrusted(chain, authType);
            logger.info("Certificate chain (server) was aproved by default trust manager");
        } else {
            logger.info("Certificate chain (server) was rejected");
            throw new CertificateException("Can't check server trusted certificate.");
        }
    }

    @Override
    public void checkClientTrusted(X509Certificate[] chain,
                                   String authType) throws CertificateException {
        try {
            if (defaultTm != null) {
                defaultTm.checkClientTrusted(chain, authType);
                logger.info("Certificate chain (client) was aproved by default trust manager");
            } else {
                throw new NullPointerException();
            }
        } catch (Exception e) {
            for(CertificateManager certificateManager : register) {
                X509TrustManager customTrustManager = certificateManager.getMytrustManager();
                try {
                    customTrustManager.checkClientTrusted(chain, authType);
                    logger.info("Certificate chain (client) was aproved by custom trust manager");
                    return;
                } catch (Exception e1) {
                }
            }
            logger.info("Certificate chain (client) was rejected");
            throw new CertificateException("Can't check client trusted certificate.");
        }
    }

    public SSLSocketFactory getSocketFactory() {
        return socketFactory;
    }
}

Esta clase se hizo como singleton, porque solo se permite un contexto predeterminado de SSL. Entonces, ahora uso:

            CertificateManager certificateManager = new CertificateManager("C:\\myapplication\\mykeystore.jks", "changeit");
            String certificatePath = "C:\\myapplication\\public_key_for_your_ssl_service.crt";
            try {
                certificateManager.addCustomCertificate(certificatePath, "alias_for_public_key_for_your_ssl_service");
            } catch (Exception e) {
                log.error("Can't add custom certificate");
                e.printStackTrace();
            }
            CustomTrustManager.getInstance().register(certificateManager);

Posiblemente, no funcionará con esta configuración, porque mantengo el archivo de certificado dentro de la carpeta de recursos, por lo que mi ruta no es absoluta. Pero en general, funciona perfectamente.

degr
fuente
1
Este doble mal uso de available()está específicamente advertido en su propio Javadoc.
Marqués de Lorne
0

Es además de la respuesta https://stackoverflow.com/a/36427118/1491414 . Gracias @MagGGG

  • Asegúrese de tener permiso de administrador
  • Utilice comillas dobles para la ruta del almacén de claves (-keystore C: \ Archivos de programa (x86) \ Java \ jre1.6.0_22 \ lib \ security \ cacerts ") porque en el sistema operativo Windows la ubicación de instalación predeterminada será Archivos de programa y obtendrá un error debido al espacio entre archivos de programa.
Ganesa Vijayakumar
fuente
0

Lo arreglé usando el siguiente método:

  1. Copie la URL que tiene un problema de conexión
  2. Vaya a Android Studio-> Configuración-> Configuración de HTTP
  3. En 'Probar conexión', pegue esa url y presione ok
  4. Al hacer clic en Aceptar, Android Studio solicitará importar el certificado de esa URL, importarlo
  5. Eso es. Nada más que hacer y mi problema desapareció. No es necesario reiniciar el estudio también.
AndroDev
fuente
0

Cuando tiene el error anterior con el software atlassian ej. jira

2018-08-18 11:35:00,312 Caesium-1-4 WARN anonymous    Default Mail Handler [c.a.mail.incoming.mailfetcherservice] Default Mail Handler[10001]: javax.mail.MessagingException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target while connecting to host 'imap.xyz.pl' as user '[email protected]' via protocol 'imaps, caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

puede agregar certs a su almacén de claves de confianza (cambie missing_ca al nombre de cert adecuado):

keytool -importcert -file missing_ca.crt -alias missing_ca -keystore /opt/atlassian/jira/jre/lib/security/cacerts

Si se le solicita una contraseña, coloque changeity confirmey

Después de eso, simplemente reinicie jira.

Karol Murawski
fuente
0

Si la URL de su repositorio también funciona en HTTP y la seguridad no es una preocupación, puede ir a settings.xml (a menudo, pero no siempre, ubicado en %USERPROFILE%/.m2) y reemplazar HTTPS con HTTP para <repository>y <pluginRepository>URL.

Por ejemplo, esto:

<repository>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>libs-release</name>
    <url>https://<artifactory>/libs-release</url>
</repository>

debe ser reemplazado por esto:

<repository>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>libs-release</name>
    <url>https://<artifactory>/libs-release</url>
</repository>
RUMANIA_ingeniero
fuente
0

Estaba usando mi propia tienda de confianza en lugar de JRE al pasar arg -Djavax.net.ssl.trustStore=

Recibía este error independientemente de los certificados en el almacén de confianza. El problema para mí fue el orden de las propiedades pasadas en la línea arg. Cuando puse -Djavax.net.ssl.trustStore=& -Djavax.net.ssl.trustStorePassword= before -Dspring.config.location= & -jarargs pude invocar con éxito mi llamada de descanso a través de https.

jasonoriordan
fuente
0

Si está utilizando CloudFoundry y se encuentra con un problema de certificado, entonces deberá asegurarse de presionar el jar nuevamente con el servicio de almacén de claves con el certificado. Simplemente desenlazar, enlazar y reiniciar no funcionará.

Codificador inteligente
fuente
0

En caso de que su host se encuentre detrás del firewall / proxy , use el siguiente comando en cmd:

keytool -J-Dhttps.proxyHost=<proxy_hostname> -J-Dhttps.proxyPort=<proxy_port> -printcert -rfc -sslserver <remote_host_name:remote_ssl_port>

Reemplace <proxy_hostname>y <proxy_port>con el servidor proxy HTTP que está configurado. Reemplace <remote_host_name:remote_ssl_port>con uno de los hosts remotos (básicamente url) y el puerto que tiene el problema de certificación.

Tome el último contenido del certificado impreso y cópielo (también copie el certificado inicial y final). Pégalo en un archivo de texto y dale la extensión .crt . Ahora importe este certificado a cacerts usando el comando java keytool y debería funcionar.

keytool -importcert -file <filename>.crt -alias randomaliasname -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
Aniket Warey
fuente
0

Intenta copiar jace cacerts:

cp /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-9.b11.fc28.x86_64/jre/lib/security/cacerts $JAVA_HOME/jre/lib/security/cacerts

Lucas Mendes Mota Da Fonseca
fuente
0

Si ve este problema en un contenedor de Linux cuando la aplicación Java intenta comunicarse con otra aplicación / sitio, es porque el certificado se ha importado incorrectamente al equilibrador de carga. Hay una secuencia de pasos a seguir para importar certificados y que si no se hace correctamente, verá problemas como

Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid 
certification path to requested target

Una vez que los certificados se importan correctamente, debe hacerse. No es necesario jugar con ningún certificado JDK.

vsingh
fuente
0

Lo resolví para Intellij Idea Me enfrento a este problema Aunque, cambié mucho lugar para resolver el problema. Encontré una solución para mí. Haga clic derecho en su proyecto, verá Maven , luego presione Generar fuentes y actualizar carpetas y volver a importar ingrese la descripción de la imagen aquí

Se hace.

java.nazif
fuente
0

Estaba enfrentando el mismo problema, estaba usando 8.1.0-3, pero luego usé 9.2.1-0 y el problema se solucionó sin ningún paso manual. El certificado autofirmado funcionó bien.

Darshil Shah
fuente