Ich habe einen Java-Client, der versucht, mit einem selbstsignierten Zertifikat auf einen Server zuzugreifen.
Wenn ich versuche, auf dem Server zu posten, wird folgende Fehlermeldung angezeigt:
Es kann kein gültiger Zertifizierungspfad zum angeforderten Ziel gefunden werden
Nachdem ich einige Nachforschungen zu diesem Thema angestellt hatte, machte ich Folgendes.
- Der Domainname meines Servers wurde als
root.cer
Datei gespeichert. - In der JRE meines Glassfish-Servers habe ich Folgendes ausgeführt:
keytool -import -alias example -keystore cacerts -file root.cer
- Um zu überprüfen, ob das Zertifikat erfolgreich zu meinem Cacert hinzugefügt wurde, habe ich Folgendes getan:
keytool -list -v -keystore cacerts
Ich kann sehen, dass das Zertifikat vorhanden ist. - Ich habe dann Glassfish neu gestartet und die 'Post' zurückgezogen.
Ich erhalte immer noch den gleichen Fehler.
Ich habe das Gefühl, dass dies daran liegt, dass mein Glassfish nicht die von mir geänderte Cacert-Datei liest, sondern vielleicht eine andere.
Hat jemand von euch dieses Problem gehabt und kann mich in die richtige Richtung treiben?
Antworten:
Leider - es könnten viele Dinge sein - und viele App-Server und andere Java-Wrapper neigen dazu, mit Eigenschaften und ihrer eigenen Einstellung zu Schlüsselanhängern zu spielen und was nicht. Es kann sich also um etwas völlig anderes handeln.
Ohne Fachwerk - ich würde versuchen:
um zu sehen, ob das hilft. Anstelle von "alles" kann man auch "ssl", Schlüsselmanager und Vertrauensmanager setzen - was in Ihrem Fall hilfreich sein kann. Wenn Sie "Hilfe" einstellen, wird auf den meisten Plattformen Folgendes aufgeführt.
Unabhängig davon - stellen Sie sicher, dass Sie den Unterschied zwischen dem Keystore (in dem Sie den privaten Schlüssel und das Zertifikat haben, mit dem Sie Ihre eigene Identität nachweisen) und dem Trust Store (der bestimmt, wem Sie vertrauen) vollständig verstehen - und der Tatsache, dass auch Ihre eigene Identität vorhanden ist hat eine Vertrauenskette zur Wurzel - die von jeder Kette zu einer Wurzel getrennt ist, die Sie benötigen, um herauszufinden, wem Sie vertrauen.
Quelle: # Siehe http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug
quelle
Hier ist die Lösung, folgen Sie dem folgenden Link Schritt für Schritt:
http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/
JAVA-DATEI: die im Blog fehlt
quelle
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0];}
Sie müssen die JSSE-Systemeigenschaften konfigurieren und speziell auf den Clientzertifikatsspeicher verweisen.
Über die Kommandozeile:
oder über Java Code:
Weitere Informationen finden Sie auf der RedHat-Website .
quelle
(Repost von meiner anderen Antwort )
Verwenden Sie das CLI-Dienstprogramm Keytool aus der Java-Softwareverteilung, um die benötigten Zertifikate zu importieren (und zu vertrauen! )
Stichprobe:
Wechseln Sie von cli zu jre \ bin
Überprüfen Sie den Keystore (Datei im Verzeichnis jre \ bin).
Keytool -list -keystore .. \ lib \ security \ cacerts Das
Passwort wird geändert
Laden Sie alle Zertifikate in der Kette vom benötigten Server herunter und speichern Sie sie.
Fügen Sie Zertifikate hinzu (bevor Sie das Attribut "Nur Lesen" in der Datei ".. \ lib \ security \ cacerts" entfernen müssen), führen Sie Folgendes aus: keytool -alias REPLACE_TO_ANY_UNIQ_NAME -import -keystore .. \ lib \ security \ cacerts -file "r: \ root.crt "
aus Versehen habe ich so einen einfachen Tipp gefunden. Andere Lösungen erfordern die Verwendung von InstallCert.Java und JDK
Quelle: http://www.java-samples.com/showtutorial.php?tutorialid=210
quelle
Ich hatte das gleiche Problem mit sbt .
Es wurde versucht, Abhängigkeiten von repo1.maven.org über ssl abzurufen
, es wurde jedoch festgestellt , dass "kein gültiger Zertifizierungspfad zur angeforderten Ziel-URL gefunden werden konnte".
Also folgte ich diesem Beitrag und konnte immer noch keine Verbindung überprüfen.
Also habe ich darüber gelesen und festgestellt, dass das Stammzertifikat nicht ausreicht, wie in der Veröffentlichung vorgeschlagen. Das,
was für mich funktioniert hat, war das Importieren der CA-Zwischenzertifikate in den Keystore .
Ich habe tatsächlich alle Zertifikate in der Kette hinzugefügt und es hat wie ein Zauber funktioniert.
quelle
Lösung bei der Migration von JDK 8 auf JDK 10
certs
JDK 10
JDK 8
Schritte zu beheben
jlink
as/opt/jdk/bin/jlink \ --module-path /opt/jdk/jmods...
Also, hier sind die verschiedenen Pfade und die Reihenfolge der Befehle ...
quelle
Ich arbeite an einem Tutorial für REST-Webdienste unter www.udemy.com (REST Java Web Services). Das Beispiel im Tutorial besagt, dass wir in meinem Eclipse-Projekt "client" einen Ordner mit dem Namen "trust_store" haben müssen, der eine "key store" -Datei enthalten soll (wir hatten ein "client" -Projekt, um den Dienst aufzurufen, um SSL zu haben und "Service" -Projekt, das den REST-Webdienst enthielt - 2 Projekte im selben Eclipse-Arbeitsbereich, eines der Client, das andere der Service). Um die Dinge einfach zu halten, haben sie gesagt, dass sie "keystore.jks" vom Glassfish-App-Server (glassfish \ domain \ domain1 \ config \ keystore.jks), den wir verwenden, kopieren und in diesen "trust_store" -Ordner legen, in dem sie mich erstellt haben das Client-Projekt. Das scheint sinnvoll zu sein: die selbstsignierten Zertifikate auf dem Server ' s key_store würde den Zertifikaten im client trust_store entsprechen. Als ich dies tat, bekam ich den Fehler, den der ursprüngliche Beitrag erwähnt. Ich habe dies gegoogelt und gelesen, dass der Fehler auf die Datei "keystore.jks" auf dem Client zurückzuführen ist, die kein vertrauenswürdiges / signiertes Zertifikat enthält, und dass das gefundene Zertifikat selbstsigniert ist.
Um die Dinge klar zu halten, möchte ich sagen, dass "keystore.jks" nach meinem Verständnis selbstsignierte Zertifikate und die Datei "cacerts.jks" CA-Zertifikate (von der CA signiert) enthält. "Keystore.jks" ist der "Keystore" und "cacerts.jks" ist der "Trust Store". Wie "Bruno", ein Kommentator, oben sagt, ist "keystore.jks" lokal und "cacerts.jks" für Remoteclients.
Also sagte ich mir, hey, glassfish hat auch die Datei "cacerts.jks", die die trust_store-Datei von glassfish ist. cacerts.jsk soll CA-Zertifikate enthalten. Und anscheinend muss mein Ordner "trust_store" eine Schlüsselspeicherdatei enthalten, die mindestens ein CA-Zertifikat enthält. Also habe ich versucht, die Datei "cacerts.jks" in den Ordner "trust_store" zu legen, den ich in meinem Client-Projekt erstellt hatte, und die VM-Eigenschaften so geändert, dass sie auf "cacerts.jks" anstelle von "keystore.jks" verweisen. Das hat den Fehler beseitigt. Ich denke, alles, was es brauchte, war ein CA-Zertifikat, um zu funktionieren.
Dies ist möglicherweise nicht ideal für die Produktion oder sogar für die Entwicklung, die über das bloße Arbeiten hinausgeht. Zum Beispiel könnten Sie wahrscheinlich den Befehl "keytool" verwenden, um CA-Zertifikate zur Datei "keystore.jks" im Client hinzuzufügen. Aber hoffentlich werden dadurch zumindest die möglichen Szenarien eingegrenzt, die hier auftreten könnten, um den Fehler zu verursachen.
AUCH: Mein Ansatz schien für den Client nützlich zu sein (Serverzertifikat zum Client trust_store hinzugefügt). Es sieht so aus, als ob die obigen Kommentare zum Auflösen des ursprünglichen Beitrags für den Server nützlich sind (Clientzertifikat zum Server trust_store hinzugefügt). Prost.
Setup des Eclipse-Projekts:
--- cacerts.jks --- keystore.jks
Ausschnitt aus der Datei MyClientProject.java:
quelle
Mein Problem war, dass ein Cloud Access Security Broker, NetSkope, durch ein Software-Update auf meinem Arbeitslaptop installiert wurde. Dies veränderte die Zertifikatkette und ich konnte nach dem Importieren der gesamten Kette in meinen Cacerts-Keystore immer noch keine Verbindung zum Server über meinen Java-Client herstellen. Ich habe NetSkope deaktiviert und konnte erfolgreich eine Verbindung herstellen.
quelle
In meinem Fall war ich mit dem Problem konfrontiert, weil in meinem Tomcat-Prozess ein spezifischer Keystore mit verwendet wurde
Während ich das Zertifikat in das Zertifikat von JRE / lib / security importierte und die Änderungen nicht widerspiegelten. Dann habe ich den folgenden Befehl ausgeführt, wobei /tmp/cert1.test das Zertifikat des Zielservers enthält
Wir können überprüfen, ob der Zertifikatimport erfolgreich ist
und prüfen Sie, ob Ihr Taget-Server gegen den Alias rapidssl-myserver gefunden wurde
quelle
Überprüfen Sie, ob die Datei
$JAVA_HOME/lib/security/cacerts
existiert! In meinem Fall war es keine Datei, sondern ein Link zu/etc/ssl/certs/java/cacerts
und auch dies war ein Link zu sich selbst (WAS ???), sodass JVM die Datei aufgrund dessen nicht finden kann.Lösung: Kopieren Sie die echte Cacerts-Datei ( Sie können dies von einem anderen JDK aus tun ) in ein
/etc/ssl/certs/java/
Verzeichnis und es wird Ihr Problem lösen :)quelle
rm -f /opt/jdk-minimal/jre/lib/security/cacerts ; ln -s /etc/ssl/certs/java/cacerts /opt/jdk-minimal/jre/lib/security/cacerts
Nehmen wir an, Sie verwenden Klassenpfadvariablen wie $ {JAVA_HOME} in pom.xml.
Fügen Sie für Ziele die Klassenpfadvariablen hinzu. dh .., -DANT_HOME, -DJAVA_HOME
quelle