zoukankan      html  css  js  c++  java
  • Java.HttpClient绕过Https证书解决方案二

    方案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证书;紫红色部分代码是关键代码
  • 相关阅读:
    【Linux】- 文件基本属性
    【Linux】- mv命令
    【Linux】- 守护进程supervisor安装使用
    【Linux】- rm命令
    【Linux】- 开启远程连接
    【Redis】- 安装为windows服务
    Apache2.4 与 php7.1.6的链接
    apache2.4 的安装
    MySQL v5.7.18 版本解压安装
    网站系统消息表设计
  • 原文地址:https://www.cnblogs.com/oumi/p/9161693.html
Copyright © 2011-2022 走看看