2013-10-12 11:08 10488人阅读 评论(0) 收藏 举报
 

目录(?)[+]

 
 
好久没用过SSL认证了,东西久不用,就有点生疏。博客就是有这个好处,可以做备忘录。
java中是通过SSL认证,使用的是SSLSocket,通过SSLSocketFactory可以获得SSLSocket实例对象。通常SSLSocketFactory需要一个SSLContext环境对象来构建,
构建一个SSLContext 环境:
SSLContext sslc=SSLContext.getInstance("SSLv3");
 // 构造SSL环境,指定SSL版本为3.0,也可以使用TLSv1,但是SSLv3更加常用。
sslc.init(KeyManager[],TrustManager[]null);
//KeyManager[] 第一个参数是授权的密钥管理器,用来授权验证。TrustManager[]第二个是被授权的证书管理器,用来验证服务器端的证书。第三个参数是一个随机数值,可以填写null。如果只是服务器传输数据给客户端来验证,就传入第一个参数就可以,客户端构建环境就传入第二个参数。
双向认证的话,就同时使用两个管理器。
服务端:

[代码]java代码:

  1. import java.io.FileInputStream;
  2. import java.io.*;
  3. import java.net.Socket;
  4. import java.security.KeyStore;
  5. import javax.net.ssl.KeyManagerFactory;
  6. import javax.net.ssl.SSLContext;
  7. import javax.net.ssl.SSLServerSocket;
  8. import javax.net.ssl.SSLServerSocketFactory;
  9. public class KeystoreTest {
  10. /**
  11. * name:KeystoreTest
  12. * author:suju
  13. */
  14. public static void main(String[] args) throws Exception{
  15. String key="c:/.keystore";
  16. KeyStore keystore=KeyStore.getInstance("JKS");
  17. //keystore的类型,默认是jks
  18. keystore.load(new FileInputStream(key),"123456".toCharArray());
  19. //创建jkd密钥访问库    123456是keystore密码。
  20. KeyManagerFactory kmf=KeyManagerFactory.getInstance("SunX509");
  21. kmf.init(keystore,"asdfgh".toCharArray());
  22. //asdfgh是key密码。
  23. //创建管理jks密钥库的x509密钥管理器,用来管理密钥,需要key的密码
  24. SSLContext sslc=SSLContext.getInstance("SSLv3");
  25. // 构造SSL环境,指定SSL版本为3.0,也可以使用TLSv1,但是SSLv3更加常用。
  26. sslc.init(kmf.getKeyManagers(),null,null);
  27. //第二个参数TrustManager[] 是认证管理器,在需要双向认证时使用,
  28. //构造ssl环境
  29. SSLServerSocketFactory sslfactory=sslc.getServerSocketFactory();
  30. SSLServerSocket serversocket=(SSLServerSocket) sslfactory.createServerSocket(9999);
  31. //创建serversocket,监听,并传输数据来验证授权
  32. for(int i=0;i<15;i++)
  33. {
  34. final Socket socket=serversocket.accept();
  35. new Thread(){
  36. public void run()
  37. {
  38. try{
  39. InputStream is=socket.getInputStream();
  40. OutputStream os=socket.getOutputStream();
  41. byte[] buf=new byte[1024];
  42. int len=is.read(buf);
  43. System.out.println(new String(buf));
  44. os.write("ssl test".getBytes());
  45. os.close();
  46. is.close();
  47. }catch(Exception e)
  48. {// }
  49. }
  50. }.start();
  51. }
  52. serversocket.close();
  53. }
  54. }

客户端:

[代码]java代码:

  1. import java.io.FileInputStream;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.security.KeyStore;
  5. import javax.net.ssl.KeyManagerFactory;
  6. import javax.net.ssl.SSLContext;
  7. import javax.net.ssl.SSLServerSocket;
  8. import javax.net.ssl.SSLServerSocketFactory;
  9. import javax.net.ssl.SSLSocket;
  10. import javax.net.ssl.SSLSocketFactory;
  11. import javax.net.ssl.TrustManagerFactory;
  12. public class KeystoreTestClient {
  13. /**
  14. * name:KeystoreTestClient
  15. * author:suju
  16. */
  17. public static void main(String[] args) throws Exception{
  18. String key="c:/client";
  19. KeyStore keystore=KeyStore.getInstance("JKS");  //创建一个keystore来管理密钥库
  20. keystore.load(new FileInputStream(key),"123456".toCharArray());
  21. //创建jkd密钥访问库
  22. TrustManagerFactory tmf=TrustManagerFactory.getInstance("SunX509");
  23. tmf.init(keystore);                 //验证数据,可以不传入key密码
  24. //创建TrustManagerFactory,管理授权证书
  25. SSLContext sslc=SSLContext.getInstance("SSLv3");
  26. // 构造SSL环境,指定SSL版本为3.0,也可以使用TLSv1,但是SSLv3更加常用。
  27. sslc.init(null,tmf.getTrustManagers(),null);
  28. //KeyManager[] 第一个参数是授权的密钥管理器,用来授权验证。第二个是被授权的证书管理器,
  29. //用来验证服务器端的证书。只验证服务器数据,第一个管理器可以为null
  30. //构造ssl环境
  31. SSLSocketFactory sslfactory=sslc.getSocketFactory();
  32. SSLSocket socket=(SSLSocket) sslfactory.createSocket("127.0.0.1",9999);
  33. //创建serversocket通过传输数据来验证授权
  34. InputStream is=socket.getInputStream();
  35. OutputStream os=socket.getOutputStream();
  36. os.write("client".getBytes());
  37. byte[] buf=new byte[1024];
  38. int len=is.read(buf);
  39. System.out.println(new String(buf));
  40. os.close();
  41. is.close();
  42. }
  43. }
使用java中自带keytool管理keystore。
**经常忘记参数,写下来记住。
默认密钥库下创建一个key     keytool -genkeypair

显示默认keystore的key详细信息  keytool -list -v

使用其他keystore来创建key,如果keystore不存在就创建一个新的。 keytool --genkeypair -keystore c:\client

导出一个key    keytool -exportcert -alias mykey -file c:\mykey.cer

导入一个key到一个keystore,  keytool -importcert -alias mykey -file c:\mykey.cer -keystore c:\client

还有很多关于key的操作,keytool提供了-help帮助命令

 
1

java中 SSL认证和keystore使用的更多相关文章

  1. JAVA中SSL证书认证通讯

    JAVA中SSL证书认证通讯 SSL通讯服务端 /******************************************************************** * 项目名称 ...

  2. RSA原理、ssl认证、Tomcat中配置数字证书以及网络传输数据中的密码学知识

      情形一:接口的加.解密与加.验签 rsa不是只有加密解密,除此外还有加签和验签.之前一直误以为加密就是加签,解密就是验签.这是错误的! 正确的理解是: 数据传输的机密性:公钥加密私钥解密是密送,保 ...

  3. HTTPS 中双向认证SSL 协议的具体过程

    HTTPS 中双向认证SSL 协议的具体过程: 这里总结为详细的步骤: ① 浏览器发送一个连接请求给安全服务器.② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器.③ 客户浏览器检查服务器送 ...

  4. java实现ssl单/双向认证通信[推荐]

    java实现ssl单/双向认证通信[推荐] 学习了:https://blog.csdn.net/zbuger/article/details/51695582 学习了:https://www.cnbl ...

  5. Tomcat 实现双向SSL认证

    大概思路: 使用openssl生产CA证书,使用keytool生产密钥库 实验环境:RHEL6.4+Tomcat8 一.生成CA根证书,并自签名 1.生成CA密钥 # genrsa [产生密钥命令] ...

  6. JAVA中发送电子邮件的方法

    JAVA中发送邮件的方法不复杂,使用sun的JavaMail的架包就可以实现.  一.下载JavaMail的架包,并导入项目中,如下: 二.附上代码例子,如下: 1.在main函数中对各项参数进行赋值 ...

  7. Apollo单向SSL认证(1)

    参考链接:https://www.cnblogs.com/benwu/articles/4891758.html keytool -genkey -alias mybroker -keyalg RSA ...

  8. 所有和Java中代理有关的知识点都在这了。

    对于每一个Java开发来说,代理这个词或多或少都会听说过.你可能听到过的有代理模式.动态代理.反向代理等.那么,到底什么是代理,这么多代理又有什么区别呢.本文就来简要分析一下. 代理技术,其实不只是J ...

  9. 如何使用Java访问双向认证的Https资源

    本文的相关源码位于 https://github.com/dreamingodd/CA-generation-demo 0.Nginx配置Https双向认证 首先配置Https双向认证的服务器资源. ...

随机推荐

  1. [转] 使用Spring Boot和Gradle创建项目

    Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的 ...

  2. Because the people who are crazy enough to think they can change the world, are the ones who do.

    Here's to the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square h ...

  3. 【网络流#1】hdu 3549 - 最大流模板题

    因为坑了无数次队友 要开始学习网络流了,先从基础的开始,嗯~ 这道题是最大流的模板题,用来测试模板好啦~ Edmonds_Karp模板 with 前向星 时间复杂度o(V*E^2) #include& ...

  4. zookeeper管理solr的配置文件

    zookeeper可以管理solr和其他软件的配置文件.配置文件还是保存在linux服务器的磁盘上,但是不是改变solr读取solr/home配置的配置文件的位置. 现在solr/home配置文件的位 ...

  5. mysql慢查优化总结

    1.优化sql语句结构 or改成union,使用start,limit 先只查询出所有的id,然后再排序.如果查询出所有的id仍然很慢,就要仔细考虑了. 2.添加索引 mysql每次查询只能使用一个索 ...

  6. 你确定你是一个合格的.Net开发人员吗?

    做.net开发已有近5年时间,自认掌握的知识比较全面.最近部门需要招人,今天抽空在网上看了一下,发现我了解的还是不够多啊.下面是我大致的罗列了一下作为一名.Net开发人员所需要掌握的只是.看看你是不是 ...

  7. (转)TortoiseSVN使用简介

    TortoiseSVN使用简介 TortoiseSVN使用简介 2009-04-24 来源:dev.idv.tw 1 安装及下载client 端 2 什么是SVN(Subversion)? 3 为甚么 ...

  8. String or binary data would be truncated

    在使用Typed Dataset进行数据的插入时,会报这样的错:String or binary data would be truncated. 我碰到的原因是 数据库中字段的长度过段,插入时内容被 ...

  9. mssql定时执行作业。

    ---2000 企业管理器 --管理 --SQL Server代理 --右键作业 --新建作业 --"常规"项中输入作业名称 --"步骤"项 --新建 --&q ...

  10. minus的用法

    简单的说就是去同留异. MINUS 指令是运用在两个 SQL 语句上.它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中.如果有的话,那这一笔资料就被去除,而 ...