1. 程式人生 > >http https信任任何證書的工具類

http https信任任何證書的工具類

轉載:http://www.cnblogs.com/handsomeye/p/5802448.html

向原作者致敬,如有冒犯可聯絡本人刪除即可.

import java.io.BufferedReader;
   import java.io.InputStream;
   import java.io.InputStreamReader;
   import java.io.OutputStream;
   import java.net.HttpURLConnection;
   import java.net.URL;
   import java.net.URLEncoder;
   import java.util.Map;
  import java.util.Map.Entry;
  
  import javax.net.ssl.HostnameVerifier;
  import javax.net.ssl.HttpsURLConnection;
  import javax.net.ssl.SSLContext;
  import javax.net.ssl.SSLSession;
  import javax.net.ssl.SSLSocketFactory;
  import javax.net.ssl.TrustManager;
  
  import org.springframework.util.StringUtils;
  
 /**
   * http、https 請求工具類, 微信為https的請求
   * @author yehx
   *
   */
  public class HttpUtil {
  
      private static final String DEFAULT_CHARSET = "UTF-8";
  
      private static final String _GET = "GET"; // GET
      private static final String _POST = "POST";// POST
      public static final int DEF_CONN_TIMEOUT = 30000;
      public static final int DEF_READ_TIMEOUT = 30000;
  
      /**
       * 初始化http請求引數
      * 
      * @param url
      * @param method
       * @param headers
       * @return
       * @throws Exception
       */
      private static HttpURLConnection initHttp(String url, String method,
              Map<String, String> headers) throws Exception {
         URL _url = new URL(url);
          HttpURLConnection http = (HttpURLConnection) _url.openConnection();
          // 連線超時
          http.setConnectTimeout(DEF_CONN_TIMEOUT);
          // 讀取超時 --伺服器響應比較慢,增大時間
          http.setReadTimeout(DEF_READ_TIMEOUT);
          http.setUseCaches(false);
          http.setRequestMethod(method);
          http.setRequestProperty("Content-Type",
                  "application/x-www-form-urlencoded");
          http.setRequestProperty(
                  "User-Agent",
                  "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");
          if (null != headers && !headers.isEmpty()) {
              for (Entry<String, String> entry : headers.entrySet()) {
                  http.setRequestProperty(entry.getKey(), entry.getValue());
              }
          }
          http.setDoOutput(true);
          http.setDoInput(true);
          http.connect();
         return http;
      }
  
      /**
       * 初始化http請求引數
       * 
       * @param url
       * @param method
       * @return
       * @throws Exception
       */
      private static HttpsURLConnection initHttps(String url, String method,
              Map<String, String> headers) throws Exception {
          TrustManager[] tm = { new MyX509TrustManager() };
          System.setProperty("https.protocols", "TLSv1");
          SSLContext sslContext = SSLContext.getInstance("TLS");
          sslContext.init(null, tm, new java.security.SecureRandom());
          // 從上述SSLContext物件中得到SSLSocketFactory物件
          SSLSocketFactory ssf = sslContext.getSocketFactory();
          URL _url = new URL(url);
          HttpsURLConnection http = (HttpsURLConnection) _url.openConnection();
          // 設定域名校驗
          http.setHostnameVerifier(new HttpUtil().new TrustAnyHostnameVerifier());
          // 連線超時
          http.setConnectTimeout(DEF_CONN_TIMEOUT);
          // 讀取超時 --伺服器響應比較慢,增大時間
          http.setReadTimeout(DEF_READ_TIMEOUT);
          http.setUseCaches(false);
          http.setRequestMethod(method);
          http.setRequestProperty("Content-Type",
                  "application/x-www-form-urlencoded");
          http.setRequestProperty(
                  "User-Agent",
                  "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");
         if (null != headers && !headers.isEmpty()) {
             for (Entry<String, String> entry : headers.entrySet()) {
                 http.setRequestProperty(entry.getKey(), entry.getValue());
             }
         }
         http.setSSLSocketFactory(ssf);
         http.setDoOutput(true);
         http.setDoInput(true);
         http.connect();
         return http;
     }
 
     /**
     * 
      * @description 功能描述: get 請求
      * @return 返回型別:
      * @throws Exception
      */
     public static String get(String url, Map<String, String> params,
             Map<String, String> headers) throws Exception {
         HttpURLConnection http = null;
         if (isHttps(url)) {
             http = initHttps(initParams(url, params), _GET, headers);
         } else {
             http = initHttp(initParams(url, params), _GET, headers);
         }
         InputStream in = http.getInputStream();
         BufferedReader read = new BufferedReader(new InputStreamReader(in,
                 DEFAULT_CHARSET));
         String valueString = null;
         StringBuffer bufferRes = new StringBuffer();
         while ((valueString = read.readLine()) != null) {
             bufferRes.append(valueString);
         }
         in.close();
         if (http != null) {
             http.disconnect();// 關閉連線
         }
         return bufferRes.toString();
     }
 
     public static String get(String url) throws Exception {
         return get(url, null);
     }
 
     public static String get(String url, Map<String, String> params)
             throws Exception {
         return get(url, params, null);
     }
 
     public static String post(String url, String params)
             throws Exception {
         HttpURLConnection http = null;
         if (isHttps(url)) {
             http = initHttps(url, _POST, null);
         } else {
             http = initHttp(url, _POST, null);
         }
         OutputStream out = http.getOutputStream();
         out.write(params.getBytes(DEFAULT_CHARSET));
         out.flush();
         out.close();
 
         InputStream in = http.getInputStream();
         BufferedReader read = new BufferedReader(new InputStreamReader(in,
                 DEFAULT_CHARSET));
        String valueString = null;
         StringBuffer bufferRes = new StringBuffer();
         while ((valueString = read.readLine()) != null) {
            bufferRes.append(valueString);
         }
         in.close();
         if (http != null) {
             http.disconnect();// 關閉連線
        }
         return bufferRes.toString();
     }
 
     /**
      * 功能描述: 構造請求引數
      * 
      * @return 返回型別:
      * @throws Exception
      */
     public static String initParams(String url, Map<String, String> params)
             throws Exception {
         if (null == params || params.isEmpty()) {
             return url;
         }
         StringBuilder sb = new StringBuilder(url);
         if (url.indexOf("?") == -1) {
             sb.append("?");
         }
         sb.append(map2Url(params));
         return sb.toString();
     }
 
     /**
     * map構造url
      * 
      * @return 返回型別:
      * @throws Exception
      */
     public static String map2Url(Map<String, String> paramToMap)
             throws Exception {
         if (null == paramToMap || paramToMap.isEmpty()) {
             return null;
         }
         StringBuffer url = new StringBuffer();
         boolean isfist = true;
         for (Entry<String, String> entry : paramToMap.entrySet()) {
            if (isfist) {
                isfist = false;
             } else {
                 url.append("&");
             }
             url.append(entry.getKey()).append("=");
             String value = entry.getValue();
             if (!StringUtils.isEmpty(value)) {
                 url.append(URLEncoder.encode(value, DEFAULT_CHARSET));
             }
         }
         return url.toString();
     }
 
     /**
      * 檢測是否https
      * 
      * @param url
      */
    private static boolean isHttps(String url) {
         return url.startsWith("https");
     }
 
     /**
      * https 域名校驗
      * 
      * @param url
      * @param params
      * @return
      */
     public class TrustAnyHostnameVerifier implements HostnameVerifier {
         public boolean verify(String hostname, SSLSession session) {
             return true;// 直接返回true
         }
     }
 }

/**
 * 證書信任管理器(用於https請求)
 * 
 */
public class MyX509TrustManager implements X509TrustManager {
	// 檢查客戶端證書
	public void checkClientTrusted(X509Certificate[] chain, String authType)
			throws CertificateException {
	}

	// 檢查伺服器端證書
	public void checkServerTrusted(X509Certificate[] chain, String authType)
			throws CertificateException {
	}

	// 返回受信任的x509陣列
	public X509Certificate[] getAcceptedIssuers() {
		return null;
	}
}