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 请求出现异常!	请求ID:"+"
"+e.getMessage()+"
");
 70                 e.printStackTrace();
 71             } finally {// 使用finally块来关闭输出流、输入流
 72                 try {
 73                     if (in != null) {
 74                         in.close();
 75                     }
 76                 } catch (IOException ex) {
 77                     logger.error("关闭数据流出错了!
"+ex.getMessage()+"
");
 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接口的三个方法,不用对方法进行改动,可以写成内部类,也可以重新写一个类

原文地址:https://www.cnblogs.com/xing-12/p/8486844.html