天天看点

Security with HTTPS and SSL

现在google play对https有比较严格的审核,所以不能用httpclient来跳过https验证

参考文章:

1.https://developer.android.com/training/articles/security-ssl.html#HttpsExample

2.http://www.codeproject.com/Articles/826045/Android-security-Implementation-of-Self-signed-SSL

public class HttpsRequestUtil {
  /**
   * @param url
   * @return result
   */
  
  
  private static final int SET_CONNECTION_TIMEOUT = 15 * 1000;  
  private static final int SET_READ_TIMEOUT = 15 * 1000;  
        private static final int SET_SOCKET_TIMEOUT = 15 * 1000; 
    
  
   
   public static String doHttpsRequest(String requestURL, Context mContext,String cerFile ){
     MyLogCat.d(Constants.TAG,"doHttpsRequest requestURL = " + requestURL);
     String resutl = null;
     CertificateFactory cf;
    try {
      cf = CertificateFactory.getInstance("X.509");
      AssetManager am = mContext.getAssets();
      
      InputStream caInput = new BufferedInputStream(am.open(cerFile));
      Certificate ca;
      try {
          ca = cf.generateCertificate(caInput);
         // System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());
      } finally {
          try {
          caInput.close();
        } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }

      // Create a KeyStore containing our trusted CAs
      String keyStoreType = KeyStore.getDefaultType();
      KeyStore keyStore = KeyStore.getInstance(keyStoreType);
      keyStore.load(null, null);
      keyStore.setCertificateEntry("ca", ca);

      // 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 context = SSLContext.getInstance("TLS");
      context.init(null, tmf.getTrustManagers(), null);

      // Tell the URLConnection to use a SocketFactory from our SSLContext
      /*URL url = new URL("https://certs.cac.washington.edu/CAtest/");*/
      javax.net.ssl.SSLSocketFactory sslSocket = context.getSocketFactory();
      HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
      
      URL url = new URL(requestURL);
      HttpsURLConnection urlConnection =
          (HttpsURLConnection)url.openConnection();
      urlConnection.setSSLSocketFactory(context.getSocketFactory());
      urlConnection.setHostnameVerifier(hostnameVerifier);
      urlConnection.setConnectTimeout(SET_CONNECTION_TIMEOUT);
      urlConnection.setReadTimeout(SET_READ_TIMEOUT);
      
      InputStream in = urlConnection.getInputStream();
      //copyInputStreamToOutputStream(in, System.out);
      
      BufferedReader reader = new BufferedReader(new InputStreamReader(in));    

          StringBuilder sb = new StringBuilder();    

       

          String line = null;    

          try {    

              while ((line = reader.readLine()) != null) {    

                  sb.append(line);    

              }    

          } catch (IOException e) {    

              e.printStackTrace();    

          } finally {    

              try {    

                  in.close();    

              } catch (IOException e) {    

                  e.printStackTrace();    

              }   
          }
          
          if (sb!=null){
            resutl = sb.toString();
            
          }
    } catch (CertificateException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    } catch (FileNotFoundException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    } catch (NoSuchAlgorithmException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    } catch (KeyStoreException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    } catch (KeyManagementException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    } catch (MalformedURLException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    } catch (IOException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    }
    MyLogCat.d(Constants.TAG,"doHttpsRequest reuslt = " + resutl);
    return resutl;

   }
   
  
  
  
}