2011-05-17 28 views
28

C'è un modo per i socket SSL java standard per disabilitare la verificazione dell'hostname per le connessioni ssl con una proprietà? L'unico modo che ho trovato fino ad ora, è scrivere un verificatore del nome host che ritorna vero tutto il tempo.SSL Java: come disabilitare la verifica del nome host

Weblogic fornisce questa possibilità, è possibile disabilitare la verifica host con la seguente proprietà:

-Dweblogic.security.SSL.ignoreHostnameVerify

+1

Beh, la tua è la soluzione più pulita che riesca a pensare; c'è qualcosa di sbagliato in questo? – Piskvor

+1

bene, si desidera solo disabilitare il controllo e farlo senza modifiche al codice. Normalmente hai molte proprietà per controllare le connessioni SSL, ma apparentemente non in questo caso ... – paweloque

+0

beh, tu * potresti * fare un verificatore di nome host * factory * che controllerebbe la tua proprietà personalizzata e restituirà il verificatore fittizio "always-ok" se è impostato, o il verificatore predefinito se non; tuttavia, questo non risolve il problema, vero? – Piskvor

risposta

3

Non v'è alcuna verifica host in zoccoli Java standard SSL o addirittura SSL, ecco perché non puoi impostarlo a quel livello. La verifica del nome host fa parte di HTTPS (RFC 2818): ecco perché si manifesta come javax.net.ssl.HostnameVerifier, che viene applicato a un HttpsURLConnection.

+0

Sembra ragionevole, tuttavia, perché weblogic fornisce tale opzione e perché non esiste una tale proprietà sul livello HttpsURLConnection? – paweloque

+0

@lewap Suppongo che queste siano domande retoriche? Non posso rispondere a domande su WebLogic o sul perché il JDK è così com'è. La cosa di WebLogic mi sembra un buco di sicurezza, non la vorrei nel JDK. – EJP

+3

non sono affatto retorici, sto cercando di capire come funziona ssl e capire le differenze tra jdk e weblogic. Forse c'è una ragione per questo. – paweloque

23

Dovrebbe essere possibile creare personalizzato java agent che sovrascrive predefinito HostnameVerifier:

import javax.net.ssl.*; 
import java.lang.instrument.Instrumentation; 

public class LenientHostnameVerifierAgent { 
    public static void premain(String args, Instrumentation inst) { 
     HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 
      public boolean verify(String s, SSLSession sslSession) { 
       return true; 
      } 
     }); 
    } 
} 

Poi basta aggiungere --javaagent:LenientHostnameVerifierAgent.jar di argomenti di avvio del programma java.

+1

Questo potrebbe essere un ottimo modo per gestirlo, ma ho a che fare con il client http di Apache. Come posso creare un javaagent per impostare 'SSLSocketFactory.setHostnameVerifier (new AllowAllHostnameVerifier())'? –

+0

@ utente finale, proprio come in questa risposta. – Vadzim

3

Ho avuto anche lo stesso problema durante l'accesso ai servizi Web RESTful. E io con il seguente codice per risolvere il problema:

public class Test { 
    //Bypassing the SSL verification to execute our code successfully 
    static { 
     disableSSLVerification(); 
    } 

    public static void main(String[] args) {  
     //Access HTTPS URL and do something  
    } 
    //Method used for bypassing SSL verification 
    public static void disableSSLVerification() { 

     TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
      public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
       return null; 
      } 

      public void checkClientTrusted(X509Certificate[] certs, String authType) { 
      } 

      public void checkServerTrusted(X509Certificate[] certs, String authType) { 
      } 

     } }; 

     SSLContext sc = null; 
     try { 
      sc = SSLContext.getInstance("SSL"); 
      sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
     } catch (KeyManagementException e) { 
      e.printStackTrace(); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } 
     HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 

     HostnameVerifier allHostsValid = new HostnameVerifier() { 
      public boolean verify(String hostname, SSLSession session) { 
       return true; 
      } 
     };  
     HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);   
    } 
} 

Ha funzionato per me. Provalo!!

+0

Questa soluzione non ha funzionato per me. – seanmcl

+3

Si fida di tutti i certificati, ma non ignora la verifica del nome host, quindi non risponde alla domanda. – EJP

Problemi correlati