Https Connection Android Https Connection Android android android

Https Connection Android


This is what I am doing. It simply doesn't check the certificate anymore.

// always verify the host - dont check for certificatefinal static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {    public boolean verify(String hostname, SSLSession session) {        return true;    }};/** * Trust every server - dont check for any certificate */private static void trustAllHosts() {    // Create a trust manager that does not validate certificate chains    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {        public java.security.cert.X509Certificate[] getAcceptedIssuers() {            return new java.security.cert.X509Certificate[] {};        }        public void checkClientTrusted(X509Certificate[] chain,                String authType) throws CertificateException {        }        public void checkServerTrusted(X509Certificate[] chain,                String authType) throws CertificateException {        }    } };    // Install the all-trusting trust manager    try {        SSLContext sc = SSLContext.getInstance("TLS");        sc.init(null, trustAllCerts, new java.security.SecureRandom());        HttpsURLConnection                .setDefaultSSLSocketFactory(sc.getSocketFactory());    } catch (Exception e) {        e.printStackTrace();    }}

and

    HttpURLConnection http = null;    if (url.getProtocol().toLowerCase().equals("https")) {        trustAllHosts();        HttpsURLConnection https = (HttpsURLConnection) url.openConnection();        https.setHostnameVerifier(DO_NOT_VERIFY);        http = https;    } else {        http = (HttpURLConnection) url.openConnection();    }


I'm making a guess, but if you want an actual handshake to occur, you have to let android know of your certificate. If you want to just accept no matter what, then use this pseudo-code to get what you need with the Apache HTTP Client:

SchemeRegistry schemeRegistry = new SchemeRegistry ();schemeRegistry.register (new Scheme ("http",    PlainSocketFactory.getSocketFactory (), 80));schemeRegistry.register (new Scheme ("https",    new CustomSSLSocketFactory (), 443));ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager (    params, schemeRegistry);return new DefaultHttpClient (cm, params);

CustomSSLSocketFactory:

public class CustomSSLSocketFactory extends org.apache.http.conn.ssl.SSLSocketFactory{private SSLSocketFactory FACTORY = HttpsURLConnection.getDefaultSSLSocketFactory ();public CustomSSLSocketFactory ()    {    super(null);    try        {        SSLContext context = SSLContext.getInstance ("TLS");        TrustManager[] tm = new TrustManager[] { new FullX509TrustManager () };        context.init (null, tm, new SecureRandom ());        FACTORY = context.getSocketFactory ();        }    catch (Exception e)        {        e.printStackTrace();        }    }public Socket createSocket() throws IOException{    return FACTORY.createSocket();} // TODO: add other methods like createSocket() and getDefaultCipherSuites(). // Hint: they all just make a call to member FACTORY }

FullX509TrustManager is a class that implements javax.net.ssl.X509TrustManager, yet none of the methods actually perform any work, get a sample here.

Good Luck!


While trying to answer this question I found a better tutorial. With it you don't have to compromise the certificate check.

http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html

*I did not write this but thanks to Bob Lee for the work