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.)
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());
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());
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
Il suffit d'ajouter -Dtrust_all_cert=true
to VM Arguments. Cet argument indique Java d'ignorer tous les contrôles de certificat.