http://avery-leo.iteye.com/blog/276096

实现技术:
JSSE(Java Security Socket Extension
是Sun为了解决在Internet上的实现安全信息传输的解决方案。它实现了SSL和TSL(传输层安全)协议。在JSSE中包含了数据加密,服务器验证,消息完整性和客户端验证等技术。通过使用JSSE,可以在Client和Server之间通过TCP/IP协议安全地传输数据。

为了实现消息认证。
Server需要:
1)KeyStore: 其中保存服务端的私钥
2)Trust KeyStore:其中保存客户端的授权证书
Client需要:
1)KeyStore:其中保存客户端的私钥
2)Trust KeyStore:其中保存服务端的授权证书

使用Java自带的keytool命令,去生成这样信息文件:

1)生成服务端私钥,并且导入到服务端KeyStore文件中

2)根据私钥,导出服务端证书

3)将服务端证书,导入到客户端的Trust KeyStore中

采用同样的方法,生成客户端的私钥,客户端的证书,并且导入到服务端的Trust KeyStore中
1)keytool -genkey -alias clientkey -keystore kclient.keystore
2)keytool -export -alias clientkey -keystore kclient.keystore -file client.crt
3)keytool -import -alias clientkey -file client.crt -keystore tserver.keystore

Server:

Java代码  
  1. package ssl;
  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.FileInputStream;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.net.Socket;
  8. import java.security.KeyStore;
  9. import javax.net.ssl.KeyManagerFactory;
  10. import javax.net.ssl.SSLContext;
  11. import javax.net.ssl.SSLServerSocket;
  12. import javax.net.ssl.TrustManagerFactory;
  13. /**
  14. *
  15. * @author Leo
  16. */
  17. public class Server implements Runnable{
  18. private static final int    DEFAULT_PORT                    = 7777;
  19. private static final String SERVER_KEY_STORE_PASSWORD       = "123456";
  20. private static final String SERVER_TRUST_KEY_STORE_PASSWORD = "123456";
  21. private SSLServerSocket     serverSocket;
  22. /**
  23. * 启动程序
  24. *
  25. * @param args
  26. */
  27. public static void main(String[] args) {
  28. Server server = new Server();
  29. server.init();
  30. Thread thread = new Thread(server);
  31. thread.start();
  32. }
  33. public synchronized void start() {
  34. if (serverSocket == null) {
  35. System.out.println("ERROR");
  36. return;
  37. }
  38. while (true) {
  39. try {
  40. Socket s = serverSocket.accept();
  41. InputStream input = s.getInputStream();
  42. OutputStream output = s.getOutputStream();
  43. BufferedInputStream bis = new BufferedInputStream(input);
  44. BufferedOutputStream bos = new BufferedOutputStream(output);
  45. byte[] buffer = new byte[20];
  46. bis.read(buffer);
  47. System.out.println("------receive:--------"+new String(buffer).toString());
  48. bos.write("yes".getBytes());
  49. bos.flush();
  50. s.close();
  51. } catch (Exception e) {
  52. System.out.println(e);
  53. }
  54. }
  55. }
  56. public void init() {
  57. try {
  58. SSLContext ctx = SSLContext.getInstance("SSL");
  59. KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
  60. TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
  61. KeyStore ks = KeyStore.getInstance("JKS");
  62. KeyStore tks = KeyStore.getInstance("JKS");
  63. ks.load(new FileInputStream("src/ssl/kserver.keystore"), SERVER_KEY_STORE_PASSWORD.toCharArray());
  64. tks.load(new FileInputStream("src/ssl/tserver.keystore"), SERVER_TRUST_KEY_STORE_PASSWORD.toCharArray());
  65. kmf.init(ks, SERVER_KEY_STORE_PASSWORD.toCharArray());
  66. tmf.init(tks);
  67. ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
  68. serverSocket = (SSLServerSocket) ctx.getServerSocketFactory().createServerSocket(DEFAULT_PORT);
  69. serverSocket.setNeedClientAuth(true);
  70. } catch (Exception e) {
  71. System.out.println(e);
  72. }
  73. }
  74. public void run() {
  75. // TODO Auto-generated method stub
  76. start();
  77. }
  78. }

Client:

Java代码  
  1. package ssl;
  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.FileInputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.security.KeyStore;
  9. import javax.net.ssl.KeyManagerFactory;
  10. import javax.net.ssl.SSLContext;
  11. import javax.net.ssl.SSLSocket;
  12. import javax.net.ssl.TrustManagerFactory;
  13. /**
  14. * SSL Client
  15. *
  16. * @author Leo
  17. */
  18. public class Client {
  19. private static final String DEFAULT_HOST                    = "127.0.0.1";
  20. private static final int    DEFAULT_PORT                    = 7777;
  21. private static final String CLIENT_KEY_STORE_PASSWORD       = "123456";
  22. private static final String CLIENT_TRUST_KEY_STORE_PASSWORD = "123456";
  23. private SSLSocket           sslSocket;
  24. /**
  25. * 启动客户端程序
  26. *
  27. * @param args
  28. */
  29. public static void main(String[] args) {
  30. Client client = new Client();
  31. client.init();
  32. client.process();
  33. }
  34. public void process() {
  35. if (sslSocket == null) {
  36. System.out.println("ERROR");
  37. return;
  38. }
  39. try {
  40. InputStream input = sslSocket.getInputStream();
  41. OutputStream output = sslSocket.getOutputStream();
  42. BufferedInputStream bis = new BufferedInputStream(input);
  43. BufferedOutputStream bos = new BufferedOutputStream(output);
  44. bos.write("1234567890".getBytes());
  45. bos.flush();
  46. byte[] buffer = new byte[20];
  47. bis.read(buffer);
  48. System.out.println(new String(buffer));
  49. sslSocket.close();
  50. } catch (IOException e) {
  51. System.out.println(e);
  52. }
  53. }
  54. public void init() {
  55. try {
  56. SSLContext ctx = SSLContext.getInstance("SSL");
  57. KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
  58. TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
  59. KeyStore ks = KeyStore.getInstance("JKS");
  60. KeyStore tks = KeyStore.getInstance("JKS");
  61. ks.load(new FileInputStream("src/ssl/kclient.keystore"), CLIENT_KEY_STORE_PASSWORD.toCharArray());
  62. tks.load(new FileInputStream("src/ssl/tclient.keystore"), CLIENT_TRUST_KEY_STORE_PASSWORD.toCharArray());
  63. kmf.init(ks, CLIENT_KEY_STORE_PASSWORD.toCharArray());
  64. tmf.init(tks);
  65. ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
  66. sslSocket = (SSLSocket) ctx.getSocketFactory().createSocket(DEFAULT_HOST, DEFAULT_PORT);
  67. } catch (Exception e) {
  68. System.out.println(e);
  69. }
  70. }
  71. }

启动Server

启动Client,发送信息。

Server接收如下:正确解密

返回Client信息,如下:

如此,就完成了服务端和客户端之间的基于身份认证的交互。

client采用kclient.keystore中的clientkey私钥进行数据加密,发送给server。
server采用tserver.keystore中的client.crt证书(包含了clientkey的公钥)对数据解密,如果解密成功,证明消息来自client,进行逻辑处理。

server采用kserver.keystore中的serverkey私钥进行数据加密,发送给client。
client采用tclient.keystore中的server.crt证书(包含了serverkey的公钥)对数据解密,如果解密成功,证明消息来自server,进行逻辑处理。

如果过程中,解密失败,那么证明消息来源错误。不进行逻辑处理。这样就完成了双向的身份认证。

java实现 SSL双向认证相关推荐

  1. QtJava笔记-Qt与Java进行SSL双向认证(Qt服务端,Java客户端)

    程序运行截图如下: Qt作为服务端,Java作为客户端. 这里的服务端是用的p12证书,客户端使用的是jks. 具体的生成方式看以前的博文. QSSLServer.h #ifndef QSSLSERV ...

  2. QtJava笔记-Qt与Java进行SSL双向认证(Qt客户端,Java服务端)

    这里使用Java作为服务端,使用Qt作为客户端. 程序运行截图如下: 这里的证书Qt使用的p12,Java使用的jks,看以前的博文生成. 源码打包下载地址: https://github.com/f ...

  3. java使用bks双向认证_客户端与服务器SSL双向认证(客户端:Android

    客户端与服务器SSL双向认证(客户端Android-服务端vc)-含源码(一)服务端已经生成了client.p12.server.p12.ca.p12:主要实现客户端过程(二)目录结构(三)客户端注 ...

  4. java客户端带证书访问服务端_客户端与服务器SSL双向认证(客户端:java-服务端:java)...

    客户端与服务器SSL双向认证(java-java):含源码 (一)实现技术: JSSE(Java Security Socket Extension) 是Sun为了解决在Internet上的实现安全信 ...

  5. 【ssl认证、证书】SSL双向认证java实战、keytool创建证书

    文章目录 概述 keytool示例 参考 相关文章: //-----------Java SSL begin---------------------- [ssl认证.证书]SSL双向认证和SSL单向 ...

  6. JAVA实现发送HTTPS请求(SSL双向认证)

    一.项目背景 Java项目需要作为客户端发起HTTPS请求访问服务端,并且需要携带证书进行SSL双向认证,当前提供的证书相关文件有:ca.crt.ca.key.client.crt.client.ke ...

  7. java代码实现证书生成客户端证书 实现ssl双向认证

    目的:实现web项目的ssl双向认证客户端证书代码生成. 使用openssl生成ca证书和服务端证书,当然也可以通过代码实现 1)创建CA私钥,创建目录ca openssl genrsa -out c ...

  8. TLS/SSL双向认证

    相关文章: openssl genrsa 命令详解 一.PKI.CA.TLS/SSL.OpenSSL等概念及原理 CA 证书签发机构,自己持有私钥,创建根证书,并把根证书发送给操作系统厂商,内置于操作 ...

  9. php使用curl库进行ssl双向认证

    官方文档: http://www.php.net/manual/zh/function.curl-setopt.php#10692 官方举例: <?php curl_setopt($ch, CU ...

最新文章

  1. 接触HTML和CSS心得体会
  2. Java线程(七):锁对象Lock-同步问题更完美的处理方式 .
  3. 丈夫创业前后累计11次
  4. html找不到定义,Main无法正常使用,找不到它的定义
  5. ContentProvider实现流程
  6. QTTabBar 安装记录(Win10 enable .NET)
  7. javaFX系列之web组件:史上最简单的javaFX浏览器实现(web component组件)
  8. C# 如何合并和拆分PDF文件
  9. fadeIn()方法和fadeOut()方法
  10. 关于流浪狗社会现状的调查报告
  11. HTML5期末大作业:基于HTML+CSS+JavaScript实现中国风文化传媒企业官网源码
  12. 【Qbot】1.ChatGPT简介与Q群机器人部署教程
  13. 双向可控硅触发电路的设计方案
  14. 解决STM32F0/F1内部FLASH写操作导致中断程序无法响应的问题
  15. python课题报告_2019-2020-1 《python程序设计》20192428魏来 综合实践报告
  16. [python]bokeh学习总结——bokeh.layouts
  17. 谈谈交换机三种端口模式Access、Hybrid和Trunk
  18. mysql日志备份命令是什么_mysql的常用命令以及备份和恢复
  19. 如何谈不分手的恋爱?
  20. 听说你要把Linux内核源码读完?

热门文章

  1. 【数据结构与算法】之深入解析“分数到小数”的求解思路与算法示例
  2. LeetCode 算法 856. 括号的分数
  3. 141. Linked List Cycle 环形链表
  4. 并发编程——线程——锁
  5. 树莓派AI视觉云台——7、树莓派系统备份
  6. 2015年第六届蓝桥杯C/C++ A组国赛 —— 第五题:切开字符串
  7. 信息学奥赛一本通(C++)在线评测系统——基础(二)基础算法 —— 1313:【例3.5】位数问题
  8. Go语言范围(Range)
  9. (5) DSP28335--SCI
  10. 类属性的特征java_java定义类、属性、方法