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 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
java
ssl
https
ssl-certificate
neztreh
quelle
quelle
Antworten:
Das Problem tritt auf, wenn Ihr Server über ein selbstsigniertes Zertifikat verfügt. Um dies zu umgehen, können Sie dieses Zertifikat zur Liste der vertrauenswürdigen Zertifikate Ihrer JVM hinzufügen.
In diesem Artikel beschreibt der Autor, 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-Djavax.net.ssl.trustStore
Parametern ausführen . Überprüfen Sie, welches JDK / JRE Sie ebenfalls verwenden, da dies häufig zu Verwirrung führt.Siehe auch: Wie werden SSL-Zertifikatservernamen aufgelöst? / Kann ich mithilfe von Keytool alternative Namen hinzufügen? Wenn Sie auf eine
java.security.cert.CertificateException: No name matching localhost found
Ausnahme stoßen.quelle
cacerts
müssen aktualisiert werdenFolgendes funktioniert für mich unter macOS zuverlässig. Stellen Sie sicher, dass Sie example.com und 443 durch den tatsächlichen Hostnamen und Port ersetzen, zu dem Sie eine Verbindung herstellen möchten, und geben Sie einen benutzerdefinierten Alias an. Der erste Befehl lädt das bereitgestellte Zertifikat vom Remote-Server herunter und speichert es lokal im x509-Format. Der zweite Befehl lädt das gespeicherte Zertifikat in den SSL-Vertrauensspeicher von Java.
quelle
Ich hatte das gleiche Problem mit einem gültigen signierten Platzhalterzertifikat von symantec.
Versuchen Sie zunächst, Ihre Java-Anwendung mit -Djavax.net.debug = SSL auszuführen, um zu sehen, was wirklich los ist.
Am Ende habe ich das Zwischenzertifikat importiert, wodurch die Zertifikatskette unterbrochen wurde.
Ich habe das fehlende Zwischenzertifikat von symantec heruntergeladen (Sie können den Download-Link zum fehlenden Zertifikat im SSL-Handshake-Protokoll sehen: in meinem Fall http://svrintl-g3-aia.verisign.com/SVRIntlG3.cer ).
Und ich habe das Zertifikat in den Java-Keystore importiert. Nach dem Import des Zwischenzertifikats funktionierte mein Wildcard-SSL-Zertifikat endlich:
quelle
-Djavax.net.debug=ssl,handshake -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.keyStore=our-client-certs -Djavax.net.ssl.trustStoreType=jks -Djavax.net.ssl.trustStore=their-server-certs
JRE_HOME/bin
oderJDK/JRE/bin
keytool -keystore ..\lib\security\cacerts -import -alias your.ssl.server.name -file .\relative-path-to-cert-file\your.ssl.server.name.crt
quelle
changeit
( stackoverflow.com/a/22782035/1304830 ). Stellen Sie außerdem sicher, dass Sie cmd als Administrator ausführen.@ Gabe Martin-Dempesys Antwort wird mir geholfen. Und ich habe ein kleines Skript dazu geschrieben. Die Bedienung ist sehr einfach.
Installieren Sie ein Zertifikat vom Host:
Entfernen Sie das bereits installierte Zertifikat.
java-cert-importer.sh
quelle
./java-cert-importer.sh example.com 1234
. B. ). Das ist es.Zitat aus Nicht mehr "Es kann kein gültiger Zertifizierungspfad zum angeforderten Ziel gefunden werden".
Probieren Sie den dort angegebenen Code aus. Es könnte helfen.
quelle
Dies löste mein Problem,
Wir müssen das Zertifikat in das lokale Java importieren. Wenn nicht, könnten wir die folgende Ausnahme bekommen.
SSLPOKE ist ein Tool, mit dem Sie die https-Konnektivität von Ihrem lokalen Computer aus testen können.
Befehl zum Testen der Konnektivität:
Dies würde zuerst zur Eingabe von "Keystore-Passwort eingeben:"
changeit
als Standardkennwort führen. und schließlich eine Eingabeaufforderung "diesem Zertifikat vertrauen? [nein]:", geben Sie "ja" an, um das Zertifikat zum Keystore hinzuzufügen.Verfeinerung:
quelle
Ich konnte es nur mit Code zum Laufen bringen, dh ich musste kein Keytool verwenden:
quelle
Die Ursache für diesen Fehler auf meiner Apache 2.4-Instanz (unter Verwendung eines Comodo-Platzhalterzertifikats) war ein unvollständiger Pfad zum von 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 geht standardmäßig nicht damit um (obwohl es einige verschlungene Möglichkeiten gibt, dies im Code zu erreichen). Das Ergebnis sind Fehlermeldungen, die mit selbstsignierten Zertifikaten identisch sind:
In diesem Fall wird aufgrund des fehlenden Zwischenzertifikats die Meldung "Kein gültiger Zertifizierungspfad zum angeforderten Ziel gefunden" angezeigt. Sie können überprüfen, welches Zertifikat fehlt, indem Sie den SSL Labs- Test für den Server durchführen. Wenn Sie das entsprechende Zertifikat gefunden haben, laden Sie es herunter und fügen Sie es (sofern der Server unter Ihrer Kontrolle steht) dem Zertifikatspaket hinzu. Alternativ können Sie das fehlende Zertifikat lokal importieren. Die Behebung dieses Problems auf dem Server ist eine allgemeinere Lösung des Problems.
quelle
Führen Sie die folgenden Schritte nur für Windows aus:
quelle
Für diejenigen, die Debian und vorverpacktes Java mögen:
Vergessen Sie nicht zu prüfen
/etc/default/cacerts
auf:So entfernen Sie cert:
quelle
Dies kann auch durch die Verwendung von GoDaddy-Zertifikaten mit Java 7 verursacht werden, die mit SHA2 signiert sind.
Chrome und alle anderen Browser beginnen, mit SHA1 signierte SSL-Zertifikate zu verwerfen, da diese nicht so sicher sind.
Weitere Informationen zu diesem Problem finden Sie hier sowie Informationen zur Behebung auf Ihrem Server, falls dies jetzt erforderlich ist.
quelle
Ich hatte das gleiche Problem mit dem Zertifikatfehler und lag an SNI, und der von mir verwendete http-Client hatte SNI nicht implementiert. Also hat ein Versionsupdate den Job gemacht
quelle
UPDATE: Dass ein Neustart geholfen hat, war zufällig (ich habe es 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 es nicht über reguläre Repositorys auf Bibliotheken zugreifen. Was ich tun musste war folgendes:
Importieren Sie das selbstsignierte Zertifikat:
Fügen Sie die offiziellen Stammzertifikate hinzu:
Vielleicht ist auch der Gradle-Dämon in die Quere gekommen. Könnte es wert sein, alle laufenden Dämonen zu töten, die gefunden wurden,
./gradlew --status
wenn die Dinge düster aussehen.ORIGINAL POSTING:
Niemand wird das glauben, ich weiß. Wenn alles andere fehlschlägt, probieren Sie es trotzdem aus: Nach einem Neustart meines Mac war das Problem behoben. Grrr.
Hintergrund: ./gradlew jar gab mir immer wieder die Meldung "Ich konnte keinen gültigen Zertifizierungspfad zum angeforderten Ziel finden".
Ich habe ein selbstsigniertes Zertifikat, das vom Browser gespeichert und in privateKeystore.jks importiert wurde. Dann wies Gradle an, mit privateKeystore.jks zu arbeiten:
Wie bereits erwähnt, funktionierte dies erst nach einem Neustart.
quelle
Die AVG-Version 18.1.3044 (unter Windows 10) stört meine lokale Spring-Anwendung.
Lösung: Geben Sie in den AVG-Bereich "Web und E-Mail" ein und deaktivieren Sie den "E-Mail-Schutz". AVG blockiert das Zertifikat, wenn die Site nicht sicher ist.
quelle
Stellen Sie sicher, dass https://176.66.3.69:6443/ über ein gültiges Zertifikat verfügt. Sie können es zuerst über den Browser überprüfen, wenn es im Browser funktioniert, funktioniert es in Java.
das funktioniert bei mir
quelle
Es gibt viele Möglichkeiten, dies zu lösen ...
Eine Möglichkeit besteht darin, die TrustStore-Zertifikate in einer Keystore-Datei festzulegen, sie in den Pfad der Anwendung einzufügen und diese Systemeigenschaften in der Hauptmethode festzulegen:
Eine andere Möglichkeit besteht darin, den Schlüsselspeicher als Ressourcendatei in die Projekt-JAR-Datei zu platzieren und zu laden:
In Windows können Sie diese Lösung auch ausprobieren: https://stackoverflow.com/a/59056537/980442
Ich habe die Keystore-Datei auf folgende Weise aus einer CA-
.crt
Datei der Zertifizierungsstelle erstellt :Zu Ihrer Information: https://docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
quelle
Sie haben zwei Möglichkeiten: Importieren Sie das selbstsignierte Zertifikat für jeden JVM, auf dem die Software ausgeführt wird, in den Java-Keystore oder versuchen Sie es mit der nicht validierenden SSL-Factory:
quelle
Hatte das Problem wie dieses Bild.
Versuchte ein paar Lösungen. Aber festgestellt, dass selbst wenn es dasselbe Projekt ist, wenn es am Arbeitsplatz eines anderen ist, es völlig in Ordnung ist. Keine zusätzlichen Einstellungen erforderlich. Wir haben also vermutet, dass es sich um ein Umweltproblem handelt. Wir haben versucht, die JDK-Version IDE zu ändern, aber es hat nicht funktioniert. Die Untersuchung dauerte ungefähr 4 Stunden, bis wir die am besten bewertete Antwort versuchten. Ich habe den in dieser Antwort erwähnten Fehler nicht gefunden, aber über meinen Browser über die HTTP-URL (Sperre) festgestellt, dass eine Zertifizierung von Charles vorliegt. Dann wurde mir klar, dass meine Charles die ganze Zeit an waren. Solange ich das ausgeschaltet habe, funktioniert alles einwandfrei.
Also habe ich meine Erfahrung hinterlassen, die für Ihren Fall hilfreich sein könnte.
quelle
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 Keytool verwendet, um das Zertifikat in die Cacert-Datei zu verschieben. Dies hat das Problem behoben.
quelle
Laden Sie zuerst das SSL-Zertifikat herunter und gehen Sie dann zu Ihrem Java-Bin-Pfad. Führen Sie den folgenden Befehl in der Konsole aus.
quelle
In meinem Fall hatten sowohl der Keystore als auch der Truststore dasselbe Zertifikat, sodass das Entfernen des Truststores hilfreich war. Manchmal kann die Zertifikatskette ein Problem sein, wenn Sie mehrere Kopien von Zertifikaten haben.
quelle