Estoy trabajando en un tutorial para los servicios web REST en www.udemy.com (REST Java Web Services). El ejemplo en el tutorial decía que para tener SSL, debemos tener una carpeta llamada "trust_store" en mi proyecto "cliente" de eclipse que debería contener un archivo "almacén de claves" (teníamos un proyecto "cliente" para llamar al servicio y proyecto de "servicio" que contenía el servicio web REST: 2 proyectos en el mismo espacio de trabajo de eclipse, uno para el cliente y otro para el servicio). Para simplificar las cosas, dijeron que copie "keystore.jks" del servidor de aplicaciones glassfish (glassfish \ domains \ domain1 \ config \ keystore.jks) que estamos usando y lo coloque en esta carpeta "trust_store" que me hicieron hacer El proyecto del cliente. Eso parece tener sentido: los certificados autofirmados en el servidor ' s key_store correspondería a los certificados en el cliente trust_store. Ahora, al hacer esto, recibí el error que menciona la publicación original. Lo busqué en Google y leí que el error se debe al archivo "keystore.jks" en el cliente que no contiene un certificado de confianza / firmado, que el certificado que encuentra es autofirmado.
Para mantener las cosas claras, permítanme decir que, según tengo entendido, el "keystore.jks" contiene certificados autofirmados y el archivo "cacerts.jks" contiene certificados de CA (firmados por la CA). El "keystore.jks" es el "almacén de claves" y el "cacerts.jks" es el "almacén de confianza". Como "Bruno", un comentarista, dice arriba, "keystore.jks" es local y "cacerts.jks" es para clientes remotos.
Entonces, me dije a mí mismo, hey, glassfish también tiene el archivo "cacerts.jks", que es el archivo trust_store de glassfish. Se supone que cacerts.jsk contiene certificados de CA. Y aparentemente necesito que mi carpeta trust_store contenga un archivo de almacén de claves que tenga al menos un certificado de CA. Entonces, intenté poner el archivo "cacerts.jks" en la carpeta "trust_store" que había creado, en mi proyecto de cliente, y cambiar las propiedades de VM para que apunte a "cacerts.jks" en lugar de "keystore.jks". Eso eliminó el error. Supongo que todo lo que necesitaba era un certificado CA para funcionar.
Esto puede no ser ideal para la producción, o incluso para el desarrollo más allá de hacer que algo funcione. Por ejemplo, probablemente podría usar el comando "keytool" para agregar certificados de CA al archivo "keystore.jks" en el cliente. Pero de todos modos, con suerte, esto al menos reduce los posibles escenarios que podrían estar ocurriendo aquí para causar el error.
TAMBIÉN: mi enfoque parecía ser útil para el cliente (certificado del servidor agregado al cliente trust_store), parece que los comentarios anteriores para resolver la publicación original son útiles para el servidor (certificado del cliente agregado al servidor trust_store). Salud.
Configuración del proyecto Eclipse:
- MyClientProject
- src
- prueba
- Biblioteca del sistema JRE
- ...
- trust_store
--- cacerts.jks --- keystore.jks
Fragmento del archivo 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");
}
});
}