386 Stimmen

Java: sun.security.provider.certpath.SunCertPathBuilderException: es konnte kein gültiger Zertifikatspfad zum angeforderten Ziel gefunden werden

Ich habe eine Klasse, die eine Datei von einem https Server herunterlädt. Wenn ich es ausführe, werden viele Fehler zurückgegeben. Es scheint, dass ich ein Problem mit meinem Zertifikat habe. Ist es möglich, die Client-Server-Authentifizierung zu ignorieren? Wenn ja, 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-Abfrage: " + uri.toString());

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

            Boolean result = future.get();
            if (result != null && result.booleanValue()) {
                System.out.println("\nAnforderung erfolgreich ausgeführt");
            } else {
                System.out.println("Anforderung fehlgeschlagen");
            }              
        } 
        catch(Exception e){
            System.out.println("[DownloadFile] Ausnahme: " + e.getMessage());
        }
        finally {
            System.out.println("Herunterfahren");
            httpclient.shutdown();
        }
        System.out.println("Fertig");  

    }

    static class ResponseCallback extends AsyncCharConsumer {

        @Override
        protected void onResponseReceived(final HttpResponse response) {
             System.out.println("Antwort: " + 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] Ausnahme: " + 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] Ausnahme: " + e.getMessage());
            }
        }

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

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

    }
}

Fehler:

URI-Abfrage: 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-Fehler: Allgemeines SSLEngine-Problem
javax.net.ssl.SSLHandshakeException: Allgemeines 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)
Verursacht durch: javax.net.ssl.SSLHandshakeException: Allgemeines SSLEngine-Problem
    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$DelegatedTask.run(Unknown Source)
    at org.apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.java:180)
    ... 9 more
Verursacht durch: 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] Ausnahme: javax.net.ssl.SSLHandshakeException: Allgemeines SSLEngine-Problem
Herunterfahren
Fertig

5 Stimmen

Einmal habe ich diesen Fehler bekommen und unser Sicherheitsteam kontaktiert, und es stellte sich heraus, dass ich das JAR patchen musste, das wir verwendet haben, da unser Team ein veraltetes von der Firma bereitgestelltes benutzte. Nur als Information für alle anderen, die sich in einer ähnlichen Situation befinden könnten.

0 Stimmen

Ich habe dieses PKIX-Problem in zwei Fällen erhalten, beim Herunterladen der Maven-Abhängigkeit direkt aus dem Internet anstelle des Caches meiner Organisation. Dies wurde durch die Korrektur der setting.xml-Datei behoben. Das zweite Mal hatte ich dieses Problem, als ich versuchte, auf Microsoft URI für oAuth-Token zuzugreifen. Dies wurde durch Hinzufügen der cacert-Datei in meinen JDK-Pfad behoben.

1voto

Amr Ibrahim Punkte 1809

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

das funktioniert für mich

0 Stimmen

Und was soll ich tun, wenn der Browser auch noch meckert?

0 Stimmen

Versuche das Zertifikat zu installieren

0 Stimmen

In meinem Fall ist der Browser in Ordnung, aber ich erhalte immer noch einen Fehler in Java.

1voto

Marek Manduch Punkte 2052

Da die ursprüngliche Frage war, wie man den Zertifikatsfehler ignoriert, hier ist die Lösung für diejenigen, die SpringBoot und RestTemplate verwenden

@Service
public class SomeService {

    private final RestTemplate restTemplate;

    private final ObjectMapper objectMapper;    

    private static HttpComponentsClientHttpRequestFactory createRequestFactory() {
        try {
            SSLContextBuilder sslContext = new SSLContextBuilder();
            sslContext.loadTrustMaterial(null, new TrustAllStrategy());
            CloseableHttpClient client = HttpClients.custom().setSSLContext(sslContext.build()).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).build();
            HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
            requestFactory.setHttpClient(client);
            return requestFactory;
        } catch (KeyManagementException | KeyStoreException | NoSuchAlgorithmException var3) {
            throw new IllegalStateException("Konnte HTTP-Request-Factory zum Ignorieren der SSL-Zertifikatsgültigkeit nicht erstellen: ", var3);
        }
    }

    @Autowired
    public SomeService(RestTemplate restTemplate, ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
        this.dimetorURL = dimetorURL;
        restTemplate.setRequestFactory(createRequestFactory());
    }

    public ResponseEntity sendRequest(RequestObject requestObject) {
        //...
        return restTemplate.exchange(url, HttpMethod.GET, ResponseObject.class);
        //...
    }
}

0 Stimmen

Behoben das SSL-Problem in meinem Fall, danke!

1voto

Bastien Gallienne Punkte 115

Wenn Sie diesen Fehler in Maven oder Maven mit TestNG erhalten:

  1. Laden Sie das Zertifikat von der Zielwebsite herunter und installieren Sie das Zertifikat auf Ihrem Gerät (verwendend keytool wie oben vorgeschlagen, oder auf Windows)
  2. Fügen Sie den folgenden Inhalt zu den Maven-Argumenten hinzu (Befehlszeile und/oder IDE): -Djavax.net.ssl.trustStore=C:\Benutzer\me.keystore -Djavax.net.ssl.trustStorePassword=X wobei X das Passwort ist, das Sie im keytool-Schritt verwendet haben.

Hinweis: C:\Benutzer\me.keystore sollte auch auf Ihr Gerät abgestimmt sein. Zum Beispiel:

mvn -ea -Dtestng.dtd.http=true -Djavax.net.ssl.trustStore=C:\Benutzer\me\.keystore -Djavax.net.ssl.trustStorePassword=X -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true -Dcucumber.features=src/test/resources -Dcucumber.glue=com.myapp -Dcucumber.filter.tags="@MY_TEST"

1voto

Pradip Das Punkte 732

Sie haben zwei Optionen: Importieren Sie das selbstsignierte Zertifikat in den Keystore von Java für jede JVM, auf der die Software ausgeführt wird, oder versuchen Sie die nicht-validierende SSL-Fabrik:

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

1voto

Fabien Punkte 875

Das funktioniert auf jedem Betriebssystem, auf dem nur JDK installiert sein muss:

  1. Zertifikat vom Remote-Server herunterladen:

    keytool -printcert -rfc -sslserver > /tmp/remorte-cert.crt

  2. Zertifikat in den JDK-KeyStore importieren:

    keytool -importcert -file /tmp/remorte-cert.crt -alias -storepass changeit -keystore "${JAVA_HOME}/lib/security/cacerts" -noprompt

0 Stimmen

Was passiert, wenn die Website kein gültiges Zertifikat hat? Können Sie die Überprüfung des gültigen Zertifikats deaktivieren?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X