Android Open Source - hello-pinnedcerts Http Client Builder






From Project

Back to project page hello-pinnedcerts.

License

The source code is released under:

Copyright (c) 2014 Ivan Ku?t Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Softwar...

If you think the Android project hello-pinnedcerts listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package co.infinum.https;
/*from www.j a  v a  2  s. c om*/
import android.content.res.Resources;

import org.apache.http.client.CookieStore;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.scheme.SocketFactory;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

import java.io.IOException;
import java.io.InputStream;
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;

/**
 * Builder for creating Apache HttpClient with pinned certificate.
 */
public class HttpClientBuilder {


    static final String BOUNCY_CASTLE = "BKS";

    static final String TLS = "TLS";

    /**
     * HTTP scheme name in SchemeRegistry.
     */
    static final String HTTP_SCHEME = "http";

    /**
     * HTTPS scheme name in SchemeRegistry.
     */
    static final String HTTPS_SCHEME = "https";

    /**
     * Default HTTP port.
     */
    static final int HTTP_PORT = 80;

    /**
     * Default HTTPS port.
     */
    static final int HTTPS_PORT = 443;

    /**
     * If set to true all HTTPS requests will ignore other side certificate.
     * Beware that this could pose a security risk and should be used only for
     * development purposes.
     */
    protected boolean ignoreHttpsCertificates = false;

    /**
     * KeyStore containing certificates for HTTPS requests.
     */
    protected KeyStore keyStore = null;

    protected HttpParams httpParams = new BasicHttpParams();

    protected SchemeRegistry schemeRegistry = new SchemeRegistry();

    protected int httpPort = HTTP_PORT;

    protected int httpsPort = HTTPS_PORT;

    protected CookieStore cookieStore = new BasicCookieStore();

    public HttpClientBuilder setConnectionTimeout(int connectionTimeout) {
        HttpConnectionParams.setConnectionTimeout(httpParams, connectionTimeout);

        return this;
    }

    public HttpClientBuilder setSocketTimeout(int socketTimeout) {
        HttpConnectionParams.setSoTimeout(httpParams, socketTimeout);

        return this;
    }

    public HttpClientBuilder setCookieStore(CookieStore cookieStore) {
        this.cookieStore = cookieStore;

        return this;
    }

    public HttpClientBuilder pinCertificates(InputStream resourceStream, char[] password) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException {
        ignoreHttpsCertificates = false;

        keyStore = KeyStore.getInstance(BOUNCY_CASTLE);
        keyStore.load(resourceStream, password);

        return this;
    }

    public HttpClientBuilder pinCertificates(Resources resources, int certificateRawResource, char[] password) throws CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException {
        InputStream in = resources.openRawResource(certificateRawResource);
        pinCertificates(in, password);

        return this;
    }

    public HttpClientBuilder ignoreCertificates() {
        ignoreHttpsCertificates = true;

        return this;
    }

    public HttpClientBuilder registerScheme(String name, SocketFactory factory, int port) {
        schemeRegistry.register(new Scheme(name, factory, port));

        return this;
    }

    public HttpClientBuilder setHttpPort(int port) {
        httpPort = port;

        return this;
    }

    public HttpClientBuilder setHttpsPort(int port) {
        httpsPort = port;

        return this;
    }

    public DefaultHttpClient build() {
        DefaultHttpClient httpClient;

        schemeRegistry.register(new Scheme(HTTP_SCHEME, PlainSocketFactory.getSocketFactory(), httpPort));

        if (!ignoreHttpsCertificates && keyStore != null) {
            try {
                schemeRegistry.register(new Scheme(HTTPS_SCHEME, new SSLSocketFactory(keyStore), httpsPort));
            } catch (KeyManagementException e) {
                e.printStackTrace();
            } catch (UnrecoverableKeyException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (KeyStoreException e) {
                e.printStackTrace();
            }
        } else {
            schemeRegistry.register(new Scheme(HTTPS_SCHEME, SSLSocketFactory.getSocketFactory(), httpsPort));
        }

        ThreadSafeClientConnManager clientMan = new ThreadSafeClientConnManager(httpParams, schemeRegistry);

        if (ignoreHttpsCertificates) {
            httpClient = new IgnorantHttpClient();
        } else {
            httpClient = new DefaultHttpClient(clientMan, httpParams);
        }

        if(cookieStore != null) {
            httpClient.setCookieStore(cookieStore);
        }

        return httpClient;
    }
}




Java Source Code List

co.infinum.https.CustomTrustManager.java
co.infinum.https.HttpClientBuilder.java
co.infinum.https.IgnorantHttpClient.java
co.infinum.https.MainActivity.java
co.infinum.https.RetrofitApacheClientBuilder.java
co.infinum.https.RetrofitClientBuilder.java
co.infinum.https.retrofit.GitHubService.java
co.infinum.https.retrofit.Logger.java
co.infinum.https.retrofit.User.java