java - trustore - que son los keystore
¿Es posible hacer que Java ignore el "almacén de confianza" y simplemente acepte el certificado SSL que obtenga? (5)
Estoy intentando escribir un cliente SSL que envía correo usando la API javax.mail. El problema que tengo es que el servidor me solicita que use SSL, pero el servidor también está configurado con un certificado SSL no estándar. Las páginas web que he encontrado dicen que necesito instalar el certificado en el almacén de confianza. No quiero hacer eso (no tengo los permisos necesarios).
- ¿Hay alguna forma de que Java simplemente ignore el error del certificado y lo acepte?
- Si eso falla, ¿hay alguna forma de que el almacén de confianza sea local para mi programa y no se instale para toda la JVM?
Código de trabajo (en jdk1.6.0_23) para # 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 todos los códigos de 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());
En la línea de comandos puede agregar el argumento -noCertificationCheck
a java para ignorar las comprobaciones de certificados.
Prueba 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, este podría ser el almacén de confianza de Java del sistema en /etc/pki/java/cacerts
Solo agregue -Dtrust_all_cert=true
a los argumentos de VM. Este argumento le dice a Java que ignore todas las comprobaciones de certificados.
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());