Httpclient绕过https安全认证

一、问题的出处

  1. 项目开发过程中,对前期使用的 华为云共享版 进行切换成 华为云专享版
  2. 请求的URL地址中:传输协议从之前的 http 变成了现在的 https
  3. 所以就涉及到SSL安全认证的问题:
    • 在网络上有两种https,一种是安全的,一种是不安全的。
      • 例如:https://www.baidu.com,这个地址虽说是https请求,但因为是安全的,所以不用绕过,可以直接httpclient访问。
    • 还有一些网址是不安全的,我们访问的时候,会提示不安全的连接。
      • 对于不安全的https,可以通过两种方式解决。
        • 是通过认证需要的密钥配置httpclient。
        • 是配置httpclient绕过https安全认证。

二、Httpclient绕过https安全认证

  1. 实际请求过程中,使用的是带参数的POST请求方式。
  2. 关键代码行数为12 ~ 264490 ~ 124
  3. 通过以下的代码:亲测成功实现了、Httpclient绕过https安全认证
  4. 以下代码仅供参考、具体问题具体分析。
 /**
  *
  * @param method 请求方式
  * @param url 请求地址
  * @param body 时间参数
  * @return
  */
public static List<Map<String,Object>> getTransferVipData(String method,String url,String body) throws Exception {
        List<Map<String,Object>>result = new ArrayList<>();
        Request request = new Request();
        
        //信任所有证书,关闭主机名校验
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                SSLContexts.custom().loadTrustMaterial(null,new TrustSelfSignedStrategy()).build(), NoopHostnameVerifier.INSTANCE);
        //设置协议http和https对应的处理socket链接工厂的对象
        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.INSTANCE)
                .register("https", createIgnoreVerifySSL())
                .build();
        // 创建一个ConnectionManager
        PoolingHttpClientConnectionManager pool = new PoolingHttpClientConnectionManager(registry);
        // 定制CloseableHttpClient对象
        HttpClientBuilder httpClientBuilder = HttpClients.custom().setConnectionManager(pool).setSSLSocketFactory(sslsf);
        // 配置httpclient之后,通过build()获取httoclient对象
        CloseableHttpClient closeableHttpClient = httpClientBuilder.build();
        CloseableHttpResponse response = null;
        
        try {
            //设置请求参数
            //AppKey, AppSecrect, Method and Url are required parameters.
            request.setKey("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
            request.setSecret("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
            request.setMethod(method);
            request.setUrl(url);
            request.setBody(body);
            request.addHeader("Content-Type", "application/json");
            request.addHeader("X-Dlm-Type","EXCLUSIVE");

            //签署请求
            HttpRequestBase signedRequest = Client.sign(request);
            Header[] authorization = signedRequest.getHeaders("Authorization");
            signedRequest.addHeader("x-Authorization",authorization[0].getValue());
            //发送请求
            response = closeableHttpClient.execute(signedRequest);
            //打印响应的状态行
            System.out.println(response.getStatusLine().toString());
            //打印响应的标题字段
            Header[] resHeaders = response.getAllHeaders();
            for (Header h : resHeaders) {
                System.out.println(h.getName() + ":" + h.getValue());
            }
            //打印响应的正文
            HttpEntity resEntity = response.getEntity();
            if (resEntity != null) {
                String datas = EntityUtils.toString(resEntity, "UTF-8");
                JSONObject obj = JSONObject.parseObject(datas);
                JSONObject source = obj.getJSONObject("data");
                JSONArray list = source.getJSONArray("data");
                for (int i = 0; i < list.size(); i++) {
                    Map<String,Object> map = (Map<String, Object>) list.get(i);
                    result.add(map);
                }
            }
            // 确保流关闭
            EntityUtils.consume(resEntity);
        } catch (Exception e) {
            log.info("POST请求失败");
            e.printStackTrace();
        } finally {
            if (closeableHttpClient != null) {
                try {
                    closeableHttpClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (response != null) {
                try {
                    response.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }



	/**
     * 绕过验证
     * @return
     * @throws NoSuchAlgorithmException
     * @throws KeyManagementException
     */
    public static SSLConnectionSocketFactory createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {
        SSLConnectionSocketFactory sslsf = null;
        try {
            SSLContext sc = SSLContext.getInstance("TLS");

            // 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法
            X509TrustManager trustManager = new X509TrustManager() {
                @Override
                public void checkClientTrusted(
                        java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
                        String paramString) throws CertificateException {
                }
                @Override
                public void checkServerTrusted(
                        java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
                        String paramString) throws CertificateException {
                }
                @Override
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            };
            sc.init(null, new TrustManager[] { trustManager }, null);
            sslsf = new SSLConnectionSocketFactory(sc, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        }catch (GeneralSecurityException e){
            e.printStackTrace();
        }
        return sslsf;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值