`

Java sslSocket 聊天实例

    博客分类:
  • java
阅读更多

-----------------------------------------------------server-------------------------------------------------

 

package com.test.http;

 

/*

 *SSL Socket的服务器端

 *@Author lixingang

 */

 

import java.io.BufferedReader;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintStream;

import java.net.InetSocketAddress;

import java.net.SocketAddress;

import java.security.KeyManagementException;

import java.security.KeyStore;

import java.security.KeyStoreException;

import java.security.NoSuchAlgorithmException;

import java.security.UnrecoverableKeyException;

import java.security.cert.CertificateException;

 

import javax.net.ssl.KeyManagerFactory;

import javax.net.ssl.SSLContext;

import javax.net.ssl.SSLServerSocket;

import javax.net.ssl.SSLServerSocketFactory;

import javax.net.ssl.SSLSocket;

 

public class SSLServer {

      public static void startSSLServer() throws IOException {

             int port = 16666;// 监听端口

             String keyFile = "c:\\test\\serverkey.jks";// 密钥库文件

             String keyFilePass = "changeit";// 密钥库的密码

             String keyPass = "changeit";// 密钥别名的密码

             SSLServerSocket sslsocket = null;// 安全连接套接字

             KeyStore ks;// 密钥库

             KeyManagerFactory kmf;// 密钥管理工厂

             SSLContext sslc = null;// 安全连接方式

             // 初始化安全连接的密钥

             try {

                    ks = KeyStore.getInstance("JKS");

                    ks.load(new FileInputStream(keyFile), keyFilePass.toCharArray());

                    // 创建管理JKS密钥库的X.509密钥管理器

                    kmf = KeyManagerFactory.getInstance("SunX509");

                    kmf.init(ks, keyPass.toCharArray());

                    //构造SSL环境,指定SSL版本为3.0,也可以使用TLSv1,但是SSLv3更加常用

                    sslc = SSLContext.getInstance("SSLv3");

                    //初始化SSL环境。第二个参数是告诉JSSE使用的可信任证书的来源,

                    //设置为null是从javax.net.ssl.trustStore中获得证书。第三个参数是JSSE生成的随机数,

                    //这个参数将影响系统的安全性,设置为null是个好选择,可以保证JSSE的安全性。

                    sslc.init(kmf.getKeyManagers(), null, null);

             } catch (KeyManagementException ex) {

                   

             } catch (KeyStoreException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

             } catch (NoSuchAlgorithmException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

             } catch (CertificateException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

             } catch (UnrecoverableKeyException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

             }

             // 用安全连接的工厂来创建安全连接套接字

             SSLServerSocketFactory sslssf = sslc.getServerSocketFactory();

             sslsocket = (SSLServerSocket) sslssf.createServerSocket();// 创建并进入监听

             SocketAddress sa=new InetSocketAddress("localhost",port);

             sslsocket.bind(sa);

             System.out.println("Listening...");

             SSLSocket ssocket = (SSLSocket) sslsocket.accept();// 接受客户端的连接

             System.out.println("Server Connection OK~");

             System.out.println("========================");

             System.out.println("");

             // 以下代码同socket通讯实例中的代码

             BufferedReader socketIn = new BufferedReader(new InputStreamReader(

                           ssocket.getInputStream()));

             BufferedReader userIn = new BufferedReader(new InputStreamReader(

                           System.in));

             PrintStream socketOut = new PrintStream(ssocket.getOutputStream());

             String s;

             while (true) {

                    System.out.println("Please wait client 's message..");

                    System.out.println("");

                    s = socketIn.readLine();

                    System.out.println("Client Message: " + s);

                    if (s.trim().equals("BYE"))

                           break;

                    System.out.print("Server Message: ");

                    s = userIn.readLine();

                    socketOut.println(s);

                    if (s.trim().equals("BYE"))

                           break;

             }

             socketIn.close();

             socketOut.close();

             userIn.close();

             sslsocket.close();

      }

 

      public static void main(String[] args) {

             try {

                    startSSLServer();

             } catch (Exception e) {

                    System.out.println("Error: " + e);

             }

      }

}

 

 

-----------------------------------------------------client--------------------------------------------------

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintStream;

import java.net.Socket;

 

import javax.net.ssl.SSLSocketFactory;

 

public class SSLClient {

      static int port = 16666;

 

      public static void startSSLClient() throws IOException {

             int port = 16666;// 要连接的服务器端口

             String serverAdd = "localhost";// 要连接的服务器地址192.168.1.39

             try {

                    System.setProperty("javax.net.ssl.trustStore", "c:\\test\\serverkey.jks");// 设置可信任的密钥仓库

                    System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); // 设置可信任的密钥仓库的密码

                    SSLSocketFactory sslsf = (SSLSocketFactory) SSLSocketFactory

                                  .getDefault();// 利用工厂来创建SSLSocket安全套接字

                    Socket csocket = sslsf.createSocket(serverAdd, port);// 创建并连接服务器

                    System.out.println("Client OK~");

                    System.out.println("===============");

                    System.out.println("");

                    // 以下代码同socket通讯实例中的代码

                    BufferedReader socketIn = new BufferedReader(new InputStreamReader(

                                  csocket.getInputStream()));// 接受到的信息

                    PrintStream socketOut = new PrintStream(csocket.getOutputStream());// 要发送的信息

                    BufferedReader userIn = new BufferedReader(new InputStreamReader(

                                  System.in));// 用户输入信息

                    String s;

                    while (true) {

                           System.out.print("Client Message: ");

                           s = userIn.readLine();

                           socketOut.println(s);

                           if (s.trim().equals("BYE"))

                                  break;

                           else {

                                  System.out.println("Please wait Server Message..");

                                  System.out.println("");

                           }

                           s = socketIn.readLine();

                           System.out.println("Server Message: " + s);

                           if (s.trim().equals("BYE"))

                                  break;

                    }

                    socketIn.close();

                    socketOut.close();

                    userIn.close();

                    csocket.close();

             } catch (Exception e) {

                    e.printStackTrace();

             }

      }

 

      public static void main(String[] args) {

             try {

                    startSSLClient();

             } catch (Exception e) {

                    System.out.println("Error: " + e);

             }

      }

}

分享到:
评论
1 楼 HF_SKY000 2012-10-17  
请问:
一、能否提供一下密钥库文件的生成方法?
二、密钥库的密码、密钥别名密码分别指什么?在哪里用得到?
三、密钥库文件应该是服务端提供给客户端(当然,你这里是在同一台电脑上),两端密钥库文件必须得相同吧?

相关推荐

Global site tag (gtag.js) - Google Analytics