Bearbeiten: - Versucht, die Frage und die akzeptierte Antwort in meinem Blog auf präsentablere Weise zu formatieren
Hier ist die Originalausgabe.
Ich erhalte diesen Fehler:
Detaillierte Meldung sun.security.validator.ValidatorException: PKIX-Pfaderstellung fehlgeschlagen:
sun.security.provider.certpath.SunCertPathBuilderException: Es konnte kein gültiger Zertifizierungspfad zum angeforderten Ziel gefunden werdenUrsache javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX-Pfaderstellung fehlgeschlagen: sun.security.provider.certpath.SunCertPathBuilderException: Es konnte kein gültiger Zertifizierungspfad zum angeforderten Ziel gefunden werden
Ich benutze Tomcat 6 als Webserver. Ich habe zwei HTTPS-Webanwendungen auf verschiedenen Tomcats an verschiedenen Ports, aber auf demselben Computer installiert. Sag App1(port 8443)
und
App2(port 443)
. App1
verbindet sich mit App2
. Beim App1
Herstellen einer Verbindung App2
erhalte ich den obigen Fehler. Ich weiß, dass dies ein sehr häufiger Fehler ist, daher bin ich auf viele Lösungen in verschiedenen Foren und auf Websites gestoßen. Ich habe den folgenden Eintrag in server.xml
beiden Tomcats:
keystoreFile="c:/.keystore"
keystorePass="changeit"
Jede Site gibt den gleichen Grund an, warum sich das von app2 erteilte Zertifikat nicht im vertrauenswürdigen Speicher von app1 jvm befindet. Dies scheint auch zuzutreffen, wenn ich versucht habe, dieselbe URL im IE-Browser aufzurufen. Es funktioniert (beim Erwärmen liegt ein Problem mit dem Sicherheitszertifikat dieser Website vor. Hier sage ich, fahren Sie mit dieser Website fort). Aber wenn dieselbe URL vom Java-Client getroffen wird (in meinem Fall), erhalte ich den obigen Fehler. Um es in den Truststore zu stellen, habe ich diese drei Optionen ausprobiert:
Option 1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Option2 Einstellung unten in der Umgebungsvariablen
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Option3 Einstellung unten in der Umgebungsvariablen
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Aber nichts hat funktioniert .
Was zuletzt funktioniert hat, ist die Ausführung des in Wie behandelt man ungültige SSL-Zertifikate mit Apache HttpClient vorgeschlagenen Java-Ansatzes ? von Pascal Thivent dh das Programm InstallCert ausführen.
Dieser Ansatz ist jedoch für das Devbox-Setup in Ordnung, aber ich kann ihn in der Produktionsumgebung nicht verwenden.
Ich frage mich , warum drei Ansätze oben genannten nicht funktioniert , wenn ich die gleichen Werte in erwähnt server.xml
von app2
Server und gleichen Werte in - Vertrauen durch Einstellung
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
im app1
Programm.
Für weitere Informationen stelle ich folgende Verbindung her:
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
if (conn instanceof HttpsURLConnection) {
HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();
conn1.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
reply.load(conn1.getInputStream());
domainname
meine RHEL-Server richtig eingestellt hatte, war das Problem behoben. Hoffe es hilft jemandem.Antworten:
Sie müssen das Zertifikat für App2 zur Truststore-Datei der verwendeten JVM unter hinzufügen
%JAVA_HOME%\lib\security\cacerts
.Zuerst können Sie überprüfen, ob sich Ihr Zertifikat bereits im Truststore befindet, indem Sie den folgenden Befehl ausführen:
keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"
(Sie müssen kein Kennwort angeben )Wenn Ihr Zertifikat fehlt, können Sie es herunterladen, indem Sie es mit Ihrem Browser herunterladen und mit dem folgenden Befehl zum Truststore hinzufügen:
keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password>
Nach dem Import können Sie den ersten Befehl erneut ausführen, um zu überprüfen, ob Ihr Zertifikat hinzugefügt wurde.
Sun / Oracle-Informationen finden Sie hier .
quelle
keytool error: java.io.FileNotFoundException ... (Access is denied)
wenn Sie versuchen, Ihr Zertifikat zu importieren.• Als ich den Fehler erhielt, habe ich versucht, die Bedeutung des Ausdrucks bei Google herauszufinden. Dieses Problem tritt auf, wenn ein Server sein HTTPS-SSL-Zertifikat ändert und unsere ältere Java-Version die Stammzertifizierungsstelle (CA) nicht erkennt. .
• Wenn Sie in Ihrem Browser auf die HTTPS-URL zugreifen können, können Sie Java aktualisieren, um die Stammzertifizierungsstelle zu erkennen.
• Wechseln Sie in Ihrem Browser zu der HTTPS-URL, auf die Java nicht zugreifen konnte. Klicken Sie auf die HTTPS-Zertifikatkette (im Internet Explorer befindet sich ein Schlosssymbol), und klicken Sie auf die Sperre, um das Zertifikat anzuzeigen.
• Gehen Sie zu "Details" des Zertifikats und "In Datei kopieren". Kopieren Sie es im Base64- Format (.cer) . Es wird auf Ihrem Desktop gespeichert.
• Installieren Sie das Zertifikat und ignorieren Sie alle Warnungen.
• Auf diese Weise habe ich die Zertifikatinformationen der URL gesammelt, auf die ich zugreifen wollte.
Jetzt musste ich meine Java-Version erstellen, um über das Zertifikat Bescheid zu wissen, damit es sich nicht weigert, die URL zu erkennen. In diesem Zusammenhang muss ich erwähnen, dass ich gegoogelt habe, dass Stammzertifikatinformationen standardmäßig im Speicherort \ jre \ lib \ security von JDK verbleiben und das Standardkennwort für den Zugriff lautet: changeit.
Um die Cacerts-Informationen anzuzeigen, gehen Sie wie folgt vor:
• Klicken Sie auf Start Button -> Run
• Geben Sie cmd ein. Die Eingabeaufforderung wird geöffnet (möglicherweise müssen Sie sie als Administrator öffnen).
• Gehen Sie in Ihr
Java/jreX/bin
Verzeichnis• Geben Sie Folgendes ein
Es enthält die Liste der aktuellen Zertifikate, die im Keystore enthalten sind. Es sieht ungefähr so aus:
• Jetzt musste ich das zuvor installierte Zertifikat in die Cacerts aufnehmen.
• Gehen Sie dazu wie folgt vor:
Wenn Sie Java 7 verwenden:
• Anschließend werden die Zertifikatinformationen zur Cacert-Datei hinzugefügt.
Es ist die Lösung, die ich für die oben erwähnte Ausnahme gefunden habe !!
quelle
Wie man es in Tomcat 7 macht
Ich wollte ein selbstsigniertes Zertifikat in einer Tomcat-App unterstützen, aber das folgende Snippet funktionierte nicht
Dies hat mein Problem gelöst:
1) Laden Sie die
.crt
Datei herunter<your domain>
deine Domain ersetzen (zBjossef.com
)2) Wenden Sie die
.crt
Datei im Java-cacerts
Zertifikatspeicher an<your domain>
deine Domain ersetzen (zBjossef.com
)<JAVA HOME>
durch Ihr Java-Home-Verzeichnis3) Hack es
Obwohl ich mein Zertifikat in
Java
den Standardzertifikatsspeichern installiert habe , ignoriert Tomcat dies (anscheinend ist es nicht für die Verwendung der Standardzertifikatspeicher von Java konfiguriert).Um dies zu hacken, fügen Sie irgendwo in Ihrem Code Folgendes hinzu:
quelle
In meinem Fall bestand das Problem darin, dass der Webserver nur das Zertifikat und die Zwischenzertifizierungsstelle sendete, nicht die Stammzertifizierungsstelle. Das Hinzufügen dieser JVM-Option löste das Problem:
-Dcom.sun.security.enableAIAcaIssuers=true
Quelle
quelle
Ein weiterer Grund könnte eine veraltete Version von JDK sein. Ich habe jdk Version 1.8.0_60 verwendet. Durch einfaches Aktualisieren auf die neueste Version wurde das Zertifikatsproblem behoben.
quelle
Meine Cacerts-Datei war völlig leer. Ich habe dieses Problem gelöst, indem ich die cacerts-Datei von meinem Windows-Computer (der Oracle Java 7 verwendet) kopiert und auf meine Linux-Box (OpenJDK) übertragen habe.
und dann auf dem Linux-Rechner
Es hat bisher großartig funktioniert.
quelle
Für mich trat dieser Fehler auch beim Versuch auf, eine Verbindung zu einem Prozess hinter einem NGINX-Reverse-Proxy herzustellen, der das SSL handhabte.
Es stellte sich heraus, dass das Problem ein Zertifikat war, bei dem die gesamte Zertifikatkette nicht verkettet war. Als ich Zwischenzertifikate hinzufügte, war das Problem gelöst.
Hoffe das hilft.
quelle
Mit Tomcat 7 unter Linux war dies der Trick.
Unter Linux
$JAVA_HOME
ist nicht immer eingerichtet, zeigt aber in der Regel/etc/alternatives/jre
auf$JAVA_HOME/jre
quelle
Der folgende Code funktioniert für mich:
quelle
Ich habe verwendet,
jdk1.8.0_171
als ich vor dem gleichen Problem stand. Ich habe hier die Top-2-Lösungen ausprobiert (Hinzufügen eines Zertifikats mit Keytool und einer anderen Lösung, die einen Hack enthält), aber sie haben bei mir nicht funktioniert.Ich habe mein JDK auf aktualisiert
1.8.0_181
und es hat wie ein Zauber funktioniert.quelle
Ich habe ein kleines dummes Win32-Skript (WinXP 32bit Testet) geschrieben, das nach allen Java-Versionen in Programmdateien sucht und ihnen ein Zertifikat hinzufügt. Das Passwort muss das Standard "changeit" sein oder es selbst im Skript ändern :-)
quelle
Für MacOS X unten ist der genaue Befehl, der für mich funktioniert hat, wo ich mit doppeltem Bindestrich in der Option 'importcert' versuchen musste, was funktionierte:
quelle
Für mich hat die erkannte Lösung aus diesem Beitrag nicht funktioniert: https://stackoverflow.com/a/9619478/4507034 .
Stattdessen konnte ich das Problem lösen, indem ich die Zertifizierung in die vertrauenswürdigen Zertifizierungen meines Computers importierte.
Schritte:
https://localhost:8443/yourpath
), unter der die Zertifizierung nicht funktioniert.Manage computer certificates
Trusted Root Certification Authorities
->Certificates
your_certification_name.cer
Datei.quelle
Verwenden Sie den Befehl "ps -ef | grep tomcat", wenn Tomcat auf einem Ubuntu-Server ausgeführt wird, um herauszufinden, welches Java verwendet wird:
Stichprobe:
Dann können wir gehen zu: cd /usr/local/java/jdk1.7.0_15/jre/lib/security
Die Standard- Cacerts- Datei befindet sich hier. Fügen Sie das nicht vertrauenswürdige Zertifikat ein.
quelle
Aus Sicherheitsgründen sollten wir bei unserer Implementierung keine selbstsignierten Zertifikate verwenden. Wenn es jedoch häufig um die Entwicklung geht, müssen wir Testumgebungen verwenden, die selbstsignierte Zertifikate erhalten haben. Ich habe versucht, dieses Problem programmgesteuert in meinem Code zu beheben, aber es schlägt fehl. Durch Hinzufügen des Zertifikats zum jre Trust-Store wurde mein Problem behoben. Nachfolgend finden Sie Schritte,
Laden Sie das Site-Zertifikat herunter.
Kopieren Sie das Zertifikat (z. B. cert_file.cer) in das Verzeichnis $ JAVA_HOME \ Jre \ Lib \ Security
Öffnen Sie CMD in Administrator und ändern Sie das Verzeichnis in $ JAVA_HOME \ Jre \ Lib \ Security
Importieren Sie das Zertifikat mit dem folgenden Befehl in einen Trust Store.
Wenn Sie eine Fehlermeldung erhalten, dass Keytool nicht erkennbar ist, lesen Sie dies bitte .
Tippe ja wie unten
Aktualisieren
Wenn Ihr App-Server jboss ist, versuchen Sie, die folgenden Systemeigenschaften hinzuzufügen
Hoffe das hilft!
quelle
VERWENDBARE LÖSUNG (Alpine Linux)
Um dieses Problem in unseren Anwendungsumgebungen beheben zu können, haben wir Linux-Terminalbefehle wie folgt vorbereitet:
Generiert eine Zertifikatdatei im Home-Verzeichnis.
Dieser Befehl installiert openssl unter alpine Linux. Sie können geeignete Befehle für andere Linux-Distributionen finden.
Generierte die benötigte Zertifizierungsdatei.
Wendet die generierte Datei mit dem Programm 'keytool' auf die JRE an.
Hinweis: Bitte ersetzen Sie Ihr DNS durch
<host-dns-ssl-belongs>
Hinweis 2: Bitte beachten Sie, dass
-noprompt
die Bestätigungsmeldung nicht angezeigt wird (Ja / Nein) und der-storepass changeit
Parameter die Kennwortabfrage deaktiviert und das erforderliche Kennwort bereitstellt (Standard ist 'changeit'). Mit diesen beiden Eigenschaften können Sie diese Skripts in Ihren Anwendungsumgebungen verwenden, z. B. zum Erstellen eines Docker-Images.Hinweis 3 Wenn Sie Ihre App über Docker bereitstellen , können Sie die geheime Datei einmal generieren und in Ihre Anwendungsprojektdateien einfügen. Sie müssen es nicht immer wieder generieren.
quelle
Ich habe auch dieses Problem.
Ich habe fast alles versucht, indem ich das SSL-Zertifikat zu .keystore hinzugefügt habe, aber es funktionierte nicht mit Java1_6_x. Für mich hat es geholfen, wenn wir eine neuere Version von Java, Java1_8_x, als JVM verwenden.
quelle
Ich hatte dieses Problem mit Android Studio, als ich hinter einem Proxy stehe. Ich habe Crashlytics verwendet, das versucht, die Zuordnungsdatei während eines Builds hochzuladen.
Ich habe das fehlende Proxy-Zertifikat zum Truststore unter hinzugefügt
/Users/[username]/Documents/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts
mit folgendem Befehl:
keytool -import -trustcacerts -keystore cacerts -storepass [password] -noprompt -alias [alias] -file [my_certificate_location]
Zum Beispiel mit dem Standardkennwort für den Truststore
keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias myproxycert -file /Users/myname/Downloads/MyProxy.crt
quelle
Nur ein kleiner Hack. Aktualisieren Sie die URL in der Datei "hudson.model.UpdateCenter.xml" von https auf http
quelle
Ich möchte mich einschalten, da ich eine QEMU-Umgebung habe, in der ich Dateien in Java herunterladen muss. Es stellt sich heraus, dass
/etc/ssl/certs/java/cacerts
in QEMU ein Problem vorliegt, da es nicht mit dem übereinstimmt/etc/ssl/certs/java/cacerts
in der Host-Umgebung . Die Host-Umgebung befindet sich hinter einem Firmen-Proxy, sodass die Java-Cacerts eine angepasste Version sind.Wenn Sie eine QEMU-Umgebung verwenden, stellen Sie sicher, dass das Hostsystem zuerst auf Dateien zugreifen kann. Zum Beispiel können Sie dieses Skript ausprobieren auf Ihrem Host-Computer . Wenn das Skript auf dem Host-Computer einwandfrei ausgeführt wird, jedoch nicht in QEMU, haben Sie das gleiche Problem wie ich.
Um dieses Problem zu lösen, musste ich eine Sicherungskopie der Originaldatei in QEMU erstellen, die Datei in der Hostumgebung in das QEMU-Chroot-Gefängnis kopieren und dann konnte Java Dateien normalerweise in QEMU herunterladen.
Eine bessere Lösung wäre das Einbinden
/etc
in die QEMU-Umgebung. Ich bin mir jedoch nicht sicher, ob andere Dateien von diesem Prozess betroffen sind. Also entschied ich mich für diese hässliche, aber einfache Lösung.quelle
Dies scheint ein ebenso guter Ort zu sein, um einen weiteren möglichen Grund für die berüchtigte PKIX-Fehlermeldung zu dokumentieren. Nachdem ich viel zu lange den Keystore- und Truststore-Inhalt und verschiedene Java-Installationskonfigurationen durchgesehen hatte, stellte ich fest, dass mein Problem auf ... einen Tippfehler zurückzuführen war.
Der Tippfehler bedeutete, dass ich auch den Keystore als Truststore verwendete. Da die Stammzertifizierungsstelle meines Unternehmens nicht als eigenständiges Zertifikat im Keystore definiert wurde, sondern nur als Teil einer Zertifikatskette und nirgendwo anders definiert wurde (z. B. Zertifikate), wurde der PKIX-Fehler immer wieder angezeigt.
Nach einer fehlgeschlagenen Veröffentlichung (dies ist eine Produktkonfiguration, woanders war es in Ordnung) und zwei Tagen Kopfkratzen sah ich endlich den Tippfehler, und jetzt ist alles in Ordnung.
Hoffe das hilft jemandem.
quelle
Fügen Sie dies Ihrem Code hinzu:
quelle