web-dev-qa-db-fra.com

Est-il possible d'obtenir Java== pour ignorer le "STORET STOREUR" et accepter simplement le certificat SSL qu'il obtient?

J'essaie d'écrire un client SSL qui envoie un courrier à l'aide de l'API Javax.mail. Le problème que j'ai d'avoir est que le serveur demande que j'utilise SSL, mais le serveur est également configuré avec un certificat SSL non standard. Les pages Web que j'ai trouvées disent que je dois installer le certificat dans le magasin Trust Store. Je ne veux pas faire cela (je n'ai pas les autorisations nécessaires.)

  1. Existe-t-il un moyen d'obtenir Java pour ignorer l'erreur de certificat et l'accepter?
  2. À défaut, existe-t-il un moyen de faire en sorte que le magasin de fiducie soit local pour mon programme et non installé pour l'ensemble de la JVM?
22
vy32

Vous devez créer un faux TrustManager qui accepte tous les certificats et l'enregistrer en tant que gestionnaire. Quelque chose comme ça:

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());
18
Zed

Code de travail (en JDK1.6.0_23) pour # 1.

Importations

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 confiance réelle tout le code 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());
31
so_mv

Essayez ceci (réponse à la question 2):

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

Vous pouvez également spécifier cela comme un paramètre de ligne de commande supplémentaire:

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

Sur Fedora, cela pourrait être le système Wide Java Freire Store dans /etc/pki/Java/cacerts

7
H Marcelo Morales

Il suffit d'ajouter -Dtrust_all_cert=true to VM Arguments. Cet argument indique Java d'ignorer tous les contrôles de certificat.

0
Ayman Hussain