在学校Java网络编程的时候,都会接触到Socket,Socket是基于TCP的数据传输方式,但Socket是没有证书认证的,它无法建立带证书认证的连接。还好,Java中提供了带证书认证的SSLsocket。
最近需要做一个客户端认证的需求,我需要在客户端配置自己的证书,然后向服务器发送数据,本文主要用于记录。

一、证书类型

SSL证书的格式有很多,有.p12证书,.crt+.key证书,还有.jks证书,网上大多数案例都是基于.jks证书去实现认证,如果你的证书类型是.p12证书或者是crt证书,你可以手动把p12证书转换成jks证书,如果你是crt证书,下面会提供一个crt证书转换成jks证书的方法。

public class KeyStoreUtils {public  void generateKeyStore(String privatePath, String certPath, String ksPath, String password) throws Exception {KeyStore var17 = KeyStore.getInstance("PKCS12");var17.load((InputStream) null, (char[]) null);byte[] bytes = null;PrivateKey key = getPrivateKeyFromPem(privatePath);Certificate certificate = readCert(certPath);      var17.setKeyEntry("Eric's Key", key, (char[]) null, new Certificate[]{certificate});//加载证书链所有证书var17.setKeyEntry("Eric's Key", key, (char[]) null, certificates);FileOutputStream var18 = new FileOutputStream(ksPath);var17.store(var18, password.toCharArray());var18.flush();}// 获取私匙public static PrivateKey getPrivateKeyFromPem(String privateFile) throws Exception {BufferedReader br = new BufferedReader(new FileReader(new File(privateFile)));String s = br.readLine();String str = "";s = br.readLine();while (s.charAt(0) != '-') {str += s + "\r";s = br.readLine();}BASE64Decoder base64decoder = new BASE64Decoder();byte[] b = base64decoder.decodeBuffer(str);// 生成私匙KeyFactory kf = KeyFactory.getInstance(PropertiesReader.getKey("cert_encryption"));PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(b);PrivateKey privateKey = kf.generatePrivate(keySpec);return privateKey;}public static Certificate readCert(String certPath) throws Exception {CertificateFactory cf = CertificateFactory.getInstance("X.509");FileInputStream in1 = new FileInputStream(certPath);Collection<? extends Certificate> certificates = cf.generateCertificates(in1);Iterator<? extends Certificate> iterator = certificates.iterator();Certificate next = iterator.next();return next;}public static void main(String[] args) throws Exception{KeyStoreUtils keyStoreUtils = new KeyStoreUtils();keyStoreUtils.generateKeyStore("./certificate/client_dev.key","./certificate/client_dev.crt","./certificate/client_dev.jks","123456");}
}

SSLSocket相关类介绍

SSLContext:SSLContext类可以创建SSLSocket实例,在这个类中配置自己的证书和自己所信任的证书。

KeyManagerFactory:加载自己的证书文件,并且生成KeyManager[]数据,配置到SSLContext。
TrustManagerFactory:加载自己信任的客户端证书,双向认证的时候配置自己信任哪些服务端证书。
KeyStore:加载证书的类。
TrustManager[]:信任的证书信任的Manager数组。
Manager[]:自己的证书的Manager数组。

二、配置双向认证

代码如下,通过KeyStore去加载证书,这里我客户端证书和信任的服务器证书读的同一个,真实情况肯定是两个不一样的证书。

代码:

     SSLContext ctx = SSLContext.getInstance("SSL");KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");KeyStore ks = KeyStore.getInstance("JKS");tks.load(new FileInputStream("C://"), "password".toCharArray());kmf.init(ks, new char[0]);kmf.init(ks, "passworld".toCharArray());tmf.init(tks);ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);log.info("创建sslsocket连接中。。。。。。");sslSocket = (SSLSocket) ctx.getSocketFactory().createSocket("121.0.0.1", 8000);

三、取消验证服务器证书

如果只需要配置客户端证书,客户端信任所有服务器方的证书,可以这样配置。
把TrustManager通过如下方式生成,定义一个类继续TrustManager,X509TrustManager类。

TrustManager[] trustAllCerts = new TrustManager[1];TrustManager tm = new miTM();trustAllCerts[0] = tm;
static class miTM implements TrustManager,X509TrustManager {@Overridepublic X509Certificate[] getAcceptedIssuers() {return null;}public boolean isServerTrusted(X509Certificate[] certs) {return true;}public boolean isClientTrusted(X509Certificate[] certs) {return true;}@Overridepublic void checkServerTrusted(X509Certificate[] certs, String authType)throws CertificateException {return;}@Overridepublic void checkClientTrusted(X509Certificate[] certs, String authType)throws CertificateException {return;}}
ctx.init(kmf.getKeyManagers(), trustAllCerts, null);

Java SSLSocket客户端认证配置相关推荐

  1. 吉大正元php,吉大正元CA认证服务器与客户端以及配置文档

    [实例简介] 吉大正元CA认证服务器与客户端以及配置文档,有服务器和客户端,有配置文档,一般人都可以看得懂. [实例截图] [核心代码] I网关报文认证Java版BSDemo ├── Debugger ...

  2. java sslsocket程序_JAVA与C++进行sslsocket通信,JAVA做服务端或客户端

    前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖到现在才写这篇文章,不好意思哈. 本文测试环境: 系统:WINDOWS 7(第3.6步).OS X 10.9(第4步) 软 ...

  3. Nginx配置HTTPS客户端认证

    Nginx配置HTTPS客户端认证 最近折腾自己个人网站,有一个私人模块,只能自己访问,使用登录授权方式虽然也能达到目的,但每次都要登录,且密码也不一定安全.想起学HTTPS的时,有一个客户端证书的概 ...

  4. 8021x 获取IP信息失败,请检查锐捷认证客户端当前配置是否符合所在网络的要求,检查完毕后尝试重新认证

    早上一起床,登陆锐捷客户端上网,谁知道错问题了.不能联网了,锐捷登陆成功,但是一会儿就提示失败,获取IP信息失败了.下面我描述一下问题原因: 锐捷登陆后有认证提示,和往常正常情况一样的,不过有个小感叹 ...

  5. XP系统CMCC-AUTO客户端自动认证配置教程

    原文地址:http://blog.sina.com.cn/s/blog_a3cc521d01015q5h.html CMCC-AUTO客户端自动认证配置教程 移动热点CMCC-AUTO使用Micros ...

  6. Cas单点登录的服务器端和客户端的配置

    同事参考网上资料总结出的Cas单点登录的文档,很有学习价值哦 Cas服务器端和客户端的配置 服务器端的配置: 1. 所需的环境: · Tomcat7.2 · JDK6 · CAS Service 版本 ...

  7. 6 客户端认证方式 之 client_secret_basic client_secret_post

    接上篇文章,上篇文章讲了客户端认证的五种方式,这篇便来深入分析其中的 client_secret_basic 方式和 client_secret_post 方式. client_secret_basi ...

  8. CDH 的Kerberos认证配置

    2019独角兽企业重金招聘Python工程师标准>>> 最近因为项目需要,需要对用户权限做限制,最终选择了kerberos+sentry+hue模式来管理用户,但是这个kerbero ...

  9. 如何在Tomcat中做TLS客户端认证

    常见的https网站做的是服务端认证(server authentication),浏览器通过证书判断你所访问的https://baidu.com是否真的是百度,而不是其他人伪造的网站.同时还对流量加 ...

最新文章

  1. 将Iterable转换为Collection的简便方法
  2. OpenCV计算机视觉编程攻略之提取图片轮廓-使用Canny函数
  3. Delphi项目的构成(Files That Make Up a Delphi Project)
  4. 设计模式(第四式:建造者模式)
  5. linux 基础训练,Linux 基础训练习题
  6. spark python入门教程_你是如何自学 Python 的?
  7. VB.NET 按键代码 及组合键
  8. Linux入门基础命令(四)
  9. Servlet中的请求转发
  10. 禁止php读取目录文件目录,Php读取目录文件
  11. coreseek java_lnmp+coreseek实现站内全文检索(安装篇)
  12. 精神分析理论-弗洛伊德
  13. Python 编辑器汇总
  14. 十大管理之项目干系人管理知识点
  15. Qt下载安装教程,windows10亲测可用,版本5.12.11
  16. 许鞍华新片《七里地》催泪 网友:看完想回家过年
  17. 全面、详细的SQL学习指南(MySQL方向)
  18. 胡适资助林语堂出国留学的故事
  19. MySQL 不能没有字符串函数,就像西方不能失去耶路撒冷
  20. 在穷学生面前 “ 摆弄骚姿 ”,最美90后支教女老师翻车~!

热门文章

  1. 【Elasticsearch】利用kibana调整索引mapping结构
  2. [算法]LeetCode 专题 -- 二分查找专题 34. 在排序数组中查找元素的第一个和最后一个位置
  3. sci影响因子小于1计算机,影响因子小于1的期刊_影响因子_柳叶刀影响因子多少...
  4. 「Fail-Fast与Fail-Safe机制」
  5. Hutool Java 工具类库Excel导出,配置宽度自适应极度舒适
  6. Arduino播放声音
  7. VS2005 设置DLL程序无入口点
  8. 利用python画空间分布图
  9. 她只用一个方法,就把英语拿下了!
  10. 唯我倾城网上购物商城设计与实现