用pfx证书java双向认证_把CA证书生成的crt的证书和pem的私钥转换成java能够使用的keystore和pcks12的证书,实现https双向认证...

最近在做一个https双向认证的工作,领导先让我实现,我之前写了一篇文章,把tomcat的生成证书和配置的实现写了出来。

现在领导给了我服务器的CA证书的客户端证书和私钥,服务端信任证书,分别是crt和pem格式的文件,

试了很多方法,才把这个搞通,由于不同的平台,证书格式和版本差异很大,包括文本证书和二进制证书文件。

通过openSSL 很容易把证书转换出来,现有Linux主机,安装了openssl,

证书文件:client.crt ,server.crt ,client.pem

openssl pkcs12 -export -in client.crt -out client.pfx  -inkey client.pem -passin pass:123456

生成的pfx格式的证书,可以安装在windows系统中,可以通过浏览器访问,

程序中由于双向认证,需要信任服务端证书,

把server.crt转换为keystore格式

keytool -importkeystore -v  -srckeystore client.pfx -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore client.keystore -deststoretype jks -deststorepass 123456

keytool -import -alias ca -trustcacerts -file server.crt -keystore client.keystore

把keystore设成客户端信任证书即可实现双向认证。

import java.io.BufferedReader;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.security.KeyStore;

import java.util.ArrayList;

import java.util.List;

import javax.net.ssl.KeyManagerFactory;

import javax.net.ssl.SSLContext;

import javax.net.ssl.SSLException;

import javax.net.ssl.TrustManager;

import javax.net.ssl.TrustManagerFactory;

import javax.net.ssl.SSLSession;

import javax.net.ssl.SSLSocket;

import java.security.cert.X509Certificate;

import junit.framework.TestCase;

import org.apache.http.HttpResponse;

import org.apache.http.NameValuePair;

import org.apache.http.client.HttpClient;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.conn.scheme.Scheme;

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.protocol.HTTP;

import org.junit.Before;

import org.junit.Test;

@SuppressWarnings("deprecation")

public class HttpsClient extends TestCase {

private String httpUrl = "https://127.0.0.1:443/TESTl/startupServlet";

// 客户端密钥库

private String sslKeyStorePath;

private String sslKeyStorePassword;

private String sslKeyStoreType;

// 客户端信任的证书

private String sslTrustStore;

private String sslTrustStorePassword;

@Before

public void setUp() {

sslKeyStorePath = "client.pfx";

sslKeyStorePassword = "123456";

sslKeyStoreType = "PKCS12"; // 密钥库类型,有JKS PKCS12等

sslTrustStore = "client.keystore";

sslTrustStorePassword = "123456";

System.setProperty("javax.net.ssl.keyStore", sslKeyStorePath);

System.setProperty("javax.net.ssl.keyStorePassword",

sslKeyStorePassword);

System.setProperty("javax.net.ssl.keyStoreType", sslKeyStoreType);

// 设置系统参数

System.setProperty("javax.net.ssl.trustStore", sslTrustStore);

System.setProperty("javax.net.ssl.trustStorePassword",

sslTrustStorePassword);

}

@Test

public void testHttpsClient() {

SSLContext sslContext = null;

try {

KeyStore kstore = KeyStore.getInstance("PKCS12");

kstore.load(new FileInputStream(sslKeyStorePath),

sslKeyStorePassword.toCharArray());

KeyManagerFactory keyFactory = KeyManagerFactory

.getInstance("sunx509");

keyFactory.init(kstore, sslKeyStorePassword.toCharArray());

KeyStore tstore = KeyStore.getInstance("jks");

tstore.load(new FileInputStream(sslTrustStore),

sslTrustStorePassword.toCharArray());

TrustManager[] tm;

TrustManagerFactory tmf = TrustManagerFactory

.getInstance("sunx509");

tmf.init(tstore);

tm = tmf.getTrustManagers();

sslContext = SSLContext.getInstance("SSL");

sslContext.init(keyFactory.getKeyManagers(), tm, null);

} catch (Exception e) {

e.printStackTrace();

}

try {

X509HostnameVerifier hostnameVerifier = new X509HostnameVerifier() {

public boolean verify(String arg0, SSLSession arg1) {

return true;

}

@Override

public void verify(String arg0, SSLSocket arg1) throws IOException {}

@Override

public void verify(String arg0, String[] arg1, String[] arg2) throws SSLException {}

@Override

public void verify(String arg0, X509Certificate arg1) throws SSLException {}

};

HttpClient httpClient = new DefaultHttpClient();

SSLSocketFactory socketFactory = new SSLSocketFactory(sslContext);

socketFactory.setHostnameVerifier(hostnameVerifier);

Scheme sch = new Scheme("https", 443, socketFactory);

httpClient.getConnectionManager().getSchemeRegistry().register(sch);

HttpPost httpPost = new HttpPost(httpUrl);

List nvps = new ArrayList();

//nvps.add(new BasicNameValuePair("pageSize", "1"));

//nvps.add(new BasicNameValuePair("name", null));

httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

HttpResponse httpResponse = httpClient.execute(httpPost);

String spt = System.getProperty("line.separator");

BufferedReader buffer = new BufferedReader(new InputStreamReader(

httpResponse.getEntity().getContent()));

StringBuffer stb = new StringBuffer();

String line = null;

while ((line = buffer.readLine()) != null) {

stb.append(line);

}

buffer.close();

String result = stb.toString();

System.out.println("result=" + result);

} catch (Exception e) {

e.printStackTrace();

}

}

}

中间的重写方法是由于证书中的主机名IP与实际访问的不符合,这里是去除commonName的校验。

声明:本文为原创,转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmail组件 java_Jmail的主要参数列表

说明:更多的信息请参考Jmail说明,我想这已经足够用的了。(1)Body(信件正文):字符串网络说明:更多的信息请参考Jmail说明,我想这已经足够用的了。(1)Body(信件正文) : 字符串如:JMail.Body "这里可以是用户填写的…

Go -- log4go日志

折腾: 【已解决】go语言中实现log信息同时输出到文件和控制台(命令行) 期间,已经通过io的MultiWriter搞定了同时输出信息到文件和console,但是不支持level。 所以,再去试试这个log4go。 github.com/keepeye/log4go 【折…

mysql 查看索引命中_请问下如何在Mysql中where与orderBy后在命中索引?

我现在大概有一个需求,是需要在数据库中查询一个列表。数据表的样子大概是这样的:ABCDE1112016-08-0540...............而我现在的SQL语句大概是这样的SELECT * FROM TABLE WHERE B 1 AND C 1 AND D 2016-08-05 ORDER BY E DESC在这种情况下我应该怎么…

linux自动挂载windows磁盘

自动挂载配置文件: /etc/fstab 1 # /etc/fstab: static file system information.2 #3 # Use blkid to print the universally unique identifier for a4 # device; this may be used with UUID as a more robust way to name devices5 # that works even if disks …

java云开发_Java 快速开始

# Java 快速开始代码示例:点击下方按钮一键部署:# 第 1 步:编写基础应用首先我们创建一个 Spring Boot 应用。使用 curl 和 unzip 命令新建一个空 Web 项目:curl https://start.spring.io/starter.zip \-d dependenciesweb \-d ja…

首个比较成型的切图作品

花了一天的时间,跌跌撞撞完成了自己的第一个切图作品。纪念一下! https://github.com/yangpeijia/psd-html.git转载于:https://www.cnblogs.com/jiajiayang/p/6840056.html

java jar包 配置文件_java 导入jar包中配置文件

spring项目只能识别到项目内的xml配置文件,无法识别jar中xml配置文件解决思路:在启动初始化期间,将jar包内部的文件拷贝到jar包外部相对路径中。//jarFullFileName: the file name with full path in jar.//newFilePath: the new file direct…

Jmeter响应中中文乱码怎么解决?

在jmeter的bin目录下有一个jmeter.properties的文件,打开它,搜索sampleresult.default.encoding,把它的注释打开,也就是把最前面的#去掉,改成sampleresult.default.encodingUTF-8,保存,重新打开…

三星java3倍拍照手机_全世界拍照最强的两款手机,一个是三星,一个是它

原标题:全世界拍照最强的两款手机,一个是三星,一个是它要说到手机拍照,三星S7毫无疑问是现阶段公认拍照最好的安卓手机,而这很大一定程度上取决于F1.7大光圈和先进的双核对焦技术。而在最近非常火的一款国产新机OPPO R…

抽卡时下拉通知栏导致icon丢失

之前一直忙着出版本,这两天好不容易空一点,赶紧把之前的坑填一下。上次说的那个十连抽,下拉通知栏是会有icon不渲染的问题,直觉是对的是与timescale有关,按昨天的研究结果来看,是因为用了ITween.ScaleTo这个…

ie11java阻止_企业IT管理员IE11升级指南【10】—— 如何阻止IE11的安装

企业IT管理员IE11升级指南 系列:如何阻止IE11的安装希望自行管理更新计划的企业和组织可以使用 IE11 Automatic Update Blocker Toolkit (自动更新拦截工具)禁止自动更新 Internet Explorer 11,与针对 IE10、IE9、IE8 和 IE7 的阻止程序工具包一样&#…

LeetCode: Convert BST to Greater Tree

利用好BST的特性,解起来并不难 1 /**2 * Definition for a binary tree node.3 * public class TreeNode {4 * int val;5 * TreeNode left;6 * TreeNode right;7 * TreeNode(int x) { val x; }8 * }9 */ 10 public class Solution { 11 …

java解析shell命令_Android中执行java命令的方法及java代码执行并解析shell命令

这篇文章给大家介绍Android中执行java命令的方法及java代码执行并解析shell命令,需要的朋友一起学习android中执行java命令的方法大家都晓得吗,下面一段内容给大家带来了具体解析。android的程序基于java开发,当我们接上调试器,执…

python学习之 - re模块

re模块功能:实现字符串匹配。元字符 描述\ 将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。^ 匹…

java从入门到精通第11章_《Java从入门到精通》第十章学习笔记

第10章  Java集合类一、概述Java中的java.util包中提供了一些集合类,也被称为容器,不同于数组,集合的长度是可变的,存放的是对象的引用。常用的集合有List集合、Set集合、Map集合,其中List和Set实现了Collection接口…

Hive之import和export使用详解

在hive-0.8.0后引入了import/export命令。 Export命令可以导出一张表或分区的数据和元数据信息到一个输出位置,并且导出数据可以被移动到另一个hadoop集群或hive实例,并且可以通过import命令导入数据。 当导出一个分区表,原始数据可能在hdfs的…

java中抓阄_如何进行抓阄

展开全部步骤:1、设计总体中的N个个体编号。2、把号码写在号e68a84e8a2ad3231313335323631343130323136353331333431366366签上,将号签放在一个容器中搅拌均匀。3、每次从中抽取一个号签,连续不放回抽取n次。4、将取出的n个号签上所对应的n个…

ARMV8 datasheet学习笔记5:异常模型

1.前言 2.异常类型描述 见 ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST 一文 3. 异常处理路由对比 AArch32、AArch64架构下IRQ 和Data Abort 异常处理流程图对比. 3.1 IRQ 路由 3.1.1. AArch32 IRQ 路由 图 AAr…

leetcode 三数之和 python_16.leetcode题目讲解(Python):最接近的三数之和

题目如下:题目这道题可以用排一些特殊情况,减少计算量, 参考代码如下:class Solution:def threeSumClosest(self, nums, target):""":type nums: List[int]:type target: int:rtype: int"""# 如果只…

给GridView设置行高

近期在工作中遇到了这样一个问题,使用一个GridView展示数据,item中仅仅是一个TextView,可是里面显示的文字多少不固定多少,必须所有展示出来. 遇到的问题: 1.把item中的宽和高设置match_parent,还是设置成wrap_content,当内容过多的时候,会覆盖下一行的显示的内容. 2.没有一个属…