zoukankan      html  css  js  c++  java
  • 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接口的三个方法,不用对方法进行改动,可以写成内部类,也可以重新写一个类
    
    
  • 相关阅读:
    最短路径之spfa
    最短路径之Bellman-Ford——解决负权边
    最短路径之Floyd-Warshall算法
    图上最短路径问题
    它们其实都是图(二分图)
    记忆化结果再利用 进一步探讨递推关系
    leetcode 376. 摆动序列 java
    leetcode 368. 最大整除子集 java
    leetcode 96. 不同的二叉搜索树 java
    leetcode 454. 四数相加 II java
  • 原文地址:https://www.cnblogs.com/xing-12/p/8486844.html
Copyright © 2011-2022 走看看