Java: Sun.Security.provider.certpath.suncertpathbuilderException: Kan geen geldig certificatiepad vinden naar aangevraagd doel

Ik heb een klasse die een bestand zal downloaden van een https -server. Wanneer ik het run, retourneert het veel fouten. Het lijkt erop dat ik een probleem heb met mijn certificaat. Is het mogelijk om de client-server-authenticatie te negeren? Zo ja, hoe?

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

Fouten:

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

Antwoord 1, autoriteit 100%

Het probleem treedt op wanneer uw server een zelfondertekend certificaat heeft. Om dit te omzeilen, kunt u dit certificaat toevoegen aan de lijst met vertrouwde certificaten van uw JVM.

In dit artikelbeschrijft de auteur hoe u het certificaat van uw browser en voeg het toe aan het cacerts-bestand van uw JVM. U kunt het bestand JAVA_HOME/jre/lib/security/cacertsbewerken of uw toepassing uitvoeren met de parameter -Djavax.net.ssl.trustStore. Controleer ook welke JDK/JRE u gebruikt, want dit is vaak een bron van verwarring.

Zie ook: Hoe worden SSL-certificaatservernamen opgelost/Kan ik alternatieve namen toevoegen met keytool?Als u java.security.cert.CertificateException: No name matching localhost founduitzondering.


Antwoord 2, autoriteit 68%

Dit is wat betrouwbaar voor mij werkt op macOS. Zorg ervoor dat u example.com en 443 vervangt door de daadwerkelijke hostnaam en poort waarmee u verbinding probeert te maken, en geef een aangepaste alias. De eerste opdracht downloadt het verstrekte certificaat van de externe server en slaat het lokaal op in x509-indeling. Het tweede commando laadt het opgeslagen certificaat in Java’s SSL trust store.

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

Antwoord 3, autoriteit 20%

Ik had hetzelfde probleem met een geldig ondertekend wildcardcertificaat van symantec.

Probeer eerst uw Java-toepassing uit te voeren met -Djavax.net.debug=SSLom te zien wat er werkelijk aan de hand is.

Ik heb uiteindelijk het tussenliggende certificaat geïmporteerdwaardoor de certificaatketen kapot ging.

Ik heb het ontbrekende tussencertificaat van symantec gedownload (je kunt de downloadlink naar het ontbrekende certificaat zien in het ssl-handshake-logboek: http://svrintl-g3-aia.verisign.com/SVRIntlG3.cerin mijn geval).

En ik heb het certificaat geïmporteerd in de java keystore. Na het importeren van het tussencertificaat begon mijn wildcard ssl-certificaat eindelijk te werken:

keytool -import -keystore ../jre/lib/security/cacerts -trustcacerts -alias "VeriSign Class 3 International Server CA - G3" -file /pathto/SVRIntlG3.cer

Antwoord 4, autoriteit 20%

  1. Exporteer het SSL-certificaat met Firefox. U kunt het exporteren door op de URL in de browser te klikken en vervolgens de optie te selecteren om het certificaat te exporteren. Laten we aannemen dat de naam van het certificaatbestand uw.ssl.server.naam.crt
  2. is

  3. Ga naar uw JRE_HOME/binof JDK/JRE/bin
  4. Typ de opdracht
  5. keytool -keystore ..\lib\security\cacerts -import -alias your.ssl.server.name -file .\relative-path-to-cert-file\your.ssl.server.name.crt
  6. Herstart uw Java-proces

Antwoord 5, autoriteit 12%

@Gabe Martin-Dempesy’s antwoord heeft me geholpen. En ik heb er een klein scriptje over geschreven. Het gebruik is heel eenvoudig.

Installeer een certificaat van host:

> sudo ./java-cert-importer.sh example.com

Verwijder het certificaat dat al is geïnstalleerd.

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

Antwoord 6, autoriteit 7%

Citaat uit Niet meer ‘kan geen geldig certificeringspad vinden naar het aangevraagde doel’

wanneer u probeert een SSL-verbinding met een host te openen met behulp van JSSE. Dit betekent meestal dat de server een testcertificaat gebruikt (mogelijk gegenereerd met keytool) in plaats van een certificaat van een bekende commerciële certificeringsinstantie zoals Verisign of GoDaddy. Webbrowsers geven in dit geval waarschuwingsvensters weer, maar aangezien JSSE niet kan aannemen dat er een interactieve gebruiker aanwezig is, genereert het standaard een uitzondering.

Certificaatvalidatie is een zeer belangrijk onderdeel van SSL-beveiliging, maar ik schrijf dit artikel niet om de details uit te leggen. Als je geïnteresseerd bent, kun je beginnen met het lezen van de Wikipedia-blurb. Ik schrijf dit bericht om een eenvoudige manier te laten zien om met die host te praten met het testcertificaat, als je dat echt wilt.

Kortom, u wilt het servercertificaat toevoegen aan de KeyStore met uw vertrouwde certificaten

Probeer de code die daar wordt gegeven. Het kan helpen.


Antwoord 7, autoriteit 3%

Dit heeft mijn probleem opgelost,

We moeten het certificaat importeren in de lokale Java. Als dat niet het geval is, kunnen we de onderstaande uitzondering krijgen.

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX-padopbouw mislukt: sun.security.provider.certpath.SunCertPathBuilderException: kan geen geldig certificeringspad naar het aangevraagde doel vinden
    op sun.security.ssl.Alerts.getSSLException (Alerts.java:192)
    op sun.security.ssl.SSLSocketImpl.fatal (SSLSocketImpl.java:1949)
    op sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)

SSLPOKEis een tool waarmee u kan de https-connectiviteit testen vanaf uw lokale computer.

Opdracht om de connectiviteit te testen:

"%JAVA_HOME%/bin/java" SSLPoke <hostname> 443
sun.security.validator.ValidatorException: PKIX-padopbouw mislukt:
  sun.security.provider.certpath.SunCertPathBuilderException: kan geen geldig certificeringspad naar het aangevraagde doel vinden
    op sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
    bij sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
bij Sun.security.Validator.validator.validate (Validator.java:260)
    bij SUN.SECURITY.SSL.X509TRUSTMANAGERIMPL.VALIDAATE (X509TRUSTMANAGERIMPL.JAVA:324)
    bij Sun.Security.Ssl.x509TrustManagerimppl.CheckTrusted (x509trustmanagerimppl.java:229)
    bij Sun.Security.Ssl.x509TrustManagerImpl.CheckServertrusted (X509TrustManagerimpl.java:124)
    bij Sun.Security.Ssl.ClientHANTHANDSSHAKER.SERVERCERTIFICATION (clienthandshaker.java:1496)
    bij Sun.Security.Ssl.ClientHandshaker.ProcessMessage (clienthandshaker.java:216)
    bij Sun.Security.Ssl.handshaker.processloop (Handshaker.java:1026)
    bij Sun.Security.Ssl.handshaker.process_record (Handshaker.java:961)
    bij Sun.Security.Ssl.SslSocketimpl.ReadRecord (SSLSOKETIMPL.JAVA:1062)
    bij Sun.Security.Ssl.SslSockoKImpl.PerformInitialhandshake (SSLSOKETIMPL.JAVA:1375)
    bij Sun.Security.Ssl.SslSocketimpl.WriterEcord (SSLSOKETIMPL.JAVA:747)
    bij Sun.Security.Ssl.appoutputStream.Write (AppoutPutstream.java:123)
    bij Sun.Security.Ssl.appoutputStream.Write (AppoutPutstream.java:138)
    bij sslpoke.main (sslpoke.java:31)
  Veroorzaakt door: Sun.Security.provider.certpath.suncertpathbuilderException: Kan geen geldige certificeringspad vinden
  gevraagd doelwit
    bij Sun.Security.provider.certpath.suncertpathbuilder.build (Suncertpathbuilder.java:141)
    bij Sun.Security.provider.certpath.suncertpathbuilder.EngineBuilder (Suncertpathbuilder.java:126)
    op java.security.cert.certpathbuilder.build (certpathbuilder.java:280)
    bij Sun.Security.Validator.pkixvalidator.dobuild (Pkixvalidator.java:382)
    ... 15 meer
keytool -import -alias <anyname> -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -file <cert path>

dit vraagt eerst om “Enter keystore password:” changeitis het standaardwachtwoord. en tot slot een prompt “Dit certificaat vertrouwen? [nee]:”, geef “ja” op om het certificaat toe te voegen aan de keystore.

Verificatie:

C:\tools>"%JAVA_HOME%/bin/java" SSLPoke <hostname> 443
Successfully connected    

Antwoord 8, autoriteit 2%

Ik kon het alleen met code werkend krijgen, d.w.z. geen keytool nodig:

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

Antwoord 9, autoriteit 2%

Alleen voor Windows, volg deze stappen:

  1. Ga in Chrome naar instellingen.
  2. Klik in Instellingen op geavanceerde instellingen weergeven.
  3. Klik onder HTTPS/SSL op Certificaten beheren.
  4. Exporteer uw certificaat.
  5. In Windows-zoekopdrachten (door op de Windows-toets op het toetsenbord te drukken) typt u java.
  6. Selecteer de optie (Java configureren) waarmee het Java-configuratiescherm wordt geopend
  7. Selecteer het tabblad Beveiliging in het Java-configuratiescherm
  8. Selecteer Certificaten beheren
  9. Klik op Importeren
  10. Onder (Gebruiker) tabblad geselecteerd en certificaattype als (Vertrouwde certificaten)
  11. Klik op de importknop en blader naar het gedownloade certificaat en importeer het.

Antwoord 10, autoriteit 2%

De bron van deze fout op mijn Apache 2.4-instantie (met een Comodo-wildcardcertificaat) was een onvolledig pad naar het SHA-1 ondertekende basiscertificaat. Er waren meerdere ketens in het uitgegeven certificaat en in de keten die leidde tot een SHA-1-rootcertificaat ontbrak een intermediair certificaat. Moderne browsers weten hoe ze hiermee om moeten gaan, maar Java 7 kan dit standaard niet aan (hoewel er een aantal ingewikkelde manieren zijn om dit in code te bereiken). Het resultaat zijn foutmeldingen die identiek lijken aan het geval van zelfondertekende certificaten:

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 dit geval wordt het bericht “Kan een geldig certificeringspad naar het aangevraagde doel” opgesteld “wordt geproduceerd vanwege het ontbrekende tussentijdse certificaat. U kunt controleren welk certificaat ontbreekt met behulp van SSL LABS Test tegen de server. Zodra u het juiste certificaat hebt gevonden, downloadt u en (als de server onder uw besturing staat) voeg deze toe aan de certificaatbundel. Als alternatief kunt u het ontbrekende certificaat lokaal importeren. Het opnemen van dit probleem op de server is een meer algemene oplossing voor het probleem.


Antwoord 11, Autoriteit 2%

Er is veel manier om dit op te lossen …

One Way is ingesteld op de TrustStore-certificaten in een keystore-bestand en plaatst u deze in het pad van de toepassing en stelt u deze systeemeigenschappen in de hoofdmethode in:

public static void main(String[] args) {
  System.setProperty("javax.net.ssl.trustStore", "trust-store.jks");
  System.setProperty("javax.net.ssl.trustStorePassword", "TrustStore");
  ...
}

Other Way is Plaats de KeyStore als resourcebestand in het project JAR-bestand en laadt het:

public static SSLContext createSSLContext(String resourcePath, String pass) throws NoSuchAlgorithmException, KeyStoreException, IOException, CertificateException, UnrecoverableKeyException, KeyManagementException {
  // initialise the keystore
  final char[] password = pass.toCharArray();
  KeyStore ks = KeyStore.getInstance("JKS");
  ks.load(ThisClass.class.getResourceAsStream(resourcePath
  ), password);
  // Setup the key manager factory.
  KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
  kmf.init(ks, password);
  // Setup the trust manager factory.
  TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
  tmf.init(ks);
  SSLContext sslc = SSLContext.getInstance("TLS");
  sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
  return sslc;
}
public static void main(String[] args) {
  SSLContext.setDefault(
    createSSLContext("/trust-store.jks", "TrustStore"));
  ...
}

In Windows kun je deze oplossing ook proberen: https://stackoverflow.com/a/59056537/980442


Ik heb het keystore-bestand gemaakt van een certificaatinstantie Ca .crtbestand op deze manier:

keytool -import -alias ca -keystore trust-store.jks -storepass TrustStore -trustcacerts -file ca.crt

FYI: https://docs.oracle.com/javadb/ 10.8.3.0/adminguide/cadminslclient.html


Antwoord 12, Autoriteit 2%

Voor degenen die van Debian en Voorverpakt Java houden:

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

Vergeet niet om /etc/default/cacertsVOOR:

te controleren

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

Om CERT te verwijderen:

sudo rm /usr/share/ca-certificates/test/test.loc.crt
sudo rm /etc/ssl/certs/java/cacerts
sudo update-ca-certificates --fresh --verbose

Antwoord 13

UPDATE:dat een herstart hielp was toeval (ik hoopte het, hoera!). De echte oorzaak van het probleem was dit: wanneer Gradle de opdracht krijgt om een specifieke keystore te gebruiken, moet die keystore ook alle officiële rootcertificaten bevatten. Anders heeft het geen toegang tot bibliotheken vanuit reguliere repositories. Wat ik moest doen was dit:

Importeer het zelfondertekende certificaat:

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

Voeg de officiële rootcertificaten toe:

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

Misschien stond de Gradle-daemon ook in de weg. Het kan de moeite waard zijn om alle actieve daemons die gevonden zijn met ./gradlew --statuste doden als de zaken er somber uit gaan zien.

ORIGINELE POSTEN:

Niemand zal dit geloven, dat weet ik. Maar als al het andere faalt, probeer het dan eens:
Na een rebootvan mijn Mac was het probleem verdwenen. Grrr.

Achtergrond:
./gradlew jar gaf me steeds “kan geen geldig certificeringspad naar het gevraagde doel vinden”

Ik zit vast met een zelfondertekend certificaat, opgeslagen vanuit de browser, geïmporteerd in privateKeystore.jks. Instrueerde Gradle vervolgens om met privateKeystore.jks te werken:

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

Zoals gezegd werkte dit alleen na een herstart.


Antwoord 14

Eenvoudige stappen die ik heb gevolgd.

probleem:ik probeerde verbinding te maken met een eindpunt (https://%s.blob.core.windows.net) met behulp van een eenvoudige java-klasse (hoofd methode).

Dus ik kreeg dit certificeringsprobleem zoals hierboven vermeld, in de vraag.

Oplossing:

  1. Verkrijg het certificaat met een browser (chrome). Plak hiervoor uw eindpunt-URL in de browser en voer in. Nu ziet u een slotpictogram, klik daarop –>certificaat–> details –> kopiëren naar bestanden–> download het.

  2. open de cmd (ik gebruik Windows) als admin en navigeer vervolgens naar de map waar je het .cer-bestand hebt gedownload.

3.(Optioneel)Als u meerdere JDK’s op dezelfde machine gebruikt, wijzigt u uw JDK-versie op dezelfde manier als u in uw toepassing gebruikt.

  1. Gebruik nu het onderstaande commando

keytool -import -alias mycertificate -keystore “C:\Program
Files\Java\jdk-11.0.5\lib\security\cacerts” -bestand mijnurlcrt.cer

  1. Geef het standaardwachtwoord: changeit

  2. Vertrouw dit certificaat: ja

En je bent klaar.

Bedankt!


Antwoord 15

Dit kan ook worden veroorzaakt door het gebruik van GoDaddy-certificaten met Java 7 die zijn ondertekend met SHA2.

Chrome en alle andere browsers beginnen SSL-certificaten die zijn ondertekend met SHA1 af te schaffen, omdat het niet zo veilig is.

Meer info over het probleem kunt u hier vinden, evenals hoe u het op uw server kunt oplossen als dat nodig is.


Antwoord 16

Ik had hetzelfde probleem met de certificatenfout en was vanwege SNI, en de http-client die ik gebruikte had geen SNI geïmplementeerd. Dus een versie-update deed het werk

  <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.3.6</version>
    </dependency>

Antwoord 17

AVG-versie 18.1.3044 (met Windows 10) interfereert met mijn lokale Spring-toepassing.

Oplossing:voer het AVG-gedeelte in met de naam “Web en e-mail” en schakel de “e-mailbeveiliging” uit.
AVG blokkeert het certificaat als de site niet veilig is.


Antwoord 18

Zorg ervoor dat de https://176.66.3.69:6443/een geldig certificaat hebben.
je kunt het eerst via de browser controleren als het in de browser werkt, werkt het ook in Java.

dat werkt voor mij


Antwoord 19

Je hebt twee opties, importeer het zelfondertekende certificaat in Java’s keystore voor elke jvm waarop de software zal draaien of probeer de niet-validerende ssl-fabriek:

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

Antwoord 20

Had het probleem zoals deze afbeelding.

Enkele oplossingen geprobeerd.
Maar ontdekte dat zelfs als het hetzelfde project is, wanneer het op de werkplek van iemand anders is, het helemaal goed is. Geen extra instellingen nodig. Dus we vermoedden dat het een milieuprobleem was. We hebben geprobeerd de JDK-versie, IDE te wijzigen, maar dit werkte niet. het duurde ongeveer 4 uur voor onderzoek, totdat we het best beoordeelde antwoord probeerden. Ik heb de in dat antwoord genoemde fout niet gevonden, maar ik vond via mijn browser over HTTP-URL (slot) dat er een certificering van Charles was. Toen realiseerde ik me dat mijn Charles de hele tijd aan was. Zolang ik dat uitzet, werkt het allemaal prima.

Dus ik heb mijn ervaring achtergelaten die nuttig zou kunnen zijn voor uw geval.


Antwoord 21

In mijn geval gebruik ik MacOs High Sierra met Java 1.6. Het cacert-bestand bevindt zich op een andere locatie dan hierboven vermeld in het antwoord van Gabe Martin-Dempesy. Het cacert-bestand was ook al gekoppeld aan een andere locatie (/Bibliotheek/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts).

Met FireFox heb ik het certificaat van de betreffende website geëxporteerd naar een lokaal bestand met de naam “exportedCertFile.crt”. Van daaruit heb ik keytool gebruikt om het certificaat naar het cacert-bestand te verplaatsen. Dit heeft het probleem verholpen.

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

Antwoord 22

Download eerst het ssl-certificaat en ga dan naar je java bin-pad en voer de onderstaande opdracht uit in de console.

C:\java\JDK1.8.0_66-X64\bin>keytool -printcert -file C:\Users\lova\openapi.cer -keystore openapistore

Antwoord 23

De oorspronkelijke vraag was: hoe de cert-fout te negeren, hier is een oplossing voor degenen die SpringBoot en RestTemplate gebruiken

@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("Couldn't create HTTP Request factory ignore SSL cert validity: ", var3);
        }
    }
    @Autowired
    public SomeService(RestTemplate restTemplate, ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
        this.dimetorURL = dimetorURL;
        restTemplate.setRequestFactory(createRequestFactory());
    }
    public ResponseEntity<ResponseObject> sendRequest(RequestObject requestObject) {
        //...
        return restTemplate.exchange(url, HttpMethod.GET, ResponseObject.class);
        //...
    }
}

Antwoord 24

Als je deze foutmelding krijgt in maven, of maven met TestNG:

  1. download het certificaat van de doelwebsite en installeer het certificaat op uw computer (met behulp van keytool zoals hierboven gesuggereerd, of op Windows)
  2. Voeg de volgende inhoud toe aan de MAVEN-argumenten (opdrachtregel en / of ide):
    -Djavax.net.ssl.truststore = C: \ gebruikers \ ME.Keystore -djavax.net.ssl.truststoreepassword = x
    Waarbij X het wachtwoord is dat u in de KeyTool-stap hebt gebruikt.

OPMERKING: C: \ gebruikers \ ME.KeyStoets moet ook worden ingesteld om overeen te komen met uw machine.
Bijvoorbeeld:

mvn -ea -Dtestng.dtd.http=true  -Djavax.net.ssl.trustStore=C:\Users\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"

Antwoord 25

In mijn geval had ik allebei keystore als Truststore met hetzelfde certificaat, dus het verwijderen van TrustStore hielp. Soms kan de keten van certificaten een probleem zijn als u meerdere exemplaren van certificaten hebt.

Other episodes