转载自: http://blog.csdn.net/chw1989/article/details/7584995

实现技术:
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文件中

生成一个CA证书,在命令行下执行:
keytool -genkey -alias serverkey -keystore kserver.keystore 

第一个参数是要生成的证书的名字;第二个参数是证书的别名。rsa指明了我们使用的加密方法。
系统会要求输入证书发放者的信息,逐项输入即可。
     系统生成的文件名将会和证书名相同。证书可以提交给权威CA认证组织审核,如果通过审核,组织会提供信任担保,向客户担保你的连接是安全的。当然这不是必须的。在我们的例子中会把证书直接打包到客户端程序中,保证客户端是授权用户,避免伪造客户,所以不需要提交审核。

生成后的结果:

keytool -genkey -keystore SSLKey -keyalg rsa -alias SSL 指定了使用RSA 加解密的方式

2)根据私钥,导出服务端证书,生成server .crt 文件。keytool -export -alias serverkey -keystore kserver.keystore -file server.crt

注意: -alias 和 -keystore 要相同,

crt 文件是公钥,用来解密,用来解密的要导入对方的trust 账户中。

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

keytool -import -alias serverkey -file server.crt -keystore tclient.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

--导入到服务端的Trust KeyStore中

Server端代码:

    package ssl;  import java.io.BufferedInputStream;  import java.io.BufferedOutputStream;  import java.io.FileInputStream;  import java.io.InputStream;  import java.io.OutputStream;  import java.net.Socket;  import java.security.KeyStore;  import javax.net.ssl.KeyManagerFactory;  import javax.net.ssl.SSLContext;  import javax.net.ssl.SSLServerSocket;  import javax.net.ssl.TrustManagerFactory;  /** * * @author Leo */  public class Server implements Runnable{  private static final int    DEFAULT_PORT                    = 7777;  private static final String SERVER_KEY_STORE_PASSWORD       = "123456";  private static final String SERVER_TRUST_KEY_STORE_PASSWORD = "123456";  private SSLServerSocket     serverSocket;  /** * 启动程序 *  * @param args */  public static void main(String[] args) {  Server server = new Server();  server.init();  Thread thread = new Thread(server);  thread.start();  }  public synchronized void start() {  if (serverSocket == null) {  System.out.println("ERROR");  return;  }  while (true) {  try {  Socket s = serverSocket.accept();  InputStream input = s.getInputStream();  OutputStream output = s.getOutputStream();  BufferedInputStream bis = new BufferedInputStream(input);  BufferedOutputStream bos = new BufferedOutputStream(output);  byte[] buffer = new byte[20];  bis.read(buffer);  System.out.println("------receive:--------"+new String(buffer).toString());  bos.write("yes".getBytes());  bos.flush();  s.close();  } catch (Exception e) {  System.out.println(e);  }  }  }  public void init() {  try {  SSLContext ctx = SSLContext.getInstance("SSL");  KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");  TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");  KeyStore ks = KeyStore.getInstance("JKS");  KeyStore tks = KeyStore.getInstance("JKS");  //keystore 与 trust key store ks.load(new FileInputStream("src/ssl/kserver.keystore"), SERVER_KEY_STORE_PASSWORD.toCharArray());  tks.load(new FileInputStream("src/ssl/tserver.keystore"), SERVER_TRUST_KEY_STORE_PASSWORD.toCharArray());  kmf.init(ks, SERVER_KEY_STORE_PASSWORD.toCharArray());  tmf.init(tks);  ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);  serverSocket = (SSLServerSocket) ctx.getServerSocketFactory().createServerSocket(DEFAULT_PORT);  serverSocket.setNeedClientAuth(true);   } catch (Exception e) {  System.out.println(e);  }  }  public void run() {  // TODO Auto-generated method stub  start();  }  }  

Client

    package ssl;  import java.io.BufferedInputStream;  import java.io.BufferedOutputStream;  import java.io.FileInputStream;  import java.io.IOException;  import java.io.InputStream;  import java.io.OutputStream;  import java.security.KeyStore;  import javax.net.ssl.KeyManagerFactory;  import javax.net.ssl.SSLContext;  import javax.net.ssl.SSLSocket;  import javax.net.ssl.TrustManagerFactory;  /** * SSL Client *  * @author Leo */  public class Client {  private static final String DEFAULT_HOST                    = "127.0.0.1";  private static final int    DEFAULT_PORT                    = 7777;  private static final String CLIENT_KEY_STORE_PASSWORD       = "123456";  private static final String CLIENT_TRUST_KEY_STORE_PASSWORD = "123456";  private SSLSocket           sslSocket;  /** * 启动客户端程序 *  * @param args */  public static void main(String[] args) {  Client client = new Client();  client.init();  client.process();  }  public void process() {  if (sslSocket == null) {  System.out.println("ERROR");  return;  }  try {  InputStream input = sslSocket.getInputStream();  OutputStream output = sslSocket.getOutputStream();  BufferedInputStream bis = new BufferedInputStream(input);  BufferedOutputStream bos = new BufferedOutputStream(output);  bos.write("1234567890".getBytes());  bos.flush();  byte[] buffer = new byte[20];  bis.read(buffer);  System.out.println(new String(buffer));  sslSocket.close();  } catch (IOException e) {  System.out.println(e);  }  }  public void init() {  try {  SSLContext ctx = SSLContext.getInstance("SSL");  KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");  TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");  KeyStore ks = KeyStore.getInstance("JKS");  KeyStore tks = KeyStore.getInstance("JKS");  //key store 与 trust key store ks.load(new FileInputStream("src/ssl/kclient.keystore"), CLIENT_KEY_STORE_PASSWORD.toCharArray());  tks.load(new FileInputStream("src/ssl/tclient.keystore"), CLIENT_TRUST_KEY_STORE_PASSWORD.toCharArray());  kmf.init(ks, CLIENT_KEY_STORE_PASSWORD.toCharArray());  tmf.init(tks);  ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);  sslSocket = (SSLSocket) ctx.getSocketFactory().createSocket(DEFAULT_HOST, DEFAULT_PORT);  } catch (Exception e) {  System.out.println(e);  }  }  }  

如此,就完成了服务端和客户端之间的基于身份认证的交互。
client采用kclient.keystore中的clientkey私钥进行数据加密,发送给server。
server采用tserver.keystore中的client.crt证书(包含了clientkey的公钥)对数据解密,如果解密成功,证明消息来自client,进行逻辑处理。

server采用kserver.keystore中的serverkey私钥进行数据加密,发送给client。
client采用tclient.keystore中的server.crt证书(包含了serverkey的公钥)对数据解密,如果解密成功,证明消息来自server,进行逻辑处理。
如果过程中,解密失败,那么证明消息来源错误。不进行逻辑处理。这样就完成了双向的身份认证。

SSL 的 java 实现相关推荐

  1. sqlserver 项目中连接失败,驱动程序无法通过使用安全套接字层(SSL) 与 java.security.cert.CertificateException

    问题一:驱动程序无法通过使用安全套接字层(SSL) 注意: 有两个 jre 文件夹,一个是 jdk内包含的,一个是 单独的 jre 解决办法:把jdk下面的\jre\lib\security下面的ja ...

  2. keytool生成证书_创建自签名ssl证书,Java生产jks证书

    一.创建自签名ssl证书 下载openssl软件: https://pan.baidu.com/s/1Zy4W7pqSO8caoR_R5pF3DQ  #提取码:bjd4 设置环境变量 进入openss ...

  3. java ssl server,Java SSL Server禁用弱椭圆曲线

    所以这是我的 Java ssl Server的代码. ctx是使用服务器密钥库初始化的SSLContext. public SSLEngine createSSLEngine() { SSLEngin ...

  4. 【SSL】java keytool工具创建自己的(localhost)(JKS)证书库

    前言 java : jdk1.8 证书库:用于在本地测试的证书库,域名为:locahost. 证书库密码:密码为"localhost". 证书库位置:当前路径 证书库文件名:loc ...

  5. 【SSL】java keytool工具操作java带的(JKS)证书库

    前言 java : jdk1.8 证书库:java自带证书库. 证书库密码:java自带证书库的默认密码为"changeit". jdk安装位置:C:\Program Files\ ...

  6. 【SSL】java keytool工具操作PCKS12证书库

    前言 java : jdk1.8 linux 命令的换行符为 \. window 命令的换行符为 ^. 证书 PKCS 全称是 Public-Key Cryptography Standards ,是 ...

  7. javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair

    遇到这个问题百度都说需要bcprov-ext-jdk15on-1.52,bcprov-jdk15on-1.52这两个jar包,我实际情况只用到了一个jar就好了:bcprov-jdk16-1.46.j ...

  8. java ssl protocol,java – 为HTTPS连接设置https.protocols系统属性的问题

    我有一个 Java实现,它被各种客户端应用程序用来连接到第三方系统.这些第三方系统通过http / https支持不同的协议.在这种情况下,所有客户端应用程序都托管在我的Java实现托管的同一服务器中 ...

  9. java ssl证书生成_java – 使用jdk中提供的keytool生成SSL证书

    我在Web应用程序中使用的密钥库文件已于上周过期.我很久以前就生成了它.所以我开始使用keytool生成新证书.我使用此证书连接事务服务器和Web服务器.我想为此应用程序使用自签名证书.我使用以下命令 ...

最新文章

  1. Jersey Restful部署到Tomcat注意事项
  2. [鸟哥的Linux私房菜] X Window 与 纯文本模式的切换
  3. Java 折半查询,java之折半查询
  4. C++中关于隐藏的理解
  5. 简记Ubuntu下载 Android源码
  6. VMware 虚拟机扩展Ubuntu系统磁盘空间
  7. Codeforces Round 1 - 10总结 【@Abandon】
  8. 快速部署PostgreSQL
  9. 南阳理工学院计算机acm,南阳理工学院计算机学院ACM队成员获奖情况[荣誉记]
  10. javaIO流实现文件拷贝
  11. 万亿估值来了!3次大难不死,蚂蚁金服终于登顶世界第一
  12. 小程序用户登录权限设置
  13. github的verified标签是什么
  14. VB中的二维数组输出的定位
  15. 用python画一个蜡笔小新
  16. bigemap中下载边界_BIGEMAP地图下载软件-BIGEMAP地图下载器下载v19.2.0.0-西西软件下载...
  17. 华为快应用支持广告变现,加速商业化进程
  18. 音视频技术开发周刊 | 232
  19. 小米笔记本 - 驱动下载
  20. 扩展欧几里得算法求逆元---乘法密码

热门文章

  1. day18--django3之Ajax
  2. [SQL基础教程]1-4 SQL 表的创建
  3. Nancy 学习-视图引擎 继续跨平台
  4. AjaxUploader使用
  5. silverlight mediaElement 动态添加source
  6. SCNCHECKPOINT
  7. 进程、后台进程以及信号
  8. kong 使用jwt RSA256证书
  9. 计算机网络(谢希仁 第七版) 数据链路层 个人笔记
  10. 如何防止XshellPortable、putty、SecureCRT等断网造成Linux命令中断