¿Es posible hacer que Java ignore el "almacén de confianza" y simplemente acepte cualquier certificado SSL que obtenga?

StackOverflow https://stackoverflow.com/questions/1219208

  •  10-07-2019
  •  | 
  •  

Pregunta

Estoy intentando escribir un cliente SSL que envíe correo usando la API javax.mail. El problema que tengo es que el servidor solicita que use SSL, pero el servidor también está configurado con un certificado SSL no estándar. Las páginas web que encontré dicen que necesito instalar el certificado en el almacén de confianza. No quiero hacer eso (no tengo los permisos necesarios)

  1. ¿Hay alguna manera de hacer que Java ignore el error del certificado y lo acepte?
  2. De lo contrario, ¿hay alguna manera de que el almacén de confianza sea local para mi programa y no esté instalado para toda la JVM?
¿Fue útil?

Solución

Debe crear un TrustManager falso que acepte todos los certificados y registrarlo como administrador. Algo como esto:

public class MyManager implements com.sun.net.ssl.X509TrustManager {
  public boolean isClientTrusted(X509Certificate[] chain) { return true; }
  public boolean isHostTrusted(X509Certificate[] chain) { return true; }
  ...
}


com.sun.net.ssl.TrustManager[] managers =
  new com.sun.net.ssl.TrustManager[] {new MyManager()};

com.sun.net.ssl.SSLContext.getInstance("SSL").
       .init(null, managers, new SecureRandom());

Otros consejos

Código de trabajo (en jdk1.6.0_23) para el n. ° 1.

Importaciones

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;

La confianza real de todo el código TrustManager.

TrustManager trm = new X509TrustManager() {
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }

    public void checkClientTrusted(X509Certificate[] certs, String authType) {

    }

    public void checkServerTrusted(X509Certificate[] certs, String authType) {
    }
};

SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[] { trm }, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

Pruebe esto (respuesta a la pregunta 2):

System.setProperty("javax.net.ssl.trustStore", "/path/to/truststore");

También puede especificar esto como un parámetro de línea de comando adicional:

java -Djavax.net.ssl.trustStore=/path/to/truststore <remaining arguments>

En Fedora, esta podría ser la tienda de confianza Java de todo el sistema en /etc/pki/java/cacerts

Simplemente agregue -Dtrust_all_cert = true a los argumentos de VM. Este argumento le dice a Java que ignore todas las comprobaciones de certificados.

En la línea de comando puede agregar el argumento -noCertificationCheck a java para ignorar las comprobaciones de certificados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top