Hacer peticiones HTTPS desde Android

Hace unas semanas empezamos con el desarrollo de nuestra nueva aplicación. Al igual que InfoBolsa CED era necesario implementarla haciendo llamadas mediante la libreria de Apache HttpClient a un servidor externo. Esta nueva aplicación hace uso del núcleo principal de InfoBolsa CED ya que estará orientada a la misma funcionalidad pero para otra comunidad autónoma.

La diferencia principal con InfoBolsa CED es que esta vez era necesario llamar al servidor externo haciendo uso de HTTPS. Así que nos pusimos manos a la obra y empezamos a investigar por internet para llegar a tener dicha funcionalidad.

Lo primero es levantar el KeyStore de Java y cargarlo en una clase que extiende de SSLSocketFactory implementada para el caso. Una vez intanciado el Socket para la llamada se le indica que esquema y puerto va a usar para luego registrarlo en nuestro HttpClient.

DefaultHttpClient localDefaultHttpClient = new DefaultHttpClient();
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);

SSLSocketFactory sf = new CtrlzAppsSSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Scheme sch = new Scheme("https", sf, 443);
localDefaultHttpClient.getConnectionManager().getSchemeRegistry().register(sch);

Y eso es todo, nuestra aplicación Android ya puede llamar a servidores externos usando HTTPS

A continuación os dejamos el código de la clase que implementa SSLSocketFactory. Como puedes ver, todo está instanciado a NULL ya que no es necesario enviar ningún certificado al servidor para autenticarnos.

package ctrlzapps.plugins.ssl;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.conn.ssl.SSLSocketFactory;

public class CtrlzAppsSSLSocketFactory extends SSLSocketFactory {

        SSLContext sslContext = SSLContext.getInstance("TLS");

        public CtrlzAppsSSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
              super(truststore);

              TrustManager tm = new X509TrustManager() {
                        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        public X509Certificate[] getAcceptedIssuers() {
                               return null;
                        }
              };

              sslContext.init(null, new TrustManager[] { tm }, null);
        }

        @Override
        public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
               return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
        }

        @Override
        public Socket createSocket() throws IOException {
               return sslContext.getSocketFactory().createSocket();
        }

}
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: