2014-06-24 32 views
6

Sto tentando di aggiungere il supporto SNI utilizzando SSLCertificateSocketFactory.setHostname, Con wireshark vedo la comunicazione tra client e server abilitato SNI, CLIENT HELLO va al server (con il nome host corretto impostato), Server risponde con Server Hello e invia certificato al client ma dopo che il client non sta inviando certificati e interruzioni di comunicazione/Handshake, tramite comando openssl openssl s_client -connect theclient -servername thehostname -cert ilcertificato tutto va liscio, l'handshake si verifica correttamente ..Supporto HTTPS SNI per Android tramite SSLCertificateSocketFactory

Sto usando i socket e su socket.startHandshake ottengo un'eccezione: IOException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: T Ancora ruggine per percorso di certificazione non trovato.

  final SSLCertificateSocketFactory sslSocketFactory = (SSLCertificateSocketFactory) SSLCertificateSocketFactory.getDefault(0); 

      socket = (SSLSocket) sslSocketFactory.createSocket(InetAddress.getByName("theserver"), 443); 


      socket.setEnabledProtocols(socket.getSupportedProtocols()); 

      String[] cipherArray = socket.getEnabledCipherSuites(); 
      for(int i = 0; i<cipherArray.length; i++) { 
       Log.e("","Available Cipher:"+cipherArray[i]); 
      } 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
       sslSocketFactory.setHostname(socket, "thehostname"); 
      } else { 
       try { 
        java.lang.reflect.Method setHostnameMethod = socket.getClass().getMethod("setHostname", String.class); 
        setHostnameMethod.invoke(socket, "thehostname"); 
       } catch (Exception e) { 
        Log.w("", "SNI not useable", e); 
       } 
      } 
      socket.setSoTimeout(20000); 
      socket.setUseClientMode(true); 
      Log.i(getClass().toString(), "Connected."); 
      socket.startHandshake(); 
      SSLSession session = socket.getSession(); 
      boolean secured = session.isValid(); 

La soluzione di questo IOException SSLHANDSHAKEEXCEPTION su sviluppatori Android è https://developer.android.com/training/articles/security-ssl.html#CommonProblems:

"Take a CA specifica da un InputStream, lo usa per creare un archivio di chiavi, che viene poi utilizzato per creare e inizializzare un TrustManager. Un TrustManager è ciò che il sistema utilizza per convalidare i certificati dal server e, creando uno da un KeyStore con una o più CA, quelle saranno le sole CA attendibili da tale TrustManager

Dato il nuovo TrustManager, l'esempio inizializza un nuovo SSLContext che fornisce all'utente SSLSocketFactory può utilizzare per sovrascrivere il SSLSocketFactory predefinito da HttpsURLConnection. In questo modo la connessione utilizzerà i tuoi CA per la convalida dei certificati."

Ora lo sslcontext ritorna SSLSOCKETFACTORY, voglio usare SSLCertificateSocketFactory (per il metodo sethostname) Cosa fare .. Spero che la questione è chiara, se non mi lascia sa o si sentono liberi di fare a più chiaro

+2

Sto affrontando un problema simile. Seguirò ciò che succede qui. Ecco un pastebin di alcuni frammenti di codice che sto usando: http://pastebin.com/K18PwtLa – Derek

risposta

2

È possibile utilizzare la libreria NetCipher per ottenere una moderna configurazione TLS quando si utilizza Android HttpsURLConnection incluso il supporto SNI. NetCipher configura l'istanza HttpsURLConnection di utilizzare la versione TLS meglio supportato, così come il migliore suite di crittografie per quella versione TLS. Per prima cosa, aggiungilo al tuo build.gradle:

compile 'info.guardianproject.netcipher:netcipher:2.0.0-alpha1' 

Oppure si può scaricare il netcipher.jar e includerlo direttamente nella vostra app. Poi invece di chiamare:

HttpURLConnection connection = (HttpURLConnection) sourceUrl.openConnection(); 

chiamata questo:

HttpsURLConnection connection = NetCipher.getHttpsURLConnection(sourceUrl); 

Se volete vedere come il suo fare nel codice, guardo TlsOnlySocketFactory

+0

È un'ottima soluzione, ha funzionato e mi ha salvato. +1 da me – christian

Problemi correlati