Solución:
Solución
En Windows, establezca las siguientes propiedades de JVM:
javax.net.ssl.trustStore=NUL
javax.net.ssl.trustStoreType=Windows-ROOT
Probé con éxito esto con Java 7, que se ejecuta en una instalación de Windows de 64 bits que confía en una CA autofirmada.
Configurar el proveedor de seguridad
Si la solución anterior funciona para usted (debería hacerlo), puede omitir esta sección. De lo contrario, verifique la configuración de su Java Cryptography Extension (JCE), que se incluye con los JDK modernos. Su instalación de JDK debe tener un archivo de propiedades que contenga una lista de proveedores de seguridad. La ubicación de ese archivo puede variar según las versiones de Java; el mío está ubicado en "%JAVA_HOME%jrelibsecurityjava.security"
. Dentro de ese archivo, ubique un conjunto de propiedades cuyos nombres comiencen con security.provider
. Una de esas entradas debe establecerse en sun.security.mscapi.SunMSCAPI
.
Ejemplo
Para establecer las propiedades en tiempo de ejecución, utilice el siguiente código Java:
System.setProperty("javax.net.ssl.trustStore", "NUL");
System.setProperty("javax.net.ssl.trustStoreType", "Windows-ROOT");
Explicación
javax.net.ssl.trustStoreType
En Windows, Java se envía con SunMSCAPI, un proveedor de seguridad que en realidad es un envoltorio del CAPI de Windows.
Establecer el javax.net.ssl.trustStoreType
propiedad a Windows-ROOT
indica a Java que consulte el almacén de claves ROOT nativo de Windows para los certificados de confianza, que incluye las CA raíz. (Del mismo modo, establecer javax.net.ssl.keyStoreType
para Windows-MY
le dice a Java que consulte el almacén de claves nativo de Windows MY para los certificados específicos del usuario y sus claves correspondientes).
javax.net.ssl.trustStore
Si el javax.net.ssl.trustStoreType
la propiedad está establecida en Windows-ROOT
, uno esperaría que el valor de javax.net.ssl.trustStore
se ignora y que se puede establecer en e. gramo. NONE
.
Una solución común para este problema es configurar javax.net.ssl.trustStore
para NONE
y luego crear un archivo ficticio cuyo nombre de archivo es NONE
. Si se ve afectado por esta peculiaridad, intente configurar javax.net.ssl.trustStore
para NUL
por lo que no tendrá que crear ningún archivo ficticio.
¿Hay alguna manera de decirle a Java que confíe en cualquier certificado en el que Windows pueda confiar?
Por favor verifique la respuesta de @ synoly
La JVM predeterminada se encuentra en jre/lib/security/cacerts
. También puede configurar su propio almacén de confianza:
System.setProperty ("javax.net.ssl.trustStore", path_to_your_trustore_jks_file);
System.setProperty ("javax.net.ssl.trustStorePassword", "password");
¿Hay alguna manera de importar todos los certificados de confianza del almacén de confianza de Windows a los cacerts de Java?
No hay ningún proceso automático, pero puede crear un programa para extraer autoridades de confianza del almacén de certificados de Windows e importarlo a un almacén de confianza configurado para usar en su aplicación (no se recomienda modificar cacerts)
//Read Windows truststore
KeyStore ks = KeyStore.getInstance("Windows-ROOT");
ks.load(null, null) ;