轻松把玩HttpClient之配置ssl,采用绕过证书验证实现https

原创 2015年11月16日 15:11:23

上篇文章说道httpclient不能直接访问https的资源,这次就来模拟一下环境,然后配置https测试一下。在前面的文章中,分享了一篇自己生成并在tomcat中配置ssl的文章《Tomcat配置SSL》,大家可以据此来在本地配置https。我已经配置好了,效果是这样滴:


可以看到已经信任该证书(显示浅绿色小锁),浏览器可以正常访问。现在我们用代码测试一下:

	public static void main(String[] args) throws ParseException, IOException, KeyManagementException, NoSuchAlgorithmException, HttpProcessException {
		String url = "https://sso.tgb.com:8443/cas/login";
		String body = send(url, null, "utf-8");
		System.out.println("交易响应结果:");
		System.out.println(body);
		System.out.println("-----------------------------------");
	}



发现抛出了异常,我知道的有两种方案(也许还有我不知道的方案),这里介绍第一种方案,也是用的比较多的方案——绕过证书验证。直接看代码吧:

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

		// 实现一个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);
		return sc;
	}
然后修改原来的send方法:
	/**
	 * 模拟请求
	 * 
	 * @param url		资源地址
	 * @param map	参数列表
	 * @param encoding	编码
	 * @return
	 * @throws NoSuchAlgorithmException 
	 * @throws KeyManagementException 
	 * @throws IOException 
	 * @throws ClientProtocolException 
	 */
	public static String send(String url, Map<String,String> map,String encoding) throws KeyManagementException, NoSuchAlgorithmException, ClientProtocolException, IOException {
		String body = "";
		//采用绕过验证的方式处理https请求
		SSLContext sslcontext = createIgnoreVerifySSL();
		
        // 设置协议http和https对应的处理socket链接工厂的对象
        Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
            .register("http", PlainConnectionSocketFactory.INSTANCE)
            .register("https", new SSLConnectionSocketFactory(sslcontext))
            .build();
        PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
        HttpClients.custom().setConnectionManager(connManager);

        //创建自定义的httpclient对象
		CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();
//		CloseableHttpClient client = HttpClients.createDefault();
		
		//创建post方式请求对象
		HttpPost httpPost = new HttpPost(url);
		
		//装填参数
		List<NameValuePair> nvps = new ArrayList<NameValuePair>();
		if(map!=null){
			for (Entry<String, String> entry : map.entrySet()) {
				nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
			}
		}
		//设置参数到请求对象中
		httpPost.setEntity(new UrlEncodedFormEntity(nvps, encoding));

		System.out.println("请求地址:"+url);
		System.out.println("请求参数:"+nvps.toString());
		
		//设置header信息
		//指定报文头【Content-type】、【User-Agent】
		httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
		httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
		
		//执行请求操作,并拿到结果(同步阻塞)
		CloseableHttpResponse response = client.execute(httpPost);
		//获取结果实体
		HttpEntity entity = response.getEntity();
		if (entity != null) {
			//按指定编码转换结果实体为String类型
			body = EntityUtils.toString(entity, encoding);
		}
		EntityUtils.consume(entity);
		//释放链接
		response.close();
        return body;
	}

现在再进行测试,发现果然通了。

下篇介绍另一种方案,应对自己生成的证书,敬请期待。


版权声明:本文为博主原创文章,未经博主允许不得转载。如需转载请声明:【转自 http://blog.csdn.net/xiaoxian8023 】

HttpClient使用详解(ssl)

Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且...
  • zbuger
  • zbuger
  • 2016年06月18日 22:24
  • 2159

HttpClient详细实例,Httoclient调用https实例,避免https SSL认证

最近公司将原有的http协议接口,更改为了可支持https的双向接口,在查阅资料同时,将解决过程与大家分享。 使用的框架是Struts2,如有变动可自行修改相应代码。 首先,我们看看httpCli...
  • dcb_ripple
  • dcb_ripple
  • 2016年03月30日 17:14
  • 6898

HttpClient4.3实现https请求信任所有证书

HttpClient4.3实现https请求信任所有证书
  • qq844579582
  • qq844579582
  • 2017年01月10日 15:43
  • 4030

JAVA利用HttpClient进行POST请求(HTTPS)

目前,要为另一个项目提供接口,接口是用HTTP URL实现的,最初的想法是另一个项目用JQuery post进行请求。 但是,很可能另一个项目是部署在别的机器上,那么就存在跨域问题,而JQuery的...
  • rongyongfeikai2
  • rongyongfeikai2
  • 2014年12月01日 23:06
  • 340881

HttpClient使用详解

Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且...
  • wangpeng047
  • wangpeng047
  • 2014年02月28日 11:04
  • 733801

HttpClient4.3 关于https 中SSL证书请求问题

废话不说 直接上代码 直接创建调用此方法即可信任所有https SSL证书,SSLConnectionSocketFactory 中设置允许所有主机名称就可以忽略主机名称验证 private sta...
  • Sleeping_
  • Sleeping_
  • 2016年01月11日 23:13
  • 2196

无根证书时访问 https(httpclient)

1. httpclient 4.2.3 1.1 download url    http://archive.apache.org/dist/httpcomponents/httpclient...
  • dyccsxg
  • dyccsxg
  • 2015年01月21日 23:10
  • 2512

HttpClient 发送 HTTP、HTTPS 请求的简单封装

序 最近这几周,一直在忙同一个项目,刚开始是了解需求,需求有一定了解之后,就开始调第三方的接口。由于第三方给提供的文档很模糊,在调接口的时候,出了很多问题,一直在沟通协调,具体的无奈就不说了,由于...
  • happylee6688
  • happylee6688
  • 2015年07月30日 12:38
  • 63824

解决httpclient 4.5 https请求跳过证书验证

public class SslUtil { public static CloseableHttpClient SslHttpClientBuild() { Registry socket...
  • hu9645313573
  • hu9645313573
  • 2017年07月21日 16:04
  • 1232

基于HttpClient 4.3的可访问自签名HTTPS站点的新版工具类

HttpClient在当今Java应用中的位置越来越重要。从该项目的变迁过程我们不难发现,其已经从apache-commons众多的子项目中剥离,一跃成为如今的顶级项目,可见它的分量。然而随着项目的升...
  • chaijunkun
  • chaijunkun
  • 2014年10月17日 09:47
  • 17868
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:轻松把玩HttpClient之配置ssl,采用绕过证书验证实现https
举报原因:
原因补充:

(最多只允许输入30个字)