https,httpClient 绕过证书验证的两种写法「建议收藏」

https,httpClient 绕过证书验证的两种写法「建议收藏」https,httpClient 绕过证书验证的两种写法

大家好,又见面了,我是你们的朋友全栈君。

1,转自:https://blog.csdn.net/zi413293813/article/details/43795953

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;

import android.util.Log;

/**
 * 工具类:创建一个忽略用户证书验证的httpClient实例
 * @date 2015-02-13
 * @author Barry
 */
public class CertificateValidationIgnored {
	
	public static HttpClient getNoCertificateHttpClient(String url){
		return getCertificateValidationIgnoredHttpClient();
	}
	
	private static HttpClient getCertificateValidationIgnoredHttpClient() {  
        try {  
            KeyStore trustStore = KeyStore.getInstance(KeyStore  
                    .getDefaultType());  
            trustStore.load(null, null);  
            //核心代码,创建一个UnVerifySocketFactory对象,验证证书时总是返回true
            SSLSocketFactory sf = new UnVerifySocketFactory(trustStore);
            
            HttpParams params = new BasicHttpParams();  
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);  
            HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);  
            SchemeRegistry registry = new SchemeRegistry();  
            registry.register(new Scheme("http", PlainSocketFactory  
                    .getSocketFactory(), 80));  
            registry.register(new Scheme("https", sf, 443));  
            ClientConnectionManager ccm = new ThreadSafeClientConnManager(  
                    params, registry);  
            return new DefaultHttpClient(ccm, params);  
        } catch (Exception e) {  
        	Log.d("CertificateValidationIgnored", "创建忽略用户证书的HttpClient对象失败,尝试创建普通HttpClient对象");
        	e.printStackTrace();
            return new DefaultHttpClient();  
        }  
    }  
	
	/**
	 * 核心类
	 * UnVerifySocketFactory:一个验证证书时总是返回true的SSLSocketFactory的子类
	 */
	private static X509HostnameVerifier ignoreVerifier;
	private static class UnVerifySocketFactory extends SSLSocketFactory {
		SSLContext sslContext = SSLContext.getInstance("TLS");

		public UnVerifySocketFactory(KeyStore truststore)
				throws NoSuchAlgorithmException, KeyManagementException,
				KeyStoreException, UnrecoverableKeyException {
			super(truststore);

			TrustManager tm = new X509TrustManager() {
				public void checkClientTrusted(X509Certificate[] chain,
						String authType) throws CertificateException {
				}

				public void checkServerTrusted(X509Certificate[] chain,
						String authType) throws CertificateException {
				}

				public X509Certificate[] getAcceptedIssuers() {
					return null;
				}
			};

			sslContext.init(null, new TrustManager[] { tm }, null);
		}

		@Override
		public Socket createSocket(Socket socket, String host, int port,
				boolean autoClose) throws IOException, UnknownHostException {
			return sslContext.getSocketFactory().createSocket(socket, host,
					port, autoClose);
		}

		//核心代码
		@Override
		public void setHostnameVerifier(X509HostnameVerifier hostnameVerifier) {
			// TODO Auto-generated method stub
			ignoreVerifier = new X509HostnameVerifier() {
				@Override
				public void verify(String arg0, String[] arg1, String[] arg2)
						throws SSLException {
				}
				@Override
				public void verify(String arg0, X509Certificate arg1)
						throws SSLException {
				}
				@Override
				public void verify(String arg0, SSLSocket arg1)
						throws IOException {
				}
				
				//最最核心代码
				@Override
				public boolean verify(String arg0, SSLSession arg1) {
					return true;
				}
			};
			super.setHostnameVerifier(ignoreVerifier);
		}

		@Override
		public X509HostnameVerifier getHostnameVerifier() {
			return ignoreVerifier;
		}

		@Override
		public Socket createSocket() throws IOException {
			return sslContext.getSocketFactory().createSocket();
		}
	}
		
}

2,https,json参数,绕过证书验证:

	public String sendHttpsPostjson(String url,String json, String charSet) throws Exception{  
       	logger.debug("请求地址:{}", url);
           HttpClient httpClient = null;  
           HttpPost httpPost = null;  
           String result = null;  
           	httpClient = new SSLClient();  
               httpPost = new HttpPost(url);  
               JSONObject map = JSON.parseObject(json);
               StringEntity entity = new StringEntity(map.toString(), charSet);
   			   entity.setContentEncoding(charSet);
   			   entity.setContentType("application/json");
               httpPost.setEntity(entity);
               HttpResponse response = httpClient.execute(httpPost);  
               if(response != null){
                   HttpEntity resEntity = response.getEntity();  
                   if(resEntity != null){  
                       result = EntityUtils.toString(resEntity,charSet);
                   }  
               } 
               
           return result;  
       }  
package com.http.socket;


import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;

/**
 * 绕过https证书认证的方法
 *
 */
public class SSLClient extends DefaultHttpClient{  
	public SSLClient() throws Exception{  
        super();  
        SSLContext ctx = SSLContext.getInstance("TLS");  
        X509TrustManager tm = new X509TrustManager() {  
                @Override  
                public void checkClientTrusted(X509Certificate[] chain,  
                        String authType) throws CertificateException {  
                }  
                @Override  
                public void checkServerTrusted(X509Certificate[] chain,  
                        String authType) throws CertificateException {  
                }  
                @Override  
                public X509Certificate[] getAcceptedIssuers() {  
                    return null;  
                }  
        };  
        ctx.init(null, new TrustManager[]{tm}, null);  
        SSLSocketFactory ssf = new SSLSocketFactory(ctx,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);  
        ClientConnectionManager ccm = this.getConnectionManager();  
        SchemeRegistry sr = ccm.getSchemeRegistry();  
        sr.register(new Scheme("https", 443, ssf));  
    }  
}  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106089.html原文链接:https://javaforall.net

赞 (1)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 【转载】一些VS2013的使用技巧

    【转载】一些VS2013的使用技巧

    2021年11月18日
  • Selenium:Chrome、Edge、Firefox、Opera、Safari常用WebDriver下载安装[通俗易懂]

    Selenium:Chrome、Edge、Firefox、Opera、Safari常用WebDriver下载安装[通俗易懂]简介:Selenium中运行需要先配置WebDriver,各主流浏览器安装配置大同小异。关联攻略:Selenium分布式运行:SeleniumGridPython+Jenkins+Selenium-Grid实现分布式web-ui自动化测试(centos+win10为例)基本操作:1、下载安装目标浏览器。2、查看浏览器版本:设置-帮助/关于浏览器等3、下载driver4、解压driver复制粘贴到配置好的环境变量Python所在目录5、编写代码调试启动注意事项:若找不到对

    2022年9月18日
  • 【转】Jdom入门知识

    【转】Jdom入门知识

    2021年7月28日
  • modbus rs485协议_串行通信和并行通信的区别

    modbus rs485协议_串行通信和并行通信的区别转自:http://www.51hei.com/bbs/dpj-23230-1.html在工业控制、电力通讯、智能仪表等领域,通常情况下是采用串口通信的方式进行数据交换。最初采用的方式是RS232接

    2022年8月5日
  • 安全视角下的CAN协议分析

    安全视角下的CAN协议分析目录相关背景CAN节点介绍CAN帧结构介绍CAN总线攻击面分析CAN总线安全缺陷基于ID的仲裁机制安全缺陷针对CAN总线的攻击方式[2]参考文章相关背景控制器局域网(CANbus)由罗伯特·博世公司于1983年开发。该协议于1986年美国密歇根州底特律市举行的国际汽车工程师学会(SAE)会议上正式发表。第一个CAN控制芯片,由英特尔和飞利浦生产,并且于1987年发布。世界上第一台装载了基于CAN的多重线系统的汽车是1991年推出的梅赛德斯-奔驰W140。..

    2022年6月28日
  • 小米如何安装magisk和太极阳(纯小白篇)

    小米如何安装magisk和太极阳(纯小白篇)首先说明,我本人也是一个小白,很多专业术语和知识都不是特别了解。所以如果教程里有些许错误请见谅。我自己的手机是MI8,MIUI10.x.x.,在我安装msgisk的时候看了很多经验贴才下手的最后一次成功,但是网上并没有一篇完全适合小白的帖子,所以我这个小白就站出来了。好了,下面是正文,有关刷magisk的所有软件,下面都会在用到的地方给出。建议动手之前,先通看一遍本文,然后再按照本文操作。然后你会…

    2022年6月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论列表(2条)

  • 匿名的头像
    匿名 2022年5月11日 下午10:12

    最后一个方法的类过期了有没有其他方案呢

  • 全栈程序员栈长的头像
    全栈程序员栈长 2022年5月23日 上午10:05

    @匿名:网站查一查.

关注全栈程序员社区公众号