Sto lavorando a un tutorial per i servizi Web REST su www.udemy.com (REST Java Web Services). L'esempio nel tutorial ha detto che per avere SSL, dobbiamo avere una cartella chiamata "trust_store" nel mio progetto "client" di eclissi che dovrebbe contenere un file "key store" (avevamo un progetto "client" per chiamare il servizio e progetto "service" che conteneva il servizio web REST - 2 progetti nella stessa area di lavoro eclipse, uno il client, l'altro il servizio). Per semplificare le cose, hanno detto di copiare "keystore.jks" dal server delle app di glassfish (glassfish \ domains \ domain1 \ config \ keystore.jks) che stiamo usando e di metterlo in questa cartella "trust_store" che mi hanno fatto fare il progetto client. Sembra avere senso: i certificati autofirmati nel server ' s key_store corrisponderebbe alle certs nel client trust_store. Ora, facendo questo, stavo ottenendo l'errore menzionato dal post originale. Ho cercato su Google e ho letto che l'errore è dovuto al file "keystore.jks" sul client che non contiene un certificato attendibile / firmato, che il certificato che trova è autofirmato.
Per chiarire le cose, lasciatemi dire che, come ho capito, "keystore.jks" contiene certificati autofirmati e il file "cacerts.jks" contiene certificati CA (firmati dalla CA). "Keystore.jks" è il "keystore" e "cacerts.jks" è il "negozio di fiducia". Come "Bruno", un commentatore, dice sopra, "keystore.jks" è locale e "cacerts.jks" è per i client remoti.
Quindi, ho detto a me stesso, ehi, glassfish ha anche il file "cacerts.jks", che è il file trust_store di glassfish. cacerts.jsk dovrebbe contenere certificati CA. E a quanto pare ho bisogno che la mia cartella trust_store contenga un file di archivio chiavi con almeno un certificato CA. Quindi, ho provato a inserire il file "cacerts.jks" nella cartella "trust_store" che avevo creato, sul mio progetto client, e modificando le proprietà della VM in modo che puntassero a "cacerts.jks" anziché "keystore.jks". Che si è sbarazzato dell'errore. Immagino che tutto ciò che servisse fosse un certificato CA per funzionare.
Questo potrebbe non essere l'ideale per la produzione, o anche per lo sviluppo, oltre a far funzionare qualcosa. Ad esempio, è possibile utilizzare il comando "keytool" per aggiungere certificati CA al file "keystore.jks" nel client. Ma spero che questo almeno restringa i possibili scenari che potrebbero verificarsi qui per causare l'errore.
ANCHE: il mio approccio sembrava essere utile per il client (certificato server aggiunto al client trust_store), sembra che i commenti sopra per risolvere il post originale siano utili per il server (certificato client aggiunto al server trust_store). Saluti.
Installazione del progetto Eclipse:
- MyClientProject
- src
- test
- Libreria di sistema JRE
- ...
- trust_store
--- cacerts.jks --- keystore.jks
Snippet dal file 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");
}
});
}