1. 程式人生 > >Java.HttpClient繞過Https證書解決方案二

Java.HttpClient繞過Https證書解決方案二

div boolean IT ava 緩沖 pre lds 指定 x509

方案2

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.*;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class HttpRequest
{
    /**
     * 向指定URL發送GET方法的請求
     * @param url  發送請求的URL
     * @param param 請求參數,請求參數應該是 name1=value1&name2=value2 的形式。
     * @return URL 所代表遠程資源的響應結果
     */
    public static String Get(String url, String param)
    {
        return Get(url, param, false);
    }

    /**
     * 向指定URL發送GET方法的請求
     * @param url   發送請求的URL
     * @param param  請求參數,請求參數應該是 name1=value1&name2=value2 的形式。
     * @return URL 所代表遠程資源的響應結果
     */
    public static String Get(String url, String param, Boolean isHttpsRequest)
    {
        String result = "";
        BufferedReader in = null;
        try
        {
            if (isHttpsRequest)
            {
                HttpRequest.Instance().TrustHpps();
} String urlNameString = url + "?" + param; URL realUrl = new URL(urlNameString); // 打開和URL之間的連接 URLConnection connection = realUrl.openConnection(); // 設置通用的請求屬性 connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 建立實際的連接 connection.connect(); // 獲取所有響應頭字段 Map<String, List<String>> map = connection.getHeaderFields(); // 遍歷所有的響應頭字段 for (String key : map.keySet()) { System.out.println(key + "--->" + map.get(key)); } // 定義 BufferedReader輸入流來讀取URL的響應 in = new BufferedReader(new InputStreamReader( connection.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("發送GET請求出現異常!" + e); e.printStackTrace(); } // 使用finally塊來關閉輸入流 finally { try { if (in != null) { in.close(); } } catch (Exception e2) { e2.printStackTrace(); } } return result; } /** * 向指定 URL 發送POST方法的請求 * @param url 發送請求的 URL * @param param 請求參數,請求參數應該是 name1=value1&name2=value2 的形式。 * @return 所代表遠程資源的響應結果 */ public static String Post(String url, String param) { return Post(url, param, false); } /** * 向指定 URL 發送POST方法的請求 * @param url 發送請求的 URL * @param param 請求參數,請求參數應該是 name1=value1&name2=value2 的形式。 * @param isHttpsRequest 是否Https請求 * @return 所代表遠程資源的響應結果 */ public static String Post(String url, String param, Boolean isHttpsRequest) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { if (isHttpsRequest) { HttpRequest.Instance().TrustHpps();
} URL realUrl = new URL(url); // 打開和URL之間的連接 URLConnection conn = realUrl.openConnection(); // 設置通用的請求屬性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 發送POST請求必須設置如下兩行 conn.setDoOutput(true); conn.setDoInput(true); // 獲取URLConnection對象對應的輸出流 out = new PrintWriter(conn.getOutputStream()); // 發送請求參數 out.print(param); // flush輸出流的緩沖 out.flush(); // 定義BufferedReader輸入流來讀取URL的響應 in = new BufferedReader( new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("發送 POST 請求出現異常!" + e); e.printStackTrace(); } // 使用finally塊來關閉輸出流、輸入流 finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; } /** * 信任證書管理 * */ private static TrustManager[] TrustAllCerts = new TrustManager[] { new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { // TODO Auto-generated method stub } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { // TODO Auto-generated method stub } @Override public X509Certificate[] getAcceptedIssuers() { // TODO Auto-generated method stub return null; } } };
/** * 主機證書認證 * */ private class NullHostNameVerifier implements HostnameVerifier { /* * (non-Javadoc) * @see javax.net.ssl.HostnameVerifier#verify(java.lang.String, * javax.net.ssl.SSLSession) */ @Override public boolean verify(String arg0, SSLSession arg1) { // TODO Auto-generated method stub return true; } } private static HttpRequest _HttpRequest; /** * Http請求封裝實例 * */ public static HttpRequest Instance() { if (_HttpRequest == null) { _HttpRequest = new HttpRequest(); } return _HttpRequest; } /** * 信任HTTPS * */ public void TrustHpps() throws Exception { HttpsURLConnection .setDefaultHostnameVerifier(new NullHostNameVerifier()); SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, HttpRequest.TrustAllCerts, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } }

測試代碼

        String  address="https網頁地址";
         //繞過Https證書方案2
        String reslt2= HttpRequest.Get(address,null,true);
        System.out.println(reslt2);   
        //說明請求過程中沒發生異常,且網頁正常返回,就說明成功繞過Https證書;紫紅色部分代碼是關鍵代碼

Java.HttpClient繞過Https證書解決方案二