apache httpclient-4.5 https通讯 双向认证

  1. maven dependence
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
			<version>4.5.2</version>
		</dependency>

2. 测试类

package com.iraid.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.KeyStore;

import javax.net.ssl.SSLContext;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;

/**
 * 使用 httpclient4.5 进行 https 通讯,
 * 采用双向认证, 连接池管理connection
 * 
 * @author wangfeihu
 *
 */
public class HttpClientforSSL {

	public static HttpClientConnectionManager CONNECTION_MANAGER = null;

	/**
	 * 初始化 connection manager.
	 * @param keyStoreFile
	 * @param keyStorePass
	 * @param trustStoreFile
	 * @param trustStorePass
	 * @throws Exception
	 */
	public void init(String keyStoreFile, String keyStorePass,
			String trustStoreFile, String trustStorePass) throws Exception {
		System.out.println("init conection pool...");

		InputStream ksis = new FileInputStream(new File(keyStoreFile));
		InputStream tsis = new FileInputStream(new File(trustStoreFile));

		KeyStore ks = KeyStore.getInstance("PKCS12");
		ks.load(ksis, keyStorePass.toCharArray());

		KeyStore ts = KeyStore.getInstance("JKS");
		ts.load(tsis, trustStorePass.toCharArray());

		SSLContext sslContext = SSLContexts.custom()
				.loadKeyMaterial(ks, keyStorePass.toCharArray())
				// 如果有 服务器证书
				.loadTrustMaterial(ts, new TrustSelfSignedStrategy())
				// 如果没有服务器证书,可以采用自定义 信任机制
				// .loadTrustMaterial(null, new TrustStrategy() {
				//
				// // 信任所有
				// public boolean isTrusted(X509Certificate[] arg0,
				// String arg1) throws CertificateException {
				// return true;
				// }
				//
				// })
				.build();
		SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
				sslContext, new String[] { "TLSv1" }, null,
				SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

		Registry<ConnectionSocketFactory> registry = RegistryBuilder
				.<ConnectionSocketFactory> create()
				.register("http", PlainConnectionSocketFactory.INSTANCE)
				.register("https", sslsf).build();
		ksis.close();
		tsis.close();
		CONNECTION_MANAGER = new PoolingHttpClientConnectionManager(registry);

	}

	/**
	 * do post
	 * @param url
	 * @param params
	 * @throws Exception
	 */
	public void post(String url, String params) throws Exception {
		if (CONNECTION_MANAGER == null) {
			return;
		}
		CloseableHttpClient httpClient = HttpClients.custom()
				.setConnectionManager(CONNECTION_MANAGER).build();
		HttpPost httpPost = new HttpPost(url);

		httpPost.setEntity(new StringEntity(params,
				ContentType.APPLICATION_JSON));

		CloseableHttpResponse resp = httpClient.execute(httpPost);
		System.out.println(resp.getStatusLine());
		InputStream respIs = resp.getEntity().getContent();
		String content = convertStreamToString(respIs);
		System.out.println(content);
		EntityUtils.consume(resp.getEntity());
	}

	public static String convertStreamToString(InputStream is) {
		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
		StringBuilder sb = new StringBuilder();

		String line = null;
		try {
			while ((line = reader.readLine()) != null) {
				sb.append(line + "\n");
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return sb.toString();
	}

	public static void main(String[] args) {
		// 服务地址
		String url = "https://www.demo.com/api/rest/UidApiService/authCardWithoutOTP";
		// 服务参数,这里接口的参数采用 json 格式传递
		String params = "{\"merchantCode\": \"www.demo.com\","
				+ "\"sessionId\": \"10000011\"," + "\"userName\": \"jack\","
				+ "\"idNumber\": \"432652515\"," + "\"cardNo\": \"561231321\","
				+ "\"phoneNo\": \"\"}";
		// 私钥证书
		String keyStoreFile = "D:\\workspaces\\test\\httpclient\\src\\main\\resources\\www.demo.com.p12";
		String keyStorePass = "052537159932766";

		// 配置信任证书库及密码
		String trustStoreFile = "D:\\workspaces\\test\\httpclient\\src\\main\\resources\\cacerts.jks";
		String trustStorePass = "changeit";

		HttpClientforSSL obj = new HttpClientforSSL();
		try {
			obj.init(keyStoreFile, keyStorePass, trustStoreFile, trustStorePass);
			for (int i = 0; i < 10; i++) {
				obj.post(url, params);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
时间: 2024-09-30 10:30:00

apache httpclient-4.5 https通讯 双向认证的相关文章

使用 jdk自带ssl包 进行 https通讯双向认证

package com.iraid.test; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.security.Key

.net core下用HttpClient和asp.net core实现https的双向认证

原文:.net core下用HttpClient和asp.net core实现https的双向认证 关于https双向认证的知识可先行google,这时矸接代码. 为了双向认证,我们首先得准备两个crt证书,一个是client.crt,一个是server.crt,有时为了验证是否同一个根证书的验证,这两个证书可以共有一个根证书root.crt. 首先要生成这些证书,这里采用了自签证书方式: 证书生成工具可在这里下载(windows下生成): https://github.com/axzxs200

https 单向双向认证说明_数字证书, 数字签名, SSL(TLS) , SASL

转自:https 单向双向认证说明_数字证书, 数字签名, SSL(TLS) , SASL 因为项目中要用到TLS + SASL 来做安全认证层. 所以看了一些网上的资料, 这里做一个总结. 1. 首先推荐几个文章: 数字证书: http://www.cnblogs.com/hyddd/archive/2009/01/07/1371292.html 数字证书和SSL: http://www.2cto.com/Article/201203/121534.html 数字签名: http://www.

Apache HttpClient POST数据(https)

测试用的httpclient版本 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.1.2</version> <scope>test</scope> </dependency> 1.传键值对 http://www.android

HTTPS 双向认证构建移动设备安全体系

HTTPS 双向认证构建移动设备安全体系 对于一些高安全性要求的企业内项目,我们有时希望能够对客户端进行验证.这个时候我们可以使用Https的双向认证机制来实现这个功能. 单向认证:保证server是真的,通道是安全的(对称密钥):双向认证:保证client和server是真的,通道是安全的(对称密钥): 要实现这么一个完整的安全体系,需要一个CA或者openssl自建CA来管理签发客户端证书.作为项目要求的场景可能是这样的,一个前端网站专门用于签发证书,通过电子邮件发送下载客户端证书邮件到移动

Tomcat容器https配置之双向认证

在上一篇https单向认证基础上(如果没看过的,请先移步:http://www.cnblogs.com/leafsunday/p/6885568.html),开始https双向认证之旅. 生成客户端keystore(PKCS12格式,便于导入浏览器) C:\Users\Administrator>keytool -genkeypair -alias client -keyalg RSA -keysize 1024 -keypass changeit -keystore d:/client.p12

https 单向认证和双向认证配置

HTTPS 是我们开发中经常用到的通信加密技术,能有效保护我们网络访问中的安全,本文主要讲解单向 和 双向 https 的配置.关于https 的实现原理在这里我就不赘述了,附上阮一峰老师的关于https介绍几篇博客,有兴趣的童鞋可以看一看:图解SSL/TLS协议   数字签名是什么? 本文目录: 1.单向https配置 2.双向https配置 3.常见名词说明(转载) 1.单向https 配置 生成https证书命令: sudo keytool -genkey -keyalg RSA -dna

如何使用Java访问双向认证的Https资源

本文的相关源码位于 https://github.com/dreamingodd/CA-generation-demo 0.Nginx配置Https双向认证 首先配置Https双向认证的服务器资源. 可以参考:http://www.cnblogs.com/dreamingodd/p/7357029.html 完成之后如下效果: 1.导入cacerts进行访问 首先将服务器证书导入keystore cacerts,默认密码为changeit,如果需要修改密码就改一下. keytool -impor

rails+apache2+passenger+ssl实现https双向认证通信

rails+apache2+passenger+ssl实现https双向认证通信 环境: 系统:Centos7 服务器:apache(httpd) 2.4.6 制作工具:openssl 1.0.1 Rails版本 :4.1.6 准备工作: 安装apache和openssl #yum install  httpd  httpd-devel httpd-tools #yum install openssl 安张mod_ssl #yum install mod_ssl 一.创建根证书 1创建CA私钥