Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android Habilitar TLSv1.2 en OKHttp

Estoy usando OKHttp para mi proyecto. Quiero habilitar TLSv1.2 para mi llamada de servicio. Cualquier persona puede decirme cómo habilitarlo.

  • ¿Cómo evitar las filtraciones de Eclipse en XServer al editar archivos XML de Android?
  • El color de fondo de la lista se vuelve blanco al desplazarse cuando se utiliza android.support.v4.app.ListFragment;
  • La aplicación Phonegap se bloquea cuando cambia de orientación incluso con los cambios de AndroidManifest
  • Android: Retrofit URL Path Sin "/"
  • ScrollView no muestra la parte superior
  • Gestión de memoria HttpClient
  • Anular el registro de un dispositivo de GCM mediante la identificación de registro en Android
  • Android - ¿Cómo descargar una imagen y usarla como nuevo recurso?
  • Determinar el fragmento visible en ViewPager
  • ¿Pruebas beta de Google Play sin una aplicación publicada?
  • ¿Cómo comprobar si el fragmento existe?
  • Los puntos de interrupción no funcionan al depurar la biblioteca nativa de Android en Visual Studio 2015
  • 5 Solutions collect form web for “Android Habilitar TLSv1.2 en OKHttp”

    Consulte la documentación HTTPS de OkHttp.

    ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) .tlsVersions(TlsVersion.TLS_1_2) .cipherSuites( CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256) .build(); OkHttpClient client = ... client.setConnectionSpecs(Collections.singletonList(spec)); 

    Por lo que sé OKHttp no incluye propias bibliotecas SSL / TLS, por lo tanto, sólo utiliza el estándar SSLSocket proporcionado por Android.

    Qué versiones TLS son compatibles (y habilitado) depende de la versión de Android utilizada. En algunos teléfonos, TLS 1.2 está soportado pero no habilitado de forma predeterminada. En estos casos, puede habilitarlo implementando un wrapper personalizado SSLSocketFactory que utiliza internamente el SSLSocketFactory predeterminado y llama a setEnabledProtocols(new String{"TLS1.2"}) en cada Socket que se crea.

    ¡Compruebe mi código !! ¡Trabajo perfecto!

     private void checkTls() { if (android.os.Build.VERSION.SDK_INT < 21) { try { ProviderInstaller.installIfNeededAsync(this, new ProviderInstaller.ProviderInstallListener() { @Override public void onProviderInstalled() { } @Override public void onProviderInstallFailed(int i, Intent intent) { } }); } catch (Exception e) { finish(); e.printStackTrace(); } } } 

    Resulta que mi solución es muy similar a la de Ken (excepto en Java). Lo encontré aquí aunque tenía que hacer un par de pequeños cambios para que funcione. Esperemos que esto funcione " fuera de la caja " para otros.

     public class TLSSocketFactoryCompat extends SSLSocketFactory { private SSLSocketFactory internalSSLSocketFactory; public TLSSocketFactoryCompat() throws KeyManagementException, NoSuchAlgorithmException { SSLContext context = SSLContext.getInstance("TLS"); context.init(null, null, null); internalSSLSocketFactory = context.getSocketFactory(); } public TLSSocketFactoryCompat(TrustManager[] tm) throws KeyManagementException, NoSuchAlgorithmException { SSLContext context = SSLContext.getInstance("TLS"); context.init(null, tm, new java.security.SecureRandom()); internalSSLSocketFactory = context.getSocketFactory(); } @Override public String[] getDefaultCipherSuites() { return internalSSLSocketFactory.getDefaultCipherSuites(); } @Override public String[] getSupportedCipherSuites() { return internalSSLSocketFactory.getSupportedCipherSuites(); } @Override public Socket createSocket() throws IOException { return enableTLSOnSocket(internalSSLSocketFactory.createSocket()); } @Override public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose)); } @Override public Socket createSocket(String host, int port) throws IOException, UnknownHostException { return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); } @Override public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort)); } @Override public Socket createSocket(InetAddress host, int port) throws IOException { return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); } @Override public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort)); } private Socket enableTLSOnSocket(Socket socket) { if(socket != null && (socket instanceof SSLSocket)) { //Create list of supported protocols ArrayList<String> supportedProtocols = new ArrayList<>(); for (String protocol : ((SSLSocket)socket).getEnabledProtocols()) { //Log.d("TLSSocketFactory", "Supported protocol:" + protocol); //Only add TLS protocols (don't want ot support older SSL versions) if (protocol.toUpperCase().contains("TLS")) { supportedProtocols.add(protocol); } } //Force add TLSv1.1 and 1.2 if not already added if (!supportedProtocols.contains("TLSv1.1")) { supportedProtocols.add("TLSv1.1"); } if (!supportedProtocols.contains("TLSv1.2")) { supportedProtocols.add("TLSv1.2"); } String[] protocolArray = supportedProtocols.toArray(new String[supportedProtocols.size()]); /*for (int i = 0; i < protocolArray.length; i++) { Log.d("TLSSocketFactory", "protocolArray[" + i + "]" + protocolArray[i]); }*/ //enable protocols in our list ((SSLSocket)socket).setEnabledProtocols(protocolArray); } return socket; } 

    }

    Uso:

      OkHttpClient httpClient = new OkHttpClient(); //Add Custom SSL Socket Factory which adds TLS 1.1 and 1.2 support for Android 4.1-4.4 try { httpClient.setSslSocketFactory(new TLSSocketFactoryCompat()); } catch (KeyManagementException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } 

    Esto es básicamente el mismo que la respuesta anterior, pero me siento como una muestra de código sería útil para cualquier otra persona que tierras aquí y no es hasta la velocidad en la navegación en el paisaje de java ssl.

    Lo que en última instancia terminó trabajando para mí se basó en el tema que se informa aquí: https://github.com/mattleibow/square-bindings/issues/1
    De esta esencia https://gist.github.com/mattleibow/c8abfa323db094b820cc

    Tenga en cuenta que estos ejemplos de código están en C # / Xamarin pero pueden traducirse a java con bastante facilidad.

     internal class CompleteSSLSocketFactory : SSLSocketFactory { private readonly SSLSocketFactory innerFactory; public CompleteSSLSocketFactory (SSLSocketFactory innerFactory) { this.innerFactory = innerFactory; } public override string[] GetDefaultCipherSuites () { return innerFactory.GetDefaultCipherSuites (); } public override string[] GetSupportedCipherSuites () { return innerFactory.GetSupportedCipherSuites (); } public override Socket CreateSocket () { return MakeSocketSafe (innerFactory.CreateSocket ()); } public override Socket CreateSocket (Socket s, string host, int port, bool autoClose) { return MakeSocketSafe (innerFactory.CreateSocket (s, host, port, autoClose)); } public override Socket CreateSocket (string host, int port) { return MakeSocketSafe (innerFactory.CreateSocket (host, port)); } public override Socket CreateSocket (string host, int port, InetAddress localHost, int localPort) { return MakeSocketSafe (innerFactory.CreateSocket (host, port, localHost, localPort)); } public override Socket CreateSocket (InetAddress host, int port) { return MakeSocketSafe (innerFactory.CreateSocket (host, port)); } public override Socket CreateSocket (InetAddress address, int port, InetAddress localAddress, int localPort) { return MakeSocketSafe (innerFactory.CreateSocket (address, port, localAddress, localPort)); } private Socket MakeSocketSafe (Socket socket) { var sslSocket = socket as SSLSocket; if (sslSocket != null) { // enable all supported protocols for this socket sslSocket.SetEnabledProtocols (sslSocket.GetSupportedProtocols ()); sslSocket.SetEnabledCipherSuites (sslSocket.GetSupportedCipherSuites ()); } return socket; } } 

    Y luego llamarlo como:

     // this.client is an OkHttpClient if (Android.OS.Build.VERSION.SdkInt < BuildVersionCodes.Lollipop) { this.client.SetSslSocketFactory(new CompleteSSLSocketFactory(HttpsURLConnection.DefaultSSLSocketFactory)); } 

    Esto funcionó para mí, probado en API 19.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.