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:
- MyClientProject
- src
- Prüfung
- JRE-Systembibliothek
- ...
- trust_store
--- cacerts.jks --- keystore.jks
Ausschnitt aus der Datei MyClientProject.java:
static {
// Setup the trustStore location and password
System.setProperty("javax.net.ssl.trustStore","trust_store/cacerts.jks");
// comment out below line
System.setProperty("javax.net.ssl.trustStore","trust_store/keystore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
//System.setProperty("javax.net.debug", "all");
// for localhost testing only
javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
return hostname.equals("localhost");
}
});
}