package pro.dbro.glance.http; import android.content.Context; import android.os.AsyncTask; import android.util.Log; import android.util.Pair; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.koushikdutta.ion.Ion; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManagerFactory; import pro.dbro.glance.R; /** * Created by davidbrodsky on 9/23/14. */ public class TrustManager { private static final int sCertResId = R.raw.apidiffbot; public static final String sIonInstanceName = "ohMyIon"; private static Pair<javax.net.ssl.TrustManager[], SSLContext> sTrustResult; public interface TrustRequestCallback { public void onSuccess(JsonObject result); } public static void setupIonTrustManager(Context context) { if (sTrustResult == null) sTrustResult = setupTrustManagement(context); Ion.getInstance(context, sIonInstanceName).getHttpClient().getSSLSocketMiddleware().setTrustManagers(sTrustResult.first); Ion.getInstance(context, sIonInstanceName).getHttpClient().getSSLSocketMiddleware().setSSLContext(sTrustResult.second); } public static void makeTrustRequest(Context context, final String urlStr, final TrustRequestCallback cb) { if (sTrustResult == null) sTrustResult = setupTrustManagement(context); new AsyncTask<Void, Void, JsonObject>() { @Override protected JsonObject doInBackground(Void... params) { try { URL url = new URL(urlStr); HttpsURLConnection urlConnection = null; urlConnection = (HttpsURLConnection)url.openConnection(); urlConnection.setSSLSocketFactory(sTrustResult.second.getSocketFactory()); InputStream in = urlConnection.getInputStream(); final Gson gson = new Gson(); final BufferedReader reader = new BufferedReader(new InputStreamReader(in)); return gson.fromJson(reader, JsonObject.class); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(JsonObject json) { cb.onSuccess(json); super.onPostExecute(json); } }.execute(); } private static Pair<javax.net.ssl.TrustManager[], SSLContext> setupTrustManagement(Context context) { CertificateFactory cf = null; try { cf = CertificateFactory.getInstance("X.509"); InputStream inStream = context.getResources().openRawResource(sCertResId); X509Certificate caCertificate = (X509Certificate)cf.generateCertificate(inStream); // Create a KeyStore containing our trusted CAs String keyStoreType = KeyStore.getDefaultType(); KeyStore keyStore = KeyStore.getInstance(keyStoreType); keyStore.load(null, null); keyStore.setCertificateEntry("ca", caCertificate); // Create a TrustManager that trusts the CAs in our KeyStore String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); tmf.init(keyStore); // Create an SSLContext that uses our TrustManager SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, tmf.getTrustManagers(), null); return new Pair<javax.net.ssl.TrustManager[], SSLContext>(tmf.getTrustManagers(), sslContext); } catch (CertificateException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } return null; } // private static String getStringFromStream(InputStream is) throws IOException { // BufferedReader r = new BufferedReader(new InputStreamReader(is)); // StringBuilder total = new StringBuilder(); // String line; // while ((line = r.readLine()) != null) { // total.append(line); // } // Log.i("NETWORK", "Got string from response " + total.toString()); // return total.toString(); // } }