"PKIX-Pfaderstellung fehlgeschlagen" und "Kein gültiger Zertifizierungspfad zum angeforderten Ziel gefunden"

422

Ich versuche, Tweets mithilfe der twitter4j- Bibliothek für mein Java-Projekt abzurufen . Bei meinem ersten Lauf habe ich einen Fehler bezüglich Zertifikat sun.security.validator.ValidatorExceptionund sun.security.provider.certpath.SunCertPathBuilderException. Dann habe ich ein Twitter-Zertifikat hinzugefügt von:

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"

Aber ohne Erfolg. Hier ist das Verfahren, um Tweets zu erhalten:

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

Und hier ist der Fehler:

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
Dozent
quelle
6
Hallo Bitte überprüfen Sie unten URL. Ich bin sicher, diese werden Ihnen helfen. java-samples.com/showtutorial.php?tutorialid=210 Confluence.atlassian.com/display/JIRAKB/… . Sie müssen Ihr SSL-Zertifikat zum Java Truststore-Zertifikat hinzufügen (Pfad: jre / lib / security / cacerts).
sus007
Bitte beziehen Sie sich auf diese Antwort für die Lösung und bestätigen Sie, dass Sie Ihre Software als gebündeltes Paket verpacken. Wenn ja, kopieren Sie Ihr Cacerts-Dateisystem und ersetzen Sie diese verpackte JRE-Cacerts-Datei.
Positivecrux
Versuchen Sie dies stackoverflow.com/a/9210661/4741746 möglicherweise ist dies Ihre Antwort
sushant gosavi
2
Ich habe gerade diesen Java-Code verwendet und für https nicht vergessen, den Port als 443 anzugeben. Java-Code unter github.com/escline/InstallCert/blob/master/InstallCert.java Er nimmt Ihre CACERTS-Datei und fügt alle diese Pluspunkte hinzu das aktuelle Zertifikat für die URL, die Sie als Eingabe angeben. In meinem Fall habe ich die Werte fest auf host = "mywebservice.uat.xyz.com" codiert. Port = 443; passphrase = "changeit" .toCharArray (); Dann erstellt das Programm eine neue Datei namens "jssecacerts", die alles enthält. Benennen Sie dies in "cacerts" um und verwenden Sie dies. Sie werden fertig sein.
Reddymails

Antworten:

571
  1. Gehen Sie in Ihrem Browser zur URL:
    • Firefox - Klicken Sie auf die HTTPS-Zertifikatkette (das Schlosssymbol direkt neben der URL-Adresse). Klicken Sie auf "more info" > "security" > "show certificate" > "details" > "export..". Nehmen Sie den Namen und wählen Sie den Dateityp example.cer
    • Chrome - Klicken Sie auf das Site-Symbol links, um es in der Adressleiste zu adressieren, wählen Sie "Zertifikat" -> "Details" -> "Exportieren" und speichern Sie es im Format "Dercodiertes binäres Einzelzertifikat".
  2. Jetzt haben Sie eine Datei mit Keystore und müssen diese Ihrer JVM hinzufügen. Bestimmen Sie den Speicherort von Cacerts-Dateien, z. C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.

  3. Als nächstes importieren Sie die example.cerDatei in cacerts in der Befehlszeile:

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

Sie werden nach dem Standardkennwort gefragt changeit

Starten Sie Ihre JVM / Ihren PC neu.

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

MagGGG
quelle
27
Ich musste den Pfad in Anführungszeichen setzen und ihn auch als Base64 anstelle von DER
Theodore K.
3
wow..es hat wie ein Zauber funktioniert. Übrigens, in Chrome klicken Sie einfach auf das Schlosssymbol in der linken Adressleiste und dann auf Details.
Außerdem
8
Beachten Sie, dass die Anweisungen für alle Zertifikate in der Kette wiederholt werden sollten. Auch der aliasName des Zertifikats in der Befehlszeile sollte eindeutig sein.
Lu55
5
Wenn Ihr Zuhause ein JDK ist, stellen Sie sicher, dass das jre in der folgenden Datei liegt: keytool -import -alias example -keystore "C: \ Programme \ Java \ jdk1.8.0_73 \ jre \ lib \ security \ cacerts" -Datei example.cer
Jack BeNimble
12
Stellen Sie sicher, dass Sie als Administrator die Eingabeaufforderung ausführen, wenn der Fehler "Zugriff verweigert" angezeigt wird.
Walker Christie
81

Nachdem ich viele Stunden lang versucht hatte, Zertifizierungsdateien zu erstellen, damit meine Java 6-Installation mit den neuen Twitter-Zertifikaten funktioniert, stieß ich schließlich auf eine unglaublich einfache Lösung, die in einem Kommentar in einem der Message Boards vergraben war. Kopieren Sie einfach die cacerts-Datei aus einer Java 7-Installation und überschreiben Sie die in Ihrer Java 6-Installation. Wahrscheinlich ist es am besten, zuerst eine Sicherungskopie der cacerts-Datei zu erstellen, aber dann kopieren Sie einfach die neue in und BOOM! es funktioniert einfach.

Beachten Sie, dass ich tatsächlich eine Windows-Cacerts-Datei auf eine Linux-Installation kopiert habe und sie einwandfrei funktioniert hat.

Die Datei befindet sich jre/lib/security/cacertssowohl in der alten als auch in der neuen Java JDK-Installation.

Hoffe, das erspart jemand anderem Stunden der Verschlechterung.

Jeremy Goodell
quelle
4
Ich versuche, mit einem selbstsignierten Zertifikat auf einen SSL-Server zuzugreifen. Ich habe versucht, das Zertifikat mit Keytool hinzuzufügen, aber kein Glück, irgendwelche Vorschläge?
Oleg Belousov
1
Ich bin froh, dass es funktioniert hat. Aber wissen Sie, was die Hauptursache war? Was hat es geschafft, mit Java 6 Zertifikaten zu scheitern .. und wie haben die Java 7 Zertifikate das Problem behoben
Vishwanath Gowda k
Dies tat es, obwohl ich von Icedtea 1.6 zu Orakel 1.7 überging. :)
nperson325681
Beachten
Sie
10
Für diejenigen, die mich mögen, fehlt manchmal das Offensichtliche - stellen Sie sicher, dass Sie darauf eingehen $JAVA_HOME/jre/lib, nicht $JAVA_HOME/lib- ich habe ein bisschen Zeit damit verbracht, dieses Detail zu vermissen.
Ryan Heathcote
35

MEIN UI-Ansatz:

  1. Laden Sie den Keystore Explorer hier herunter
  2. Öffnen Sie $ JAVA_HOME / jre / lib / security / cacerts
  3. PW eingeben: changeit (Kann auf dem Mac geändert werden)
  4. Importieren Sie Ihre CRT-Datei

CMD-Linie:

  1. keytool -importcert -file jetty.crt -alias jetty -keystore $JAVA_HOME/jre/lib/security/cacerts
  2. PW eingeben: changeit(Kann auf dem Mac geändert werden)
Mike Mitterer
quelle
1
Auf einem Mac mit CMD-Line sollte sudo zum Ausführen des Befehls verwendet werden. # sudo keytool -importcert -file jetty.crt -alias jetty -keystore $ JAVA_HOME / jre / lib / security / cacerts
malajisi
1
Unter Windows funktioniert der Befehl:keytool -importcert -file dinardap_cert.cer –alias dinardap –keystore “%JAVA_HOME%/jre/lib/security/cacerts”
Patricio Bonilla
Woher bekommt man die Zertifikatsdatei? Ich kann nicht sagen, zu welcher URL ich gehen soll. jetty.com ?
Kraftydevil
Ich habe mein Zertifikat erhalten, indem ich es aus dem Webbrowser exportiert habe. Kontextaktion auf Vorhängeschloss
RTBF
28

Ich bin auf dieses Problem gestoßen, dessen Behebung viele Stunden gedauert hat, insbesondere bei automatisch generierten Zertifikaten, die im Gegensatz zu offiziellen Zertifikaten ziemlich knifflig sind und denen Java nicht so gut gefällt.

Bitte überprüfen Sie den folgenden Link: Problem mit Zertifikaten in Java lösen

Grundsätzlich müssen Sie das Zertifikat vom Server zu den Java Home-Zertifikaten hinzufügen.

  1. Generieren oder holen Sie Ihr Zertifikat und konfigurieren Sie Tomcat für die Verwendung in Servers.xml
  2. Laden Sie den Java-Quellcode der Klasse herunter InstallCertund führen Sie ihn aus, während der Server ausgeführt wird. Geben Sie dabei die folgenden Argumente an server[:port]. Es wird kein Passwort benötigt, da das ursprüngliche Passwort für die Java-Zertifikate funktioniert ("changeit").
  3. Das Programm stellt eine Verbindung zum Server her und Java löst eine Ausnahme aus. Es analysiert das vom Server bereitgestellte Zertifikat und ermöglicht Ihnen, eine jssecertsDatei in dem Verzeichnis zu erstellen , in dem Sie das Programm ausgeführt haben. (Wenn es von Eclipse ausgeführt wird, stellen Sie sicher, dass Sie die Arbeit konfigurieren Verzeichnis in Run -> Configurations).
  4. Kopieren Sie diese Datei manuell in $JAVA_HOME/jre/lib/security

Nachdem Sie diese Schritte ausgeführt haben, generieren die Verbindungen mit dem Zertifikat in Java keine Ausnahmen mehr.

Der folgende Quellcode ist wichtig und aus (Sun) Oracle-Blogs verschwunden. Die einzige Seite, die ich gefunden habe, war der angegebene Link. Daher füge ich ihn in der Antwort als Referenz hinzu.

/*
 * 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
quelle
2
Beachten Sie, dass die erstellte Datei jssecacerts ist!
DeanDP
20

1. Überprüfen Sie das Zertifikat

Versuchen Sie, die Ziel-URL in den Browser zu laden und das Zertifikat der Site anzuzeigen (normalerweise ist es über das Symbol mit dem Sperrzeichen zugänglich. Es befindet sich links oder rechts in der Adressleiste des Browsers), unabhängig davon, ob es abgelaufen oder aus einem anderen Grund nicht vertrauenswürdig ist.

2. Installieren Sie die neuesten Versionen von JRE und JDK

Neue Versionen werden normalerweise mit dem aktualisierten Satz der vertrauenswürdigen Zertifikate geliefert.

Auch wenn es möglich ist, deinstallieren Sie alte Versionen. Dadurch werden Fehlkonfigurationsfehler explizit.

3. Überprüfen Sie Ihre Konfiguration:

  • Überprüfen Sie, wohin Ihre Umgebungsvariable JAVA_HOME zeigt.
  • Überprüfen Sie, mit welcher Java-Version Sie das Programm ausführen. In IntelliJ überprüfen:
    • Datei -> Projektstruktur ... -> Projekteinstellungen -> Projekt -> Projekt-SDK:
    • Datei -> Projektstruktur ... -> Plattformeinstellungen -> SDKs

4. Kopieren Sie den gesamten Keystore aus der neuen Java-Version

Wenn Sie unter dem JDK entwickeln, das nicht das neueste verfügbare ist, versuchen Sie, die %JAVA_HOME%/jre/lib/security/cacertsDatei durch die neue Datei aus der zuletzt installierten JRE zu ersetzen ( erstellen Sie zuerst eine Sicherungskopie), wie @ jeremy-goodell in seiner Antwort vorschlägt

5. Fügen Sie Ihrem Keystore Zertifikate hinzu

Wenn nichts oben genanntes Ihr Problem löst keytool, speichern Sie die Zertifikate im Java-Keystore:

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

Die Datei mit dem Zertifikat kann vom Browser abgerufen werden, wie @MagGGG in seiner Antwort vorschlägt .

Hinweis 1: Möglicherweise müssen Sie dies für jedes Zertifikat in der Kette zum Zertifikat Ihrer Site wiederholen. Beginnen Sie mit der Wurzel.

Hinweis 2: <alias_name>Sollte unter den Schlüsseln im Geschäft eindeutig sein oder keytoolzeigt einen Fehler an.

So erhalten Sie eine Liste aller Zertifikate im Geschäft, die Sie ausführen können:

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

Falls etwas schief geht, können Sie das Zertifikat aus dem Geschäft entfernen:

keytool -delete -alias <alias_name> -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit
Lu55
quelle
Mit wie gut ausgearbeitet dies ist, sollte es die akzeptierte Antwort sein.
Egor Hans
13
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

Es wird zum Überspringen der Zertifikatvalidierung verwendet.

Warnung Nur für Entwicklungszwecke zu verwenden, ist unsicher!

gorums
quelle
4
Es wird verwendet, um die Zertifikatsvalidierung zu
überspringen
2
@gorums Wie richte ich es in Eclipse ein?
Malajisi
6
Tun Sie dies NICHT, es sei denn, Sie möchten das Risiko eingehen, dass auf Ihrem Computer beliebiger Schadcode ausgeführt wird. Downvoted, da die Gefahr besteht, dass ein Computer, auf dem es ausgeführt wird, gefährdet wird.
Bryan
1
Nur weil es "funktioniert", heißt das nicht, dass es sicher ist, gefährden Sie jeden, der diesen Rat befolgt. Habe meine Gegenstimme
Paradoxis
1
@AceKing Der Punkt ist, dass es kein vertrauenswürdiger Code ist, wenn Sie das Zertifikat nicht validieren. Trotzdem denke ich, dass dies immer noch eine nützliche Antwort ist. Die Leute, die das tun, müssen nur die Risiken verstehen.
Michael Mior
12

Ich hatte eine etwas andere Situation, als sowohl JDK als auch JRE 1.8.0_112 auf meinem System vorhanden waren.

Ich habe die neuen CA-Zertifikate [JDK_FOLDER]\jre\lib\security\cacertsmit dem bereits bekannten Befehl importiert :

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

Trotzdem bekam ich immer wieder den gleichen Fehler beim Erstellen eines PKIX-Pfads .

Ich habe der Java-CLI mithilfe von Debug-Informationen hinzugefügt java -Djavax.net.debug=all ... > debug.log. In der Datei debug.log lautet die Zeile, die mit trustStore beginnt, tatsächlich auf den Cacerts-Speicher in [JRE_FOLDER]\lib\security\cacerts.

In meinem Fall bestand die Lösung darin, die von JDK verwendete Cacerts-Datei (mit den neuen Zertifizierungsstellen) über die von der JRE verwendete Datei zu kopieren, wodurch das Problem behoben wurde.

MF
quelle
Ich habe die benötigten Zertifikate mit keytool direkt in die JRE / lib / security / cacerts importiert, aber es hat nichts für mich geändert :( Immer noch der gleiche Fehler, ich habe sie auch über die IDE oder sogar in den Klassenpfad hinzugefügt und eine Bean hinzugefügt Geben Sie den Keystore-Speicherort an! Es ist verrückt, AF!
Alex
8

Problem Hintergrund:

Beim Versuch, mvn clean install in meinem Projekt und über die Netbeans IDE-Option zum Bereinigen und Erstellen auszuführen, wurde folgende Fehlermeldung angezeigt. Dieses Problem ist darauf zurückzuführen, dass das Zertifikat beim Herunterladen über die NET-Beans-IDE / über die Eingabeaufforderung nicht verfügbar ist, die Dateien jedoch über den Browser heruntergeladen werden können.

Fehler :

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  

Auflösung:

1. Laden Sie das Zertifikat der betreffenden URL herunter:

  • Starten Sie den IE über "Als Administrator ausführen" (andernfalls können wir das Zertifikat nicht herunterladen).
  • Geben Sie die URL in IE-> https: // url / local-repo ein (In meinem Fall hatte diese URL ein nicht vertrauenswürdiges Zertifikat Geben Sie hier die Bildbeschreibung ein.)
  • Laden Sie das Zertifikat herunter, indem Sie auf Zertifikatfehler -> Zertifikat anzeigen klicken
  • Wählen Sie die Registerkarte Details -> In Datei kopieren -> Weiter -> Wählen Sie "DER codierte binäre X.509 (.CER)
  • Speichern Sie das Zertifikat an einem Ort, z. B. c: /user/sheldon/desktop/product.cer
  • Glückwunsch! Sie haben das Zertifikat für die Site erfolgreich heruntergeladen

2. Installieren Sie nun den Schlüsselspeicher, um das Problem zu beheben.

  • Führen Sie den Befehl keytool aus, um den heruntergeladenen Schlüsselspeicher an die vorhandene Zertifikatdatei anzuhängen.
  • Befehl: Unterer Befehl im bin-Ordner von jdk (JAVA_HOME) .

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

  • Sie werden aufgefordert, ein Passwort einzugeben. Geben Sie das Keystore-Passwort ein: Geben Sie erneut "changeit" für "Trust this certificate? [No]:" ein und geben Sie "yes" ein.

Beispiel für Befehlszeilenbefehle / -ausgabe:

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
  • Herzlichen Glückwunsch! Jetzt sollten Sie den Fehler "PKIX-Pfaderstellung fehlgeschlagen: sun.security.provider.certpath.SunCertPathBuilderException" in Ihrer Netbeans-IDE beseitigen.
Barani r
quelle
Hallo, ich habe alle Schritte befolgt, aber kein Glück :(
ManishNegi
Haben Sie ein anderes Zertifikat im Pfad als Cacerts? Wenn Sie eine andere haben, versuchen Sie, sie diesem Zertifikat hinzuzufügen
Barani r
Danke @Barani r, es war mein Fehler, dass ich einen Befehl von jre ausführte und JDK in meiner Sonnenfinsternis verwendete
ManishNegi
Zertifikat konnte nicht heruntergeladen werden, aber nach "Als Administrator ausführen" funktionierte es gut.
Ein weiterer Codierer
8

Ich wollte ein Zertifikat für smtp.gmail.com importieren

Die einzige Lösung, die für mich funktioniert hat, ist 1. Geben Sie den Befehl ein, um dieses Zertifikat anzuzeigen

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

  1. Kopieren Sie die Zeilen zwischen "----- BEGIN CERTIFICATE -----" und "----- END CERTIFICATE -----" in eine Datei, gmail.cer

  2. Lauf

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

  3. Passwort eingeben chageit

  4. Klicken Sie auf Ja, um das Zertifikat zu importieren

  5. Starten Sie Java neu

Führen Sie jetzt den Befehl aus und Sie können loslegen

Sneha Shejwal
quelle
Danke mann! Das hat mir den Tag gerettet. Dies war in meinem Fall die einzig geeignete Lösung.
Andrew Gans
Hat mir auch den Tag gerettet. Vielen Dank.
Kris
6

Dies ist keine Twitter-spezifische Antwort, aber dies ist die Frage, die sich bei der Suche nach diesem Fehler stellt. Wenn Ihr System diesen Fehler beim Herstellen einer Verbindung zu einer Website erhält, die in einem Webbrowser ein gültiges Zertifikat zu haben scheint, bedeutet dies wahrscheinlich, dass die Website eine unvollständige Zertifikatkette aufweist .

Für eine kurze Zusammenfassung des Problems: Zertifizierungsstellen verwenden ihr Stammzertifikat nicht, um nur ein altes Zertifikat zu signieren. Stattdessen signieren sie (normalerweise) Zwischenzertifikate , für die auch das Flag der Zertifizierungsstelle gesetzt ist (dh sie dürfen Zertifikate signieren). Wenn Sie dann ein Zertifikat von einer Zertifizierungsstelle kaufen, signieren diese Ihre CSR mit einem dieser Zwischenzertifikate.

Ihr Java Trust Store verfügt höchstwahrscheinlich nur über das Root-Zertifikat, nicht über die Zwischenzertifikate.

Eine falsch konfigurierte Site gibt möglicherweise nur ihr signiertes Zertifikat zurück. Problem: Es wurde mit einem Zwischenzertifikat signiert, das sich nicht in Ihrem Trust Store befindet. Browser können dieses Problem beheben, indem sie ein zwischengespeichertes Zwischenzertifikat herunterladen oder verwenden. Dies maximiert die Website-Kompatibilität. Java und Tools wie OpenSSL werden dies jedoch nicht tun. Und das wird den Fehler in der Frage verursachen.

Sie können diesen Verdacht mithilfe des Qualys SSL-Tests überprüfen . Wenn Sie das gegen eine Site ausführen und es heißt

Die Zertifikatkette dieses Servers ist unvollständig.

dann bestätigt das es. Sie können dies auch sehen, indem Sie sich die Zertifizierungspfade ansehen und den Text Extra Download sehen .

So beheben Sie das Problem: Der Serveradministrator muss den Webserver so konfigurieren, dass auch die Zwischenzertifikate zurückgegeben werden. Für Comodo zum Beispiel ist hier die .ca-bundleDatei nützlich. In einer Apache-Konfiguration mit mod_ssl würden Sie beispielsweise die SSLCertificateChainFileKonfigurationseinstellung verwenden. Für nginx müssen Sie die Zwischenzertifikate und das signierte Zertifikat verketten und in der SSL-Zertifikatskonfiguration verwenden. Sie können mehr finden, indem Sie online nach "unvollständiger Zertifikatskette" suchen.

Reid
quelle
Du bist Brilliant. Vielen Dank! Ich hatte ein Problem mit dem neuen Buildout meines Java-Servers, weil ich vergessen habe, das # vor SSLCertificateChainFile zu entfernen !!! Wirklich gut erklärt.
KisnardOnline
6

Der Grund für den obigen Fehler ist, dass JDK mit vielen vertrauenswürdigen Certificate Authority (CA) -Zertifikaten in einer Datei namens "cacerts" gebündelt ist, diese Datei jedoch keinen Hinweis auf unser selbstsigniertes Zertifikat enthält. Mit anderen Worten, in die cacerts-Datei wird unser selbstsigniertes Zertifikat nicht importiert und daher nicht als vertrauenswürdige Entität behandelt. Daher wird der oben genannte Fehler ausgegeben.

So beheben Sie den obigen Fehler

Um den obigen Fehler zu beheben, müssen wir lediglich das selbstsignierte Zertifikat in die cacerts-Datei importieren.

Suchen Sie zuerst die Cacerts-Datei. Wir müssen den JDK-Standort herausfinden. Wenn Sie Ihre Anwendung über eine der IDEs wie Eclipse oder IntelliJ Idea ausführen, gehen Sie zu den Projekteinstellungen und ermitteln Sie den JDK-Speicherort. Unter Mac OS befindet sich der typische Speicherort der Cacerts-Datei beispielsweise an diesem Speicherort / Library / Java / JavaVirtualMachines / {{JDK_version}} / Contents / Home / jre / lib / security auf einem Windows-Computer unter {{Installationsverzeichnis}. } / {{JDK_version}} / jre / lib / security

Nachdem Sie die Cacerts-Datei gefunden haben, müssen wir unser selbstsigniertes Zertifikat in diese Cacerts-Datei importieren. Überprüfen Sie den letzten Artikel, wenn Sie nicht wissen, wie Sie das selbstsignierte Zertifikat korrekt generieren können.

Wenn Sie keine Zertifikatdatei (.crt) und nur eine .jks-Datei haben, können Sie mit dem folgenden Befehl eine .crt-Datei erstellen. Falls Sie bereits eine .crt / .pem-Datei haben, können Sie den folgenden Befehl ignorieren

## Zertifikat aus Keystore (.jks-Datei) generieren ####

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

Der obige Schritt generiert eine Datei mit dem Namen selfsigned.crt.Now Importieren Sie das Zertifikat in cacerts

Fügen Sie nun das Zertifikat zu JRE / lib / security / cacerts (Trustore) hinzu.
keytool -importcert -file selfsigned.crt -alias selfsigned -keystore {{cacerts path}}

für zB

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

Das ist alles, starten Sie Ihre Anwendung neu und es sollte gut funktionieren. Wenn es immer noch nicht funktioniert und eine SSL-Handshake-Ausnahme erhalten wird. Dies bedeutet wahrscheinlich, dass Sie eine andere Domain verwenden als im Zertifikat registriert.

Der Link mit detaillierter Erklärung und schrittweiser Auflösung ist hier vorbei.

Abhishek Galoda
quelle
4

Das Hinzufügen cacertshat bei mir nicht funktioniert. Nachdem Sie das Protokoll mit dem Flag aktiviert hatten -Djavax.net.debug=all, lernten Sie das Lesen von Java kennen jssecacerts.

Import jssecacertsfunktioniert endlich.

alk453
quelle
2
Die fehlende Erklärung hier ist, dass Java verwendet wird, jssecacertsfalls vorhanden, andernfalls cacerts.
Marquis von Lorne
3

Dies ist eine Lösung, aber in Form meiner Geschichte mit diesem Problem:

Ich war fast tot und habe die oben angegebene Lösung ausprobiert (3 Tage lang) und nichts hat bei mir funktioniert.

Ich habe alle Hoffnung verloren.

Ich habe diesbezüglich mein Sicherheitsteam kontaktiert, weil ich hinter einem Proxy stehe und sie sagten, dass sie kürzlich ihre Sicherheitsrichtlinien aktualisiert haben.

Ich habe sie schlecht beschimpft, weil sie die Entwickler nicht informiert haben.

Später gaben sie eine neue "cacerts" -Datei heraus, die alle Zertifikate enthält.

Ich habe die cacerts-Datei entfernt, die in% JAVA_HOME% / jre / lib / security vorhanden ist, und mein Problem wurde behoben.

Wenn Sie also mit diesem Problem konfrontiert sind, könnte es auch von Ihrem Netzwerkteam so sein.

Vikash Kumar
quelle
2

Ich bin auf diese Frage gestoßen, als ich versucht habe, das Cucumber-Eclipse-Plugin in Eclipse über die Update-Site zu installieren. Ich habe den gleichen SunCertPathBuilderException-Fehler erhalten:

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

Während einige der anderen Antworten für die jeweilige Situation dieser Frage angemessen und hilfreich sind, waren sie für mein Problem dennoch nicht hilfreich und irreführend.

In meinem Fall war das Problem, dass die für ihre Update-Site angegebene URL lautet:

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

Wenn Sie jedoch über einen Browser dorthin navigieren , wird es umgeleitet (beachten Sie das hinzugefügte " .github "):

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

Die Lösung besteht also darin, beim Hinzufügen der Update-Site in Eclipse einfach die umgeleitete Version der URL der Update-Site zu verwenden.

Royfripple
quelle
3
Sind Sie sicher, dass Sie die richtige Frage beantworten? Es gibt keine Erwähnung von Gurke in der ursprünglichen Frage ...
Done Data Solutions
Ich fühle, dass ich bin. Ich erhielt die gleichen SunCertPathBuilderException Fehler und während einer Entschliessung der Suche, fand diese Frage als auch diese ein . Keiner von ihnen hatte jedoch eine geeignete Lösung für meine Situation. Ich habe nicht versucht, die spezielle Frage zu beantworten, wie die Cucumber-Eclipse-Plugin-Site zu Eclipse hinzugefügt werden kann. Ich wollte einen Kontext für das Problem bereitstellen, mit dem ich konfrontiert war (URL-Umleitung), und erklären, wie es behoben wurde.
Royfripple
Ich habe meine Antwort aktualisiert, um zu verdeutlichen, dass ich denselben Fehler erhalten habe, und festgestellt, dass das zugrunde liegende Problem und die zugrunde liegende Lösung unterschiedlich waren. Ich bin der Meinung, dass dies gültig ist, da andere diese Frage möglicherweise finden, wenn sie nach demselben Fehler suchen. Bitte erwägen Sie, Ihre Stimme zu ändern, wenn Sie dies für sinnvoll halten.
Royfripple
Vielen Dank. Macht die Dinge viel klarer, kehrte meine Ablehnung um
Done Data Solutions
Bitte! Und danke, dass Sie sich die Zeit genommen haben, es noch einmal zu überprüfen.
Royfripple
2

Ich hatte das gleiche Problem und konnte es mithilfe der folgenden einfachen Schritte lösen:

1) Laden Sie InstallCert.java von Google herunter

2) Kompilieren Sie es mit javac InstallCert.java

3) Führen Sie InstallCert.java mit java InstallCert.java mit dem Hostnamen und dem https-Port aus und drücken Sie "1", wenn Sie zur Eingabe aufgefordert werden. Es wird den "localhost" als vertrauenswürdigen Schlüsselspeicher hinzufügen und eine Datei mit dem Namen "jssecacerts" wie folgt generieren:

Java InstallCert localhost: 443

4) Kopieren Sie die jssecacerts in den Ordner $ JAVA_HOME / jre / lib / security

Die Hauptquelle zur Behebung des Problems ist:

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

Ankur Jain
quelle
1

Ich habe dieses Problem unter Windows Server 2016 mit Java 8 gelöst, indem ich das Zertifikat aus dem pkcs12Store in den cacertsKeystore importiert habe .

Pfad zum pkcs12-Speicher:
C:\Apps\pkcs12.pfx

Pfad zu Java-Cacerts:
C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts

Pfad zum Keytool:
C:\Program Files\Java\jre1.8.0_151\bin

Nach dem Besitz eines Ordners mit dem Keytool in der Eingabeaufforderung (als Administrator) lautet der Befehl zum Importieren des Zertifikats von pkcs12nach cacertswie folgt:
keytool -v -importkeystore -srckeystore C:\Apps\pkcs12.pfx -srcstoretype PKCS12 -destkeystore "C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts" -deststoretype JKS

Sie werden aufgefordert:
1. Geben Sie das Kennwort des Ziel-Keystores ein (cacerts pasword, Standard ist "changeit")
2. Geben Sie das Quell-Keystore-Passwort ein (pkcs12-Passwort).


Starten Sie den Server neu (oder starten Sie einfach JVM neu), damit die Änderungen wirksam werden.

ognjenkl
quelle
1
Ich habe diesen Ansatz auf einem Mac verwendet und er hat einfach funktioniert. Mein Zertifikat wurde natürlich selbst signiert und generiert, um die PFX-Datei zu importieren, die ich auf meinem Windows ADFS-Server generiert hatte. Verwenden von Java 10 für meine App Danke
Shashikant Soni
0

Hier tritt diese Art von Ausnahme normalerweise auf, wenn der Pfad des vertrauenswürdigen Zertifikats nicht übereinstimmt. Überprüfen Sie die Konfiguration oder den Pfad, in dem dieses Serverzertifikat für die sichere Kommunikation erforderlich ist.

Ketan
quelle
Können Sie mir bitte die genaue Konfiguration mitteilen, in der ich das Zertifikat installieren kann? Eigentlich habe ich ein Problem damit, ich hatte das Zertifikat bezüglich dieses Problems mit Keytool installiert , dies funktioniert für ca. 20-30 Minuten und dann gibt der Server den gleichen Fehler erneut aus. Bitte hilf mir. Ich bin seit 2 Tagen in dieser Ausgabe festgefahren.
Deepak Gangore
Ich denke, das Zertifikat ändert sich alle 20-30 Minuten
Vishwanath gowda k
Ich habe ein ähnliches Problem, aber das Problem ist: MEIN Java-Standardspeicherort für $ JAVA_HOME / lib / security / cacerts von Java-Anwendungen, obwohl ich -Djavax.net.ssl.trustStore = / myapp / app.jks angegeben habe Kann mir jemand helfen? dazu: stackoverflow.com/questions/33821785/…
Laxman G
0

Für mich ist ein Zertifikatfehler aufgetreten, weil im Hintergrund ein Geiger ausgeführt wurde, der das Zertifikat durcheinander bringt. Es fungiert als Proxy so nah, dass Eclipse neu gestartet wird.

Atihska
quelle
Das gleiche Problem tritt in Eclipse auf, auch nachdem alle Anwendungen geschlossen wurden
arvindwill
0

Tore:

  1. Verwenden Sie https-Verbindungen
  2. Überprüfen Sie die SSL-Ketten
  3. beschäftige dich nicht mit cacerts
  4. Zertifikat zur Laufzeit hinzufügen
  5. Verlieren Sie keine Zertifikate von Cacerts

Wie es geht:

  1. eigenen Keystore definieren
  2. Zertifikat in den Keystore legen
  3. Definieren Sie den SSL-Standardkontext mit unserer benutzerdefinierten Klasse neu
  4. ???
  5. profitieren

Meine Keystore-Wrapper-Datei:

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;
    }
}

Diese Klasse erstellt bei Bedarf einen Keystore und kann darin Zertifikate verwalten. Jetzt Klasse für SSL-Kontext:

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;
    }
}

Diese Klasse wurde als Singleton erstellt, da nur ein Standard-SSL-Kontext zulässig ist. Also, jetzt Verwendung:

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

Möglicherweise funktioniert dies mit diesen Einstellungen nicht, da ich die Zertifikatdatei im Ressourcenordner aufbewahre und mein Pfad daher nicht absolut ist. Aber im Allgemeinen funktioniert es perfekt.

degr
quelle
1
Vor diesem doppelten Missbrauch available()wird in seinem eigenen Javadoc ausdrücklich gewarnt.
Marquis von Lorne
0

Es ist eine Ergänzung zur Antwort https://stackoverflow.com/a/36427118/1491414 . Danke @MagGGG

  • Bitte stellen Sie sicher, dass Sie über Administratorrechte verfügen
  • Bitte verwenden Sie doppelte Anführungszeichen für den Schlüsselspeicherpfad (-keystore C: \ Programme (x86) \ Java \ jre1.6.0_22 \ lib \ security \ cacerts "), da unter Windows der Standardinstallationsspeicherort Programme ist und Sie erhalten Ein Fehler aufgrund des Leerzeichens zwischen den Programmdateien.
Ganesa Vijayakumar
quelle
0

Ich habe dies mit der folgenden Methode behoben:

  1. Kopieren Sie die URL, bei der ein Verbindungsproblem vorliegt
  2. Gehen Sie zu Android Studio-> Einstellungen-> HTTP-Einstellungen
  3. Fügen Sie unter 'Verbindung testen' diese URL ein und drücken Sie OK
  4. Wenn Sie auf OK klicken, werden Sie von Android Studio aufgefordert, das Zertifikat dieser URL zu importieren und zu importieren
  5. Das ist es. Sonst nichts zu tun und mein Problem war weg. Sie müssen das Studio auch nicht neu starten.
AndroDev
quelle
0

Wenn Sie oben Fehler mit atlassian Software ex haben. 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

Sie können dem vertrauenswürdigen Schlüsselspeicher Zertifikate hinzufügen (ändern Sie "missing_ca" in den richtigen Zertifikatsnamen):

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

Wenn Sie nach dem Passwort gefragt werden, geben Sie es ein changeitund bestätigen Sie esy

Danach einfach Jira neu starten.

Karol Murawski
quelle
0

Wenn Ihre Repository-URL auch unter HTTP funktioniert und die Sicherheit keine Rolle spielt, können Sie in settings.xml (häufig, aber nicht immer in %USERPROFILE%/.m2) HTTPS durch HTTP für <repository>und <pluginRepository>URLs ersetzen .

Zum Beispiel:

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

sollte durch Folgendes ersetzt werden:

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

Ich habe meinen eigenen Trust Store anstelle von JRE verwendet, indem ich arg übergeben habe -Djavax.net.ssl.trustStore=

Ich habe diesen Fehler unabhängig von Zertifikaten im Truststore erhalten. Das Problem für mich war die Reihenfolge der Eigenschaften, die auf der arg-Linie übergeben wurden. Als ich -Djavax.net.ssl.trustStore=& -Djavax.net.ssl.trustStorePassword= before -Dspring.config.location= & -jarargs platzierte, konnte ich meinen Restanruf über https erfolgreich aufrufen.

jasonoriordan
quelle
0

Wenn Sie CloudFoundry verwenden und auf ein Zertifikatproblem stoßen, müssen Sie sicherstellen, dass Sie das JAR erneut mit dem Keystore-Service mit dem darin enthaltenen Zertifikat verschieben. Einfach lösen, binden und neu starten funktioniert nicht.

Smart Coder
quelle
0

Wenn sich Ihr Host hinter einer Firewall / einem Proxy befindet , verwenden Sie den folgenden Befehl in cmd:

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

Ersetzen Sie <proxy_hostname>und <proxy_port>mit dem konfigurierten HTTP-Proxyserver. Ersetzen Sie ihn <remote_host_name:remote_ssl_port>durch einen der Remote-Hosts (im Grunde URL) und einen Port mit dem Zertifizierungsproblem.

Nehmen Sie den zuletzt gedruckten Zertifikatinhalt und kopieren Sie ihn (kopieren Sie auch das Start- und Endzertifikat). Fügen Sie es in eine Textdatei ein und geben Sie ihm die Erweiterung .crt . Importieren Sie nun dieses Zertifikat mit dem Befehl java keytool in cacerts und es sollte funktionieren.

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

Versuchen Sie, Java-Cacerts zu kopieren:

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
quelle
0

Wenn dieses Problem in einem Linux-Container auftritt, wenn eine Java-Anwendung versucht, mit einer anderen Anwendung / Site zu kommunizieren, liegt dies daran, dass das Zertifikat falsch in den Load Balancer importiert wurde. Es gibt eine Reihe von Schritten, die zum Importieren von Zertifikaten ausgeführt werden müssen. Wenn dies nicht korrekt ausgeführt wird, werden Probleme wie z

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

Sobald die Zertifikate korrekt importiert wurden, sollte dies geschehen. Sie müssen keine JDK-Zertifikate basteln.

vsingh
quelle
0

Ich habe es für Intellij Idea gelöst. Ich stehe vor diesem Problem. Trotzdem ändere ich viel Platz, um das Problem zu lösen. Ich habe eine Lösung für mich gefunden. Klicken Sie mit der rechten Maustaste auf Ihr Projekt. Sie sehen Maven . Drücken Sie anschließend Quellen generieren und Ordner aktualisieren und ReImport Geben Sie hier die Bildbeschreibung ein

Es ist vollbracht.

java.nazif
quelle
0

Ich hatte das gleiche Problem, ich habe 8.1.0-3 verwendet, aber später habe ich 9.2.1-0 verwendet und das Problem wurde ohne manuelle Schritte behoben. Das selbstsignierte Zertifikat hat einwandfrei funktioniert.

Darshil Shah
quelle