最近在做一个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双向认证...相关推荐

  1. JSP文件如何转换成Java文件?

    文章目录 jsp 文件如何转换成 java 文件 jsp 何时开始编译 jsp 编译后的文件存储目录 jsp 文件如何转换成 java 文件 html                         ...

  2. 将数据库字段转换成java字段

    //将数据库字段databaseField转换成java字段 static String databaseField = "id\n" +"table_name\n&qu ...

  3. java.util.Date转换成java.sql.Date

    // 获取当前的系统时间,以java.util.Date对象返回 Date dateUtil = new Date(); // 获取当前的系统时间,以时间戳返回 long l = System.cur ...

  4. gson java 对象_Gson把json串转换成java实体对象

    Gson把json串转换成java实体对象的方法如下: 1.首先导入Gson的jar包,网上可以下载. java实体对象如下: public class Model { private double ...

  5. json字符串转成 json对象 json对象转换成java对象

    import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject; 依赖包 <dependency> ...

  6. 把AdobeIllustrator导出的SVG矢量图,自动转换成java代码或BufferedImage对象,这种需求多吗?

    Adobe Illustrator画的矢量图可以在任何像素下清晰显示图片,可以适配任何像素的显示器,自动识别图片内容然后转换成java代码的图片类,这种需求多吗?也可以自动读取矢量图,转换成Buffe ...

  7. 一文搞清电子认证相关概念:CA、证书、PKI、CSR、SSL、TSL、CRT、CER、PEM、RSA等

    文章目录 电子认证 公钥基础设施(PKI) 安全认证机构CA 证书 SSL TSL CSR是什么 SSL证书格式 SSL证书文件 OpenSSL证书操作 1.查看 2.转换 3.组合 4.提取 RSA ...

  8. java中时间入数据库格式转换_数据库中字段类型为datetime,转换成java中的Date类型...

    数据类型对照 点击打开链接 JDBC: PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuer ...

  9. java类对象转化成字符串_String类型字符串(xml格式)转换成java对象类型

    使用到的包: 1. 2. 将字符串类型的字符串转换成的Java的对象时,需要先将字符的格式转换成JSON格式的字符串(所以用到了json.jar包),在使用JSON格式的字符串转换成的Java的对象类 ...

最新文章

  1. crontab用法疑云
  2. hbuilderx 小程序分包_基于uniapp的微信小程序之分包
  3. couchbase_具有Rx-Java的Couchbase Java SDK
  4. 主存储器物理地址,逻辑地址,转换
  5. 【Linux】Linux多个关机命令详解
  6. 切换图片 ImageSwitcher
  7. oracle9i 是否安全,指纹识别与Oracle 9i安全特性解析
  8. C++操作符的优先级
  9. 微信小程序 ui框架使用
  10. 【后缀数组】【线段树】codeforces102028H Can You Solve the Harder Problem?
  11. 关于洗牌的研究(六)——从数学到魔术之完美洗牌
  12. SQLServer从mdf和ldb还原数据库
  13. PC端工具 WP7 PC端截图工具WP7 Screen recorder 发布 附使用教程
  14. 使用Python编写打字训练小程序升级版
  15. 魅族6支持html吗,不知道你们发现了么,魅族Flyme6 超好用的隐藏功能
  16. 租赁行业如何将电子合同活用起来?
  17. 无人驾驶背后的技术_-_PostGIS点云(pointcloud)应用
  18. 大数据征信与个人隐私保护
  19. 严重警告:大家不要使用任何形式的免费发短信的软件[转贴]
  20. 14过去完成时 vs 现在完成时,过去完成时 vs 一般过去时 vs 过去将来时

热门文章

  1. config设置源 使用pip_python pip源配置
  2. 一个控制器2套模版php,如何不用一个自定义的控制器渲染一个模板
  3. c语言sin函数返回nan,C语言入口函数和LD_PRELOAD环境变量
  4. linux dhcp 负载均衡,dhcp双机负载均衡
  5. qt5python gui cookbook_Python GUI Programming Cookbook学习笔记
  6. C++中指针与引用的区别
  7. python爬虫能秒杀么_面试题之用python爬取并夕夕不同时段秒杀商品信息
  8. 【youcans 的 OpenCV 例程200篇】113. 形态学操作之腐蚀
  9. 数据结构-队列2-链式存储
  10. 游戏开发-cocos creator技巧-cc.Component.EventHandler自定义click事件