Est-il possible de faire en sorte que Java ignore le «magasin de confiance» et n'accepte que le certificat SSL obtenu?

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

  •  10-07-2019
  •  | 
  •  

Question

J'essaie d'écrire un client SSL qui envoie un courrier à l'aide de l'API javax.mail. Le problème que j'ai 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 indiquent que je dois installer le certificat dans le magasin de données de confiance. Je ne veux pas faire ça (je n'ai pas les permissions nécessaires.)

  1. Y at-il un moyen d’obtenir que Java ignore simplement l’erreur de certificat et l’accepte?
  2. Si cela ne fonctionne pas, y a-t-il moyen de faire en sorte que le fichier de confiance soit local pour mon programme et non installé pour la machine virtuelle entière?
Était-ce utile?

La solution

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

Autres conseils

Code de travail (dans 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 de 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());

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

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

Vous pouvez également spécifier ceci en tant que paramètre de ligne de commande supplémentaire:

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

Sur Fedora, il pourrait s'agir du magasin de confiance Java dans l'ensemble du système, dans / etc / pki / java / cacerts

.

Ajoutez simplement -Dtrust_all_cert = true aux arguments de la machine virtuelle. Cet argument indique à Java d'ignorer toutes les vérifications de certificats.

En ligne de commande, vous pouvez ajouter l'argument -noCertificationCheck à Java pour ignorer les vérifications de certificat.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top