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. 配置NTP时间服务器

    一.安装ntp软件 1.检查是否安装了ntp相关包. rpm -qa | grep ntp 2.安装ntp软件. yum -y install ntp 二.参数讲解 ignore  :关闭所有的 NT ...

  2. 去掉input【type=number】默认的上下箭头

    input::-webkit-inner-spin-button {-webkit-appearance: none;}input::-webkit-outer-spin-button {-webki ...

  3. div整体布局分析

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Remoting 的“传递的引用”理解

    WCf是集大成者,具有其他微软的很多技术,其中分布式上很多借助于Remoting,所以研究一下Remoting有助于理解WCF 提到Remoting就不得不涉及到MarshalByRefObject这 ...

  5. mysql索引和缓存

    mysql有缓存,缓存的设置见[转]MySql查询缓存机制

  6. pl/sql的工具导入和代码导入

    工具导入:在导入的文件中添加导入工具.导入imp:F:\app\Administrator\product\11.1.0\db_1\BIN\imp.exe导出exp:F:\app\Administra ...

  7. Undefined symbols for architecture x86_64:

    真机运行正常, 但要在模拟器运行的时候, 编译就报错了: 解决方法: 1.将Build Settings的Architectures修改为arm7 armv7s.Xcode7默认是加上arm64的,但 ...

  8. 《Linux内核分析》 week4作业-使用嵌入式汇编调用一个系统调用

    一.fork的嵌入式汇编执行 #include <stdio.h> #include <unistd.h> int main(){ pid_t pid; asm volatil ...

  9. 命令passwd报错因inode节点处理记录

    命令passwd报错因inode节点处理记录故障现象:1.修改密码时报错 passwd: Authentication token manipulation error2.添加用户报错:unable ...

  10. MySQL新建用户,授权,删除用户,修改密码总结

    首先要声明一下:一般情况下,修改MySQL密码,授权,是需要有mysql里的root权限的. 注:本操作是在WIN命令提示符下,phpMyAdmin同样适用. 用户:rdingcn 用户数据库:rdi ...