it-swarm.com.de

Java: Sun.security.provider.certpath.SunCertPathBuilderException: Es wurde kein gültiger Zertifizierungspfad für das angeforderte Ziel gefunden

Ich habe eine Klasse, die eine Datei von einem https Server herunterlädt. Wenn ich es starte, gibt es viele Fehler zurück. Es scheint, dass ich ein Problem mit meinem Zertifikat habe. Kann die Client-Server-Authentifizierung ignoriert werden? Wenn das so ist, wie?

package com.da;

import Java.io.FileOutputStream;
import Java.io.IOException;
import Java.nio.CharBuffer;
import Java.util.concurrent.Future;

import org.Apache.http.HttpResponse;
import org.Apache.http.client.utils.URIUtils;
import org.Apache.http.impl.nio.client.DefaultHttpAsyncClient;
import org.Apache.http.nio.IOControl;
import org.Apache.http.nio.client.HttpAsyncClient;
import org.Apache.http.nio.client.methods.AsyncCharConsumer;
import org.Apache.http.nio.client.methods.HttpAsyncGet;
import org.Apache.http.nio.client.methods.HttpAsyncPost;

public class RSDDownloadFile {
    static FileOutputStream fos;

    public void DownloadFile(String URI, String Request) throws Exception
    {
        Java.net.URI uri = URIUtils.createURI("https", "176.66.3.69:6443", -1, "download.aspx",
                "Lang=EN&AuthToken=package", null);
        System.out.println("URI Query: " + uri.toString());

        HttpAsyncClient httpclient = new DefaultHttpAsyncClient();
        httpclient.start();
        try {
            Future<Boolean> future = httpclient.execute(
                    new HttpAsyncGet(uri),
                    new ResponseCallback(), null);

            Boolean result = future.get();
            if (result != null && result.booleanValue()) {
                System.out.println("\nRequest successfully executed");
            } else {
                System.out.println("Request failed");
            }              
        } 
        catch(Exception e){
            System.out.println("[DownloadFile] Exception: " + e.getMessage());
        }
        finally {
            System.out.println("Shutting down");
            httpclient.shutdown();
        }
        System.out.println("Done");  

    }

    static class ResponseCallback extends AsyncCharConsumer<Boolean> {

        @Override
        protected void onResponseReceived(final HttpResponse response) {
             System.out.println("Response: " + response.getStatusLine());
             System.out.println("Header: " + response.toString());
             try {   
                 //if(response.getStatusLine().getStatusCode()==200)
                     fos = new FileOutputStream( "Response.html" );
             }catch(Exception e){
                 System.out.println("[onResponseReceived] Exception: " + e.getMessage());
             }
        }

        @Override
        protected void onCharReceived(final CharBuffer buf, final IOControl ioctrl) throws IOException {
            try
            {
                while (buf.hasRemaining()) 
                {
                    //System.out.print(buf.get());
                    fos.write(buf.get());
                }
            }catch(Exception e)
            {
                System.out.println("[onCharReceived] Exception: " + e.getMessage());
            }
        }

        @Override
        protected void onCleanup() {
            try
            {             
                if(fos!=null)
                    fos.close();
            }catch(Exception e){
                System.out.println("[onCleanup] Exception: " + e.getMessage());         
            }
             System.out.println("onCleanup()");
        }

        @Override
        protected Boolean buildResult() {
            return Boolean.TRUE;
        }

    }
}

Fehler:

URI Query: https://176.66.3.69:6443/download.aspx?Lang=EN&AuthToken=package
Aug 2, 2011 3:47:57 PM org.Apache.http.impl.nio.client.NHttpClientProtocolHandler exception
SEVERE: I/O error: General SSLEngine problem
javax.net.ssl.SSLHandshakeException: General SSLEngine problem
    at com.Sun.net.ssl.internal.ssl.Handshaker.checkThrown(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.SSLEngineImpl.wrap(Unknown Source)
    at javax.net.ssl.SSLEngine.wrap(Unknown Source)
    at org.Apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.Java:154)
    at org.Apache.http.impl.nio.reactor.SSLIOSession.isAppInputReady(SSLIOSession.Java:276)
    at org.Apache.http.impl.nio.client.InternalClientEventDispatch.inputReady(InternalClientEventDispatch.Java:79)
    at org.Apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.Java:161)
    at org.Apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.Java:335)
    at org.Apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.Java:315)
    at org.Apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.Java:275)
    at org.Apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.Java:104)
    at org.Apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.Java:542)
    at Java.lang.Thread.run(Unknown Source)
Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
    at com.Sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.Handshaker$1.run(Unknown Source)
    at Java.security.AccessController.doPrivileged(Native Method)
    at com.Sun.net.ssl.internal.ssl.Handshaker$DelegatedTask.run(Unknown Source)
    at org.Apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.Java:180)
    ... 9 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 com.Sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    at com.Sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(Unknown Source)
    ... 16 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)
    ... 21 more
onCleanup()

[DownloadFile] Exception: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
Shutting down
Done
188
neztreh

Das Problem tritt auf, wenn der Server über ein selbstsigniertes Zertifikat verfügt. Um dieses Problem zu umgehen, können Sie dieses Zertifikat der Liste der vertrauenswürdigen Zertifikate Ihrer JVM hinzufügen. 

In diesem Artikel author beschreibt, wie Sie das Zertifikat von Ihrem Browser abrufen und zur cacerts-Datei Ihrer JVM hinzufügen. Sie können entweder die Java_HOME/jre/lib/security/cacerts-Datei bearbeiten oder Ihre Anwendung mit dem -Djavax.net.ssl.trustStore-Parameter ausführen. Überprüfen Sie, welche JDK/JRE Sie auch verwenden, da dies oft zu Verwirrung führt.

Siehe auch: Wie werden SSL-Zertifikatservernamen aufgelöst/Kann ich mit keytool alternative Namen hinzufügen? Wenn Sie die Java.security.cert.CertificateException: No name matching localhost found-Ausnahme ausführen.

175
Maxim Mazin

Was bei mir zuverlässig auf MacOS funktioniert: Stellen Sie sicher, dass Sie example.com und 443 durch den tatsächlichen Hostnamen und den Port, zu dem Sie eine Verbindung herstellen möchten, ersetzen, und einen benutzerdefinierten Alias ​​angeben. Der erste Befehl lädt das bereitgestellte Zertifikat vom Remote-Server herunter und speichert es lokal im Format x509. Der zweite Befehl lädt das gespeicherte Zertifikat in den SSL-Truststore von Java.

openssl x509 -in <(openssl s_client -connect example.com:443 -prexit 2>/dev/null) -out ~/example.crt
Sudo keytool -importcert -file ~/example.crt -alias example -keystore $(/usr/libexec/Java_home)/jre/lib/security/cacerts -storepass changeit
123

Ich hatte das gleiche Problem mit einem gültigen signierten Wildcard-Zertifikat von Symantec.

Versuchen Sie zunächst, Ihre Java-Anwendung mit -Djavax.net.debug = SSL auszuführen, um zu sehen, was wirklich vor sich geht.

Ich endete Importieren des Zwischenzertifikats, was dazu führte, dass die Zertifizierungskette brach.

Ich habe das fehlende Zwischenzertifikat von symantec heruntergeladen (der Downloadlink zum fehlenden Zertifikat ist im ssl-Handshake-Protokoll enthalten: http://svrintl-g3-aia.verisign.com/SVRIntlG3.cer in meinem Fall) .

Und ich habe das cert in den Java-Keystore importiert. Nach dem Import des Zwischenzertifikats funktionierte mein Wildcard-SSL-Zertifikat endlich:

keytool -import -keystore ../jre/lib/security/cacerts -trustcacerts -alias "VeriSign Class 3 International Server CA - G3" -file /pathto/SVRIntlG3.cer
38
  1. Exportieren Sie das SSL-Zertifikat mit Firefox. Sie können es exportieren, indem Sie die URL im Browser anklicken und dann die Option zum Exportieren des Zertifikats auswählen. Angenommen, der Name der Zertifikatsdatei lautet your.ssl.server.name.crt
  2. Gehen Sie zu Ihrem JRE_HOME/bin oder JDK/JRE/bin
  3. Geben Sie den Befehl ein 
  4. keytool -keystore ..\lib\security\cacerts -import -alias your.ssl.server.name -file .\relative-path-to-cert-file\your.ssl.server.name.crt
  5. Starten Sie Ihren Java-Prozess neu 
30
Robin

Quotierung aus Kein gültiger Zertifizierungspfad zum angeforderten Ziel gefunden.

beim Versuch, eine SSL-Verbindung zu einem Host mit JSSE zu öffnen. In der Regel bedeutet dies, dass der Server ein Testzertifikat (möglicherweise mithilfe von keytool generiert) verwendet, und kein Zertifikat einer bekannten kommerziellen Zertifizierungsstelle wie Verisign oder GoDaddy. Webbrowser zeigen in diesem Fall Warndialogfelder an. Da JSSE jedoch nicht davon ausgehen kann, dass ein interaktiver Benutzer vorhanden ist, wird standardmäßig nur eine Ausnahme ausgelöst.

Die Validierung von Zertifikaten ist ein sehr wichtiger Bestandteil der SSL-Sicherheit. Ich schreibe diesen Eintrag jedoch nicht, um die Details zu erläutern. Wenn Sie interessiert sind, können Sie zunächst den Wikipedia-Klappentext lesen. Ich schreibe diesen Eintrag, um eine einfache Möglichkeit zu zeigen, mit dem Host mit dem Testzertifikat zu sprechen, wenn Sie wirklich wollen.

Grundsätzlich möchten Sie das Serverzertifikat mit Ihren vertrauenswürdigen Zertifikaten zum KeyStore hinzufügen

Probieren Sie den dort angegebenen Code aus. Es könnte helfen.

17
Nishant

@Gabe Martin-Dempesys Antwort wird mir geholfen. Und ich habe ein kleines Skript dazu geschrieben. Die Verwendung ist sehr einfach.

Installieren Sie ein Zertifikat vom Host: 

> Sudo ./Java-cert-importer.sh example.com

Entfernen Sie das bereits installierte Zertifikat.

> Sudo ./Java-cert-importer.sh example.com --delete

Java-cert-importer.sh

#!/usr/bin/env bash

# Exit on error
set -e

# Ensure script is running as root
if [ "$EUID" -ne 0 ]
  then echo "WARN: Please run as root (Sudo)"
  exit 1
fi

# Check required commands
command -v openssl >/dev/null 2>&1 || { echo "Required command 'openssl' not installed. Aborting." >&2; exit 1; }
command -v keytool >/dev/null 2>&1 || { echo "Required command 'keytool' not installed. Aborting." >&2; exit 1; }

# Get command line args
Host=$1; port=${2:-443}; deleteCmd=${3:-${2}}

# Check Host argument
if [ ! ${Host} ]; then
cat << EOF
Please enter required parameter(s)

usage:  ./Java-cert-importer.sh <Host> [ <port> | default=443 ] [ -d | --delete ]

EOF
exit 1
fi;

if [ "$Java_HOME" ]; then
    javahome=${Java_HOME}
Elif [[ "$OSTYPE" == "linux-gnu" ]]; then # Linux
    javahome=$(readlink -f $(which Java) | sed "s:bin/Java::")
Elif [[ "$OSTYPE" == "darwin"* ]]; then # Mac OS X
    javahome="$(/usr/libexec/Java_home)/jre"
fi

if [ ! "$javahome" ]; then
    echo "WARN: Java home cannot be found."
    exit 1
Elif [ ! -d "$javahome" ]; then
    echo "WARN: Detected Java home does not exists: $javahome"
    exit 1
fi

echo "Detected Java Home: $javahome"

# Set cacerts file path
cacertspath=${javahome}/lib/security/cacerts
cacertsbackup="${cacertspath}.$$.backup"

if ( [ "$deleteCmd" == "-d" ] || [ "$deleteCmd" == "--delete" ] ); then
    Sudo keytool -delete -alias ${Host} -keystore ${cacertspath} -storepass changeit
    echo "Certificate is deleted for ${Host}"
    exit 0
fi

# Get Host info from user
#read -p "Enter server Host (E.g. example.com) : " Host
#read -p "Enter server port (Default 443) : " port

# create temp file
tmpfile="/tmp/${Host}.$$.crt"

# Create Java cacerts backup file
cp ${cacertspath} ${cacertsbackup}

echo "Java CaCerts Backup: ${cacertsbackup}"

# Get certificate from speficied Host
openssl x509 -in <(openssl s_client -connect ${Host}:${port} -prexit 2>/dev/null) -out ${tmpfile}

# Import certificate into Java cacerts file
Sudo keytool -importcert -file ${tmpfile} -alias ${Host} -keystore ${cacertspath} -storepass changeit

# Remove temp certificate file
rm ${tmpfile}

# Check certificate alias name (same with Host) that imported successfully
result=$(keytool -list -v -keystore ${cacertspath} -storepass changeit | grep "Alias name: ${Host}")

# Show results to user
if [ "$result" ]; then
    echo "Success: Certificate is imported to Java cacerts for ${Host}";
else
    echo "Error: Something went wrong";
fi;
17
bhdrk

Ich konnte es nur mit Code zum Laufen bringen, d. H. Ich brauche kein keytool:

import com.netflix.config.DynamicBooleanProperty;
import com.netflix.config.DynamicIntProperty;
import com.netflix.config.DynamicPropertyFactory;
import org.Apache.http.client.config.RequestConfig;
import org.Apache.http.config.Registry;
import org.Apache.http.config.RegistryBuilder;
import org.Apache.http.conn.ssl.SSLContexts;
import org.Apache.http.conn.ssl.TrustStrategy;
import org.Apache.http.conn.ssl.X509HostnameVerifier;
import org.Apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.Apache.http.impl.nio.client.HttpAsyncClients;
import org.Apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
import org.Apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
import org.Apache.http.impl.nio.reactor.IOReactorConfig;
import org.Apache.http.nio.conn.NoopIOSessionStrategy;
import org.Apache.http.nio.conn.SchemeIOSessionStrategy;
import org.Apache.http.nio.conn.ssl.SSLIOSessionStrategy;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import Java.io.IOException;
import Java.security.cert.CertificateException;
import Java.security.cert.X509Certificate;

public class Test
{
    private static final DynamicIntProperty MAX_TOTAL_CONNECTIONS = DynamicPropertyFactory.getInstance().getIntProperty("X.total.connections", 40);
    private static final DynamicIntProperty ROUTE_CONNECTIONS = DynamicPropertyFactory.getInstance().getIntProperty("X.total.connections", 40);
    private static final DynamicIntProperty CONNECT_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.connect.timeout", 60000);
    private static final DynamicIntProperty SOCKET_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.socket.timeout", -1);
    private static final DynamicIntProperty CONNECTION_REQUEST_TIMEOUT = DynamicPropertyFactory.getInstance().getIntProperty("X.connectionrequest.timeout", 60000);
    private static final DynamicBooleanProperty STALE_CONNECTION_CHECK = DynamicPropertyFactory.getInstance().getBooleanProperty("X.checkconnection", true);

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

        SSLContext sslcontext = SSLContexts.custom()
                .useTLS()
                .loadTrustMaterial(null, new TrustStrategy()
                {
                    @Override
                    public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException
                    {
                        return true;
                    }
                })
                .build();
        SSLIOSessionStrategy sslSessionStrategy = new SSLIOSessionStrategy(sslcontext, new AllowAll());

        Registry<SchemeIOSessionStrategy> sessionStrategyRegistry = RegistryBuilder.<SchemeIOSessionStrategy>create()
                .register("http", NoopIOSessionStrategy.INSTANCE)
                .register("https", sslSessionStrategy)
                .build();

        DefaultConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(IOReactorConfig.DEFAULT);
        PoolingNHttpClientConnectionManager connectionManager = new PoolingNHttpClientConnectionManager(ioReactor, sessionStrategyRegistry);
        connectionManager.setMaxTotal(MAX_TOTAL_CONNECTIONS.get());
        connectionManager.setDefaultMaxPerRoute(ROUTE_CONNECTIONS.get());

        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(SOCKET_TIMEOUT.get())
                .setConnectTimeout(CONNECT_TIMEOUT.get())
                .setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT.get())
                .setStaleConnectionCheckEnabled(STALE_CONNECTION_CHECK.get())
                .build();

        CloseableHttpAsyncClient httpClient = HttpAsyncClients.custom()
                .setSSLStrategy(sslSessionStrategy)
                .setConnectionManager(connectionManager)
                .setDefaultRequestConfig(requestConfig)
                .build();

        httpClient.start();

        // use httpClient...
    }

    private static class AllowAll implements X509HostnameVerifier
    {
        @Override
        public void verify(String s, SSLSocket sslSocket) throws IOException
        {}

        @Override
        public void verify(String s, X509Certificate x509Certificate) throws SSLException {}

        @Override
        public void verify(String s, String[] strings, String[] strings2) throws SSLException
        {}

        @Override
        public boolean verify(String s, SSLSession sslSession)
        {
            return true;
        }
    }
}
5

Für diejenigen, die Debian und vorgepacktes Java mögen:

Sudo mkdir /usr/share/ca-certificates/test/  # don't mess with other certs
Sudo cp ~/tmp/test.loc.crt /usr/share/ca-certificates/test/
Sudo dpkg-reconfigure --force ca-certificates  # check your cert in curses GUI!
Sudo update-ca-certificates --fresh --verbose

Vergessen Sie nicht, /etc/default/cacerts zu überprüfen:

# enable/disable updates of the keystore /etc/ssl/certs/Java/cacerts
cacerts_updates=yes

Cert entfernen:

Sudo rm /usr/share/ca-certificates/test/test.loc.crt
Sudo rm /etc/ssl/certs/Java/cacerts
Sudo update-ca-certificates --fresh --verbose
4
gavenkoa

Gehen Sie nur für Windows folgendermaßen vor:

  1. In Chrome gehen Sie zu den Einstellungen. 
  2. Klicken Sie unter Einstellungen auf Erweiterte Einstellungen anzeigen. 
  3. Klicken Sie unter HTTPS/SSL auf Zertifikate verwalten. 
  4. Exportieren Sie Ihr Zertifikat. 
  5. Bei Windows-Suchen (Drücken der Windows-Taste auf der Tastatur) geben Sie Java ein. 
  6. Wählen Sie die Option (Java konfigurieren), um die Java-Systemsteuerung zu öffnen 
  7. Wählen Sie in Java Control Panel die Registerkarte Sicherheit 
  8. Wählen Sie Zertifikate verwalten aus 
  9. Klicken Sie auf Importieren 
  10. Unter (Benutzer) Registerkarte ausgewählt und Zertifikatstyp als (Vertrauenswürdige Zertifikate) 
  11. Klicken Sie auf die Schaltfläche "Importieren", navigieren Sie zum heruntergeladenen Zertifikat und importieren Sie es.
4
Praveen

Die Ursache dieses Fehlers in meiner Apache 2.4-Instanz (mit einem Comodo-Wildcard-Zertifikat) war ein unvollständiger Pfad zum SHA-1-signierten Stammzertifikat. Das ausgestellte Zertifikat enthielt mehrere Ketten, und der Kette, die zu einem SHA-1-Stammzertifikat führte, fehlte ein Zwischenzertifikat . Moderne Browser wissen, wie man damit umgeht, aber Java 7 behandelt es standardmäßig nicht (obwohl es einige komplizierte Wege gibt, dies im Code zu erreichen). Das Ergebnis sind Fehlermeldungen, die identisch mit den selbstsignierten Zertifikaten aussehen:

Caused by: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at Sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.Java:196)
    at Java.security.cert.CertPathBuilder.build(CertPathBuilder.Java:268)
    at Sun.security.validator.PKIXValidator.doBuild(PKIXValidator.Java:380)
    ... 22 more

In diesem Fall wird aufgrund des fehlenden Zwischenzertifikats die Nachricht "Kein gültiger Zertifizierungspfad zum angeforderten Ziel gefunden" angezeigt. Sie können mit SSL Labs test anhand des Servers prüfen, welches Zertifikat fehlt. Wenn Sie das entsprechende Zertifikat gefunden haben, laden Sie es herunter und fügen es (falls der Server unter Ihrer Kontrolle steht) dem Zertifikatpaket hinzu. Alternativ können Sie das fehlende Zertifikat lokal importieren. Das Beheben dieses Problems auf dem Server ist eine allgemeinere Lösung für das Problem.

4
vallismortis

Dies kann auch durch die Verwendung von GoDaddy-Zertifikaten mit Java 7 verursacht werden, die mit SHA2 signiert sind.

Chrome und alle anderen Browser lehnen SSL-Zertifikate ab, die mit SHA1 signiert wurden, da dies nicht so sicher ist. 

Weitere Informationen zum Problem finden Sie hier sowie Informationen zur Behebung des Problems auf Ihrem Server.

2
Brad Parks

AVG-Version 18.1.3044 (mit Windows 10) stört meine lokale Spring-Anwendung. 

Lösung: Geben Sie im Abschnitt AVG "Web und E-Mail" ein und deaktivieren Sie den "E-Mail-Schutz" AVG blockiert das Zertifikat, wenn die Site nicht sicher ist.

2
Insoft

UPDATE: Dass ein Neustart half, war zufällig (ich hatte gehofft, Hurra!). Die eigentliche Ursache des Problems war folgende: Wenn Gradle angewiesen wird, einen bestimmten Schlüsselspeicher zu verwenden, muss dieser Schlüsselspeicher auch alle offiziellen Stammzertifikate enthalten. Andernfalls kann nicht auf Bibliotheken aus regulären Repositorys zugegriffen werden. Was ich tun musste, war folgendes:

Importieren Sie das selbstsignierte Zertifikat:

keytool -import -trustcacerts -alias myselfsignedcert -file /Users/me/Desktop/selfsignedcert.crt -keystore ./privateKeystore.jks

Fügen Sie die offiziellen Stammzertifikate hinzu:

keytool -importkeystore -srckeystore <Java-home>/lib/security/cacerts -destkeystore ./privateKeystore.jks

Vielleicht störte auch der Gradle-Daemon. Könnte es wert sein, alle laufenden Daemons zu töten, die mit ./gradlew --status gefunden wurden, wenn die Dinge düster aussehen.

ORIGINALPOSTING:

Niemand wird das glauben, ich weiß. Wenn alles andere fehlschlägt, probieren Sie es aus: Nach einem Neustart meines Macs war das Problem verschwunden. Grrr.

Hintergrund: ./gradlew jar gab mir immer wieder an, "dass kein gültiger Zertifizierungspfad zum angeforderten Ziel gefunden werden konnte"

Ich bin mit einem selbstsignierten Zertifikat verbunden, das vom Browser gespeichert und in privateKeystore.jks importiert wird. Dann wies Gradle an, mit privateKeystore.jks zu arbeiten:

org.gradle.jvmargs=-Djavax.net.debug=SSL -Djavax.net.ssl.trustStore="/Users/me/IntelliJ/myproject/privateKeystore.jks"  -Djavax.net.ssl.trustStorePassword=changeit

Wie gesagt, das funktionierte nur nach einem Neustart.

2
StaticNoiseLog

Ich hatte das gleiche Problem mit dem Zertifikatsfehler und lag an SNI, und der von mir verwendete http-Client hatte kein SNI. Ein Versions-Update hat also funktioniert

   <dependency>
        <groupId>org.Apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.3.6</version>
    </dependency>
1
Radu Toader

Sie haben zwei Optionen: Importieren Sie das selbstsignierte Zertifikat in den Java-Keystore für jede Jvm, auf der die Software ausgeführt wird, oder versuchen Sie es mit der nicht validierenden SSL-Factory:

jdbc:postgresql://myserver.com:5432/mydatabasename?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
1
Pradip Das

In meinem Fall hatten sowohl der Keystore als auch der Truststore dasselbe Zertifikat. Das Entfernen des Truststores hat also geholfen. Manchmal kann die Zertifikatskette ein Problem sein, wenn Sie mehrere Kopien von Zertifikaten haben.

0
Smart Coder

Stellen Sie sicher, dass das https://176.66.3.69:6443/ ein gültiges Zertifikat besitzt Sie können es zuerst über den Browser überprüfen.  https not secure Wenn es im Browser funktioniert, wird es in Java funktionieren.

das arbeitet für mich

0
Amr Ibrahim

Dies löste mein Problem,

Wir müssen das cert in das lokale Java importieren. Wenn nicht, könnten wir die folgende Ausnahme erhalten.

 javax.net.ssl.SSLHandshakeException: Sun.security.validator.ValidatorException: PKIX-Pfaderstellung fehlgeschlagen: Sun.security.provider.certpath.SunCertPathBuilderException: Es wurde kein gültiger Zertifizierungspfad zum angeforderten Ziel gefunden 
 bei Sun.security.ssl.Alerts.getSSLException (Alerts.Java:192) 
 at Sun.security.ssl.SSLSocketImpl.fatal (SSLSocketImpl.Java:1949) 
 at Sun.security.ssl.Handshaker.fatalSE (Handshaker.Java:302) 

SSLPOKE ist ein Tool, mit dem Sie die https-Verbindung von Ihrem lokalen Computer aus testen können.

Befehl zum Testen der Verbindung:

"%Java_HOME%/bin/Java" SSLPoke <hostname> 443
 Sun.security.validator.ValidatorException: PKIX-Pfaderstellung fehlgeschlagen: 
 Sun.security.provider.certpath.SunCertPathBuilderException: Es wurde kein gültiger Zertifizierungspfad für das angeforderte Ziel gefunden 
 at Sun.security.validator.PKIXValidator.doBuild (PKIXValidator.Java:387) 
 at Sun.security.validator.PKIXValidator.engineValidate (PKIXValidator.Java:292) 
 bei Sun.security.validator.Validator.validate (Validator.Java:260) 
 at Sun.security.ssl.X509TrustManagerImpl.validate (X509TrustManagerImpl.Java:324) 
 at Sun.security.ssl.X509TrustManagerImpl.checkTrusted (X509TrustManagerImpl.Java:229) 
 at Sun.security.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.Java:124) 
 at Sun.security.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.Java:1496) 
 at Sun.security.ssl.ClientHandshaker.processMessage (ClientHandshaker.Java:216) 
 at Sun.security.ssl.Handshaker.processLoop (Handshaker.Java:1026) 
 at Sun.security.ssl.Handshaker.process_record (Handshaker.Java:961) 
 at Sun.security.ssl.SSLSocketImpl.readRecord (SSLSocketImpl.Java:1062) 
 at Sun.security.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.Java:1375) 
 at Sun.security.ssl.SSLSocketImpl.writeRecord (SSLSocketImpl.Java:747) 
 at Sun.security.ssl.AppOutputStream.write (AppOutputStream.Java:123) 
 at Sun.security.ssl.AppOutputStream.write (AppOutputStream.Java:138) 
 bei SSLPoke.main (SSLPoke.Java:31) 
 Verursacht durch: Sun.security.provider.certpath.SunCertPathBuilderException: Es kann kein gültiger Zertifizierungspfad für .__ gefunden werden. angefordertes Ziel 
 unter Sun.security.provider.certpath.SunCertPathBuilder.build (SunCertPathBuilder.Java:141) 
 at Sun.security.provider.certpath.SunCertPathBuilder.engineBuild (SunCertPathBuilder.Java:126) 
 bei Java.security.cert.CertPathBuilder.build (CertPathBuilder.Java:280) 
 at Sun.security.validator.PKIXValidator.doBuild (PKIXValidator.Java:382) 
 ... 15 mehr 
keytool -import -alias brinternal -keystore "%Java_HOME%/jre/lib/security/cacerts" -file <cert path>

dies würde zuerst zur Eingabe von "Keystore-Kennwort eingeben" führen: "changeeit" ist das Standardkennwort. und schließlich eine Eingabeaufforderung "Vertrauen Sie diesem Zertifikat? [Nein]:", geben Sie "Ja" an, um das Zertifikat zum Keystore hinzuzufügen.

Verfication:

C:\tools>"%Java_HOME%/bin/Java" SSLPoke <hostname> 443
Successfully connected    
0
Naveen

laden Sie zunächst das SSL-Zertifikat herunter, und wechseln Sie dann zu Ihrem Java-Bin-Pfad. Führen Sie den folgenden Befehl in der Konsole aus.

C:\Java\JDK1.8.0_66-X64\bin>keytool -printcert -file C:\Users\lova\openapi.cer -keystore openapistore
0
Lova Chittumuri
0
Bogdan Ustyak

In meinem Fall verwende ich MacOs High Sierra mit Java 1.6. Die Cacert-Datei befindet sich an einem anderen Ort als oben in der Antwort von Gabe Martin-Dempesy angegeben. Die cacert-Datei war auch bereits mit einem anderen Speicherort verknüpft (/ Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts). 

Mit FireFox habe ich das Zertifikat von der betreffenden Website in eine lokale Datei mit dem Namen "exportedCertFile.crt" exportiert. Von dort aus habe ich das Zertifikat mit keytool in die cacert-Datei verschoben. Das Problem wurde behoben.

bash-3.2# cd /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/
bash-3.2# keytool -importcert -file ~/exportedCertFile.crt -alias example -keystore cacerts -storepass changeit
0
Alan Curtis