用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的校验。
声明:本文为原创,转载请注明出处。
用pfx证书java双向认证_把CA证书生成的crt的证书和pem的私钥转换成java能够使用的keystore和pcks12的证书,实现https双向认证...相关推荐
- JSP文件如何转换成Java文件?
文章目录 jsp 文件如何转换成 java 文件 jsp 何时开始编译 jsp 编译后的文件存储目录 jsp 文件如何转换成 java 文件 html ...
- 将数据库字段转换成java字段
//将数据库字段databaseField转换成java字段 static String databaseField = "id\n" +"table_name\n&qu ...
- java.util.Date转换成java.sql.Date
// 获取当前的系统时间,以java.util.Date对象返回 Date dateUtil = new Date(); // 获取当前的系统时间,以时间戳返回 long l = System.cur ...
- gson java 对象_Gson把json串转换成java实体对象
Gson把json串转换成java实体对象的方法如下: 1.首先导入Gson的jar包,网上可以下载. java实体对象如下: public class Model { private double ...
- json字符串转成 json对象 json对象转换成java对象
import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject; 依赖包 <dependency> ...
- 把AdobeIllustrator导出的SVG矢量图,自动转换成java代码或BufferedImage对象,这种需求多吗?
Adobe Illustrator画的矢量图可以在任何像素下清晰显示图片,可以适配任何像素的显示器,自动识别图片内容然后转换成java代码的图片类,这种需求多吗?也可以自动读取矢量图,转换成Buffe ...
- 一文搞清电子认证相关概念:CA、证书、PKI、CSR、SSL、TSL、CRT、CER、PEM、RSA等
文章目录 电子认证 公钥基础设施(PKI) 安全认证机构CA 证书 SSL TSL CSR是什么 SSL证书格式 SSL证书文件 OpenSSL证书操作 1.查看 2.转换 3.组合 4.提取 RSA ...
- java中时间入数据库格式转换_数据库中字段类型为datetime,转换成java中的Date类型...
数据类型对照 点击打开链接 JDBC: PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuer ...
- java类对象转化成字符串_String类型字符串(xml格式)转换成java对象类型
使用到的包: 1. 2. 将字符串类型的字符串转换成的Java的对象时,需要先将字符的格式转换成JSON格式的字符串(所以用到了json.jar包),在使用JSON格式的字符串转换成的Java的对象类 ...
最新文章
- crontab用法疑云
- hbuilderx 小程序分包_基于uniapp的微信小程序之分包
- couchbase_具有Rx-Java的Couchbase Java SDK
- 主存储器物理地址,逻辑地址,转换
- 【Linux】Linux多个关机命令详解
- 切换图片 ImageSwitcher
- oracle9i 是否安全,指纹识别与Oracle 9i安全特性解析
- C++操作符的优先级
- 微信小程序 ui框架使用
- 【后缀数组】【线段树】codeforces102028H Can You Solve the Harder Problem?
- 关于洗牌的研究(六)——从数学到魔术之完美洗牌
- SQLServer从mdf和ldb还原数据库
- PC端工具 WP7 PC端截图工具WP7 Screen recorder 发布 附使用教程
- 使用Python编写打字训练小程序升级版
- 魅族6支持html吗,不知道你们发现了么,魅族Flyme6 超好用的隐藏功能
- 租赁行业如何将电子合同活用起来?
- 无人驾驶背后的技术_-_PostGIS点云(pointcloud)应用
- 大数据征信与个人隐私保护
- 严重警告:大家不要使用任何形式的免费发短信的软件[转贴]
- 14过去完成时 vs 现在完成时,过去完成时 vs 一般过去时 vs 过去将来时
热门文章
- config设置源 使用pip_python pip源配置
- 一个控制器2套模版php,如何不用一个自定义的控制器渲染一个模板
- c语言sin函数返回nan,C语言入口函数和LD_PRELOAD环境变量
- linux dhcp 负载均衡,dhcp双机负载均衡
- qt5python gui cookbook_Python GUI Programming Cookbook学习笔记
- C++中指针与引用的区别
- python爬虫能秒杀么_面试题之用python爬取并夕夕不同时段秒杀商品信息
- 【youcans 的 OpenCV 例程200篇】113. 形态学操作之腐蚀
- 数据结构-队列2-链式存储
- 游戏开发-cocos creator技巧-cc.Component.EventHandler自定义click事件