Java: Fonction de neutralisation pour désactiver la vérification du certificate SSL

Le service Web repose sur SSL et possède un certificate auto-signé, hébergé dans un système distant. J’ai déjà créé un client accédant à ce service Web. Cela se fait en ajoutant le certificate au magasin de clés par programmation .

Maintenant, j’ai entendu cela, il n’est pas nécessaire d’append un certificate au magasin de clés pour accéder à un service Web auto-signé. Au lieu de cela, nous pouvons désactiver la vérification du certificate en remplaçant certaines méthodes. Est-ce vrai? Quelles sont ces méthodes? S’il vous plaît aider.

Cela devrait être suffisant. Je l’utilise lorsque je teste du code sur des serveurs de test et de staging sur lesquels nous n’avons pas de certificates correctement signés. Cependant, vous devriez vraiment envisager d’obtenir un certificate SSL valide sur votre serveur de production . Personne ne veut être mis sur écoute et sa vie privée est violée.

SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, new TrustManager[] { new TrustAllX509TrustManager() }, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HttpsURLConnection.setDefaultHostnameVerifier( new HostnameVerifier(){ public boolean verify(Ssortingng ssortingng,SSLSession ssls) { return true; } }); 

Et ça.

 import javax.net.ssl.X509TrustManager; import java.security.cert.X509Certificate; /** * DO NOT USE IN PRODUCTION!!!! * * This class will simply trust everything that comes along. * * @author frank * */ public class TrustAllX509TrustManager implements X509TrustManager { public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } public void checkClientTrusted(java.security.cert.X509Certificate[] certs, Ssortingng authType) { } public void checkServerTrusted(java.security.cert.X509Certificate[] certs, Ssortingng authType) { } } 

Bonne chance!

=== MISE À JOUR ===

Je voulais juste souligner qu’il existe un service appelé Let’s Encrypt qui automatise le processus de génération et de configuration de certificates SSL / TLS, reconnu par presque tout le monde, et il est absolument gratuit!

Ignorer les certificates par connexion est beaucoup plus sûr, car tout autre code utilisera toujours les valeurs par défaut sécurisées.

Le code suivant:

  • Remplace le vérificateur de confiance et le nom d’hôte par connexion.
  • Réutilise SSLSocketFactory afin de prendre en charge les connexions persistantes, en évitant la négociation SSL coûteuse pour les demandes répétées sur le même serveur.

Comme d’autres l’ont déclaré, cela ne devrait être utilisé que pour les tests et / ou les systèmes internes communiquant avec d’autres systèmes internes.

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; public class TestPersistentConnection { private static SSLSocketFactory sslSocketFactory = null; /** * Use the VM argument -Djavax.net.debug=ssl for SSL specific debugging; * the SSL handshake will appear a single time when connections are re-used, and multiple * times when they are not. * * Use the VM -Djavax.net.debug=all for all network related debugging, but * note that it is verbose. * * @throws Exception */ public static void main(Ssortingng[] args) throws Exception { //URL url = new URL("https://google.com/"); URL url = new URL("https://localhost:8443/"); // Disable first request(url, false); // Enable; verifies our previous disable isn't still in effect. request(url, true); } public static void request(URL url, boolean enableCertCheck) throws Exception { BufferedReader reader = null; // Repeat several times to check persistence. System.out.println("Cert checking=["+(enableCertCheck?"enabled":"disabled")+"]"); for (int i = 0; i < 5; ++i) { try { HttpURLConnection httpConnection = (HttpsURLConnection) url.openConnection(); // Normally, instanceof would also be used to check the type. if( ! enableCertCheck ) { setAcceptAllVerifier((HttpsURLConnection)httpConnection); } reader = new BufferedReader(new InputStreamReader(httpConnection.getInputStream()), 1); char[] buf = new char[1024]; StringBuilder sb = new StringBuilder(); int count = 0; while( -1 < (count = reader.read(buf)) ) { sb.append(buf, 0, count); } System.out.println(sb.toString()); reader.close(); } catch (IOException ex) { System.out.println(ex); if( null != reader ) { reader.close(); } } } } /** * Overrides the SSL TrustManager and HostnameVerifier to allow * all certs and hostnames. * WARNING: This should only be used for testing, or in a "safe" (ie firewalled) * environment. * * @throws NoSuchAlgorithmException * @throws KeyManagementException */ protected static void setAcceptAllVerifier(HttpsURLConnection connection) throws NoSuchAlgorithmException, KeyManagementException { // Create the socket factory. // Reusing the same socket factory allows sockets to be // reused, supporting persistent connections. if( null == sslSocketFactory) { SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, ALL_TRUSTING_TRUST_MANAGER, new java.security.SecureRandom()); sslSocketFactory = sc.getSocketFactory(); } connection.setSSLSocketFactory(sslSocketFactory); // Since we may be using a cert with a different name, we need to ignore // the hostname as well. connection.setHostnameVerifier(ALL_TRUSTING_HOSTNAME_VERIFIER); } private static final TrustManager[] ALL_TRUSTING_TRUST_MANAGER = new TrustManager[] { new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] certs, String authType) {} public void checkServerTrusted(X509Certificate[] certs, String authType) {} } }; private static final HostnameVerifier ALL_TRUSTING_HOSTNAME_VERIFIER = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; } 

Merci beaucoup à: http://runtime32.blogspot.com/2008/11/let-java-ssl-trust-all-certificatees.html

 TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] certs, Ssortingng authType) { } public void checkServerTrusted(X509Certificate[] certs, Ssortingng authType) { } } }; SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HostnameVerifier allHostsValid = new HostnameVerifier() { public boolean verify(Ssortingng hostname, SSLSession session) { return true; } }; HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); GetCustomerPhone http = new GetCustomerPhone(); System.out.println("Processing.."); try{ http.sendPost(); } catch(Exception e){ e.printStackTrace(); } } 

Je pense que ça marchera bien. Parce que ça me va …