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
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.
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
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
JRE_HOME/bin
oder JDK/JRE/bin
keytool -keystore ..\lib\security\cacerts -import -alias your.ssl.server.name -file .\relative-path-to-cert-file\your.ssl.server.name.crt
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.
@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;
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;
}
}
}
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
Gehen Sie nur für Windows folgendermaßen vor:
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.
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.
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.
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.
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>
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
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.
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. Wenn es im Browser funktioniert, wird es in Java funktionieren.
das arbeitet für mich
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
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
So konnte ich das Problem beheben: http://code.naishe.in/2011/07/looks-like-article-no-more-unable-to.html
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