java訪問https繞過證書信任


  1 package com.xing.test;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.IOException;
  5 import java.io.InputStreamReader;
  6 import java.io.PrintWriter;
  7 import java.net.HttpURLConnection;
  8 import java.net.URL;
  9 
 10 import javax.net.ssl.HostnameVerifier;
 11 import javax.net.ssl.HttpsURLConnection;
 12 import javax.net.ssl.SSLSession;
 13 
 14 import org.apache.log4j.Logger;
 15 
 16 public class HttpsTest {
 17         private String url = "https://kyfw.12306.cn/";
 18         private Logger logger;
 19         public HttpsTest() {
 20             logger = Logger.getLogger(HttpsTest.class);
 21         }
 22         private static void trustAllHttpsCertificates() throws Exception {
 23             javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
 24             javax.net.ssl.TrustManager tm = new miTM();
 25             trustAllCerts[0] = tm;
 26             javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL","SunJSSE");
 27             sc.init(null, trustAllCerts, null);
 28             javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
 29         }
 30         
 31         public String getData() {
 32             PrintWriter out = null;
 33             BufferedReader in = null;
 34             HttpURLConnection conn = null;
 35             String result = "";
 36             try {
 37                 //該部分必須在獲取connection前調用
 38                 trustAllHttpsCertificates();
 39                 HostnameVerifier hv = new HostnameVerifier() {
 40                     @Override
 41                     public boolean verify(String urlHostName, SSLSession session) {
 42                         logger.info("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
 43                         return true;
 44                     }
 45                 };
 46                 HttpsURLConnection.setDefaultHostnameVerifier(hv);
 47                 conn = (HttpURLConnection)new URL(url).openConnection();
 48                 // 發送GET請求必須設置如下兩行
 49                 conn.setDoInput(true);
 50                 conn.setRequestMethod("GET");
 51 //                // 發送POST請求必須設置如下兩行
 52 //                conn.setDoOutput(true);
 53 //                conn.setDoInput(true);
 54 //                
 55 //                // 獲取URLConnection對象對應的輸出流
 56 //                out = new PrintWriter(conn.getOutputStream());
 57 //                // 發送請求參數
 58 ////                out.print(params);
 59 //                // flush輸出流的緩沖
 60 //                out.flush();
 61                 
 62                 //flush輸出流的緩沖
 63                 in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
 64                 String line;
 65                 while ((line = in.readLine()) != null) {
 66                     result += line;
 67                 }
 68             } catch (Exception e) {
 69                 logger.error("發送 GET 請求出現異常!\t請求ID:"+"\n"+e.getMessage()+"\n");
 70                 e.printStackTrace();
 71             } finally {// 使用finally塊來關閉輸出流、輸入流
 72                 try {
 73                     if (in != null) {
 74                         in.close();
 75                     }
 76                 } catch (IOException ex) {
 77                     logger.error("關閉數據流出錯了!\n"+ex.getMessage()+"\n");
 78                     ex.printStackTrace();
 79                 }
 80             }
 81             // 獲得相應結果result,可以直接處理......
 82             return result;
 83             
 84         }
 85         static class miTM implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager {
 86             public java.security.cert.X509Certificate[] getAcceptedIssuers() {
 87                 return null;
 88             }
 89 
 90             public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) {
 91                 return true;
 92             }
 93 
 94             public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) {
 95                 return true;
 96             }
 97 
 98             public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
 99                     throws java.security.cert.CertificateException {
100                 return;
101             }
102 
103             public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
104                     throws java.security.cert.CertificateException {
105                 return;
106             }
107         }
108     }

在連接之前調用

實現javax.net.ssl.X509TrustManager接口的三個方法,不用對方法進行改動,可以寫成內部類,也可以重新寫一個類

 

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM