使用 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.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;

/**
 * 使用 jdk自带ssl包 进行 https通讯双向认证。
 * @author wangfeihu
 *
 */
public class HttpsTest {
	public static void main(String[] args) throws Exception {
		testHttpsWithCert();
	}

	/**
	 * post 请求,带双证书验证
	 */
	public static void testHttpsWithCert() {
		// 授信证书库
		String trustStore = "D:\\workspaces\\test\\https-native\\src\\cacerts.jks";
		String trustStorePass = "changeit";

		// 私钥证书
		String keyStore = "D:\\workspaces\\test\\https-native\\src\\www.demo.com.p12";
		String keyStorePass = "052537159932766";

		PrintWriter out = null;
		BufferedReader in = null;
		String result = "";

		try {
			TrustManager[] tms = getTrustManagers(trustStore, trustStorePass);

			KeyManager[] kms = getKeyManagers(keyStore, keyStorePass);

			SSLContext sslContext = SSLContext.getInstance("SSL");
			sslContext.init(kms, tms, new java.security.SecureRandom());

			SSLSocketFactory ssf = sslContext.getSocketFactory();

			// 服务链接
			URL url = new URL(
					"https://www.demo.com/rest/UidApiService/authCardWithoutOTP");
			// 请求参数
			String params = "{\"merchantCode\": \"www.demo.com\","
					+ "\"sessionId\": \"10000011\","
					+ "\"userName\": \"jack\","
					+ "\"idNumber\": \"432652515\","
					+ "\"cardNo\": \"561231321\"," + "\"phoneNo\": \"\"}";

			HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
			conn.setSSLSocketFactory(ssf);

			// 设置通用的请求属性
			conn.setRequestProperty("accept", "*/*");
			conn.setRequestProperty("connection", "Keep-Alive");
			conn.setRequestProperty("user-agent", "Mozilla/4.0");

			// content-type 按具体需要进行设置
			conn.setRequestProperty("content-type", "application/json");

			// 发送POST请求必须设置如下两行
			conn.setDoOutput(true);
			conn.setDoInput(true);

			// 获取URLConnection对象对应的输出流
			out = new PrintWriter(conn.getOutputStream());
			// 发送请求参数
			out.print(params);
			// flush输出流的缓冲
			out.flush();
			// 定义BufferedReader输入流来读取URL的响应
			in = new BufferedReader(
					new InputStreamReader(conn.getInputStream()));
			String line;
			while ((line = in.readLine()) != null) {
				result += line;
			}
			System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				in.close();
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 加载信任证书库
	 * 
	 * @param trustStore
	 * @param trustStorePass
	 * @return
	 * @throws IOException
	 */
	private static TrustManager[] getTrustManagers(String trustStore,
			String trustStorePass) throws IOException {
		try {
			String alg = TrustManagerFactory.getDefaultAlgorithm();
			TrustManagerFactory factory = TrustManagerFactory.getInstance(alg);
			InputStream fp = new FileInputStream(trustStore);
			KeyStore ks = KeyStore.getInstance("JKS");
			ks.load(fp, trustStorePass.toCharArray());
			fp.close();
			factory.init(ks);
			TrustManager[] tms = factory.getTrustManagers();
			System.out.println(tms);
			return tms;
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (KeyStoreException e) {
			e.printStackTrace();
		} catch (CertificateException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 加载私钥证书
	 * 
	 * @param keyStore
	 * @param keyStorePass
	 * @return
	 * @throws IOException
	 */
	private static KeyManager[] getKeyManagers(String keyStore,
			String keyStorePass) throws IOException {
		try {
			String alg = KeyManagerFactory.getDefaultAlgorithm();
			KeyManagerFactory factory = KeyManagerFactory.getInstance(alg);
			InputStream fp = new FileInputStream(keyStore);
			KeyStore ks = KeyStore.getInstance("PKCS12");
			ks.load(fp, keyStorePass.toCharArray());
			fp.close();
			factory.init(ks, keyStorePass.toCharArray());
			KeyManager[] keyms = factory.getKeyManagers();
			System.out.println(keyms);
			return keyms;
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (KeyStoreException e) {
			e.printStackTrace();
		} catch (CertificateException e) {
			e.printStackTrace();
		} catch (UnrecoverableKeyException e) {
			e.printStackTrace();
		}
		return null;
	}

}
时间: 2024-10-10 14:22:34

使用 jdk自带ssl包 进行 https通讯双向认证的相关文章

apache httpclient-4.5 https通讯 双向认证

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.BufferedRea

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.

.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

SSL安全协议理论及双向认证的简单实现

安全套接层(Secure Sockets Layer.SSL)是基于Internet基础的一种保证私秘性的安全协议.它能使客户服务应用间的通信不被窃听,并能始终对服务器和客户端进行认证.SSL协议要求建立在可靠的传输层协议之上.SSL协议是与应用层协议独立无关的,高层的应用协议能透明的建立于SSL协议上.SSL协议在应用层协议通信之前就已完成加密算法.通信密钥的协商及服务器认证工作.在此后应用层协议所传送的数据都会被加密,从而保证通信的私密性. 发展状况 SSL协议于1994年由Netscape

javaWebSerivice学习篇2-WebService的JDK自带的包开发

1.前提准备 jdk的开发环境必须为1.6以及以上的版本(1.6及以上版本的jdk包含了javax.jws包). 2.创建提供服务的接口以及服务接口的实现类 在发布webservice时,jvm必须要识别那些发布了那些服务,所以要对服务接口和服务接口实现类进行标识,就需要@WebService,@WebMethod两个注解. 2.1 服务接口必须加注解@WebService,要提供的服务方法必须加@WebMethod,例子如下: @WebService public interface IHel

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

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

Java 常用的日志工具——JDK自带的java.util.logging包、APACHE 的log4j 与 slf4j日志处理接口

考虑以下情况: (1).根据程序输出可以很好地帮助程序员调试程序.在编写小型程序时,可以在程序中不断增加 System.out.print() 语句来查看程序运行状态:在大型系统中,显然这一做法非常不对,可以考虑将调试信息通过日志处理工具,输出到一个文本文件中,然后查看文件内容. (2).在系统开始线上运行后,系统管理人员需要获知系统的运行情况,包括但不限于系统开始运行时间.系统关闭时间.系统目前处理任务等,这些状态需要输出到一个经过格式化的日志文件中,供管理人员查看: (3).在编写系统,甚至

转 JDK自带日志工具Logger的研究使用

之前写过一篇也是使用jdk自带的日志,本文为借鉴别人的另一种方法,我是java共享者,共创java未来!! 关于Logger最近放假在家无聊,研究一个开源框架时发现它频繁运用到了一个叫Logger的相关类来进行日志记录,作为log4j的忠实粉丝,在大多数项目上都看到的是log4j和commons-logging,这个Logger为何物?点开源码看,才发现是JDK自带的日志类,非第三方开源Jar包,于是便起了好奇之心,想看看这个Logger与log4j和commons-logging有何不同,翻了

扯一扯HTTPS单向认证、双向认证、抓包原理、反抓包策略

HTTP(HyperText Transfer Protocol,超文本传输协议)被用于在Web浏览器和网站服务器之间传递信息,在TCP/IP中处于应用层.这里提一下TCP/IP的分层共分为四层:应用层.传输层.网络层.数据链路层; 分层的目的是:分层能够解耦,动态替换层内协议 各个层包含的内容: 应用层:向用户提供应用服务时的通讯活动(ftp,dns,http)传输层:网络连接中两台计算机的数据传输(tcp.udp)网络层:处理网络上流动的数据包,通过怎样的传输路径把数据包传送给对方(ip)数