即上一篇的普通的socket网络通讯后,再来一个ssl的安全的socket链接的建立方法

java,sockert网络通讯实例,请见文章

java,socket网络通讯实例

ssl socket建立连接的时候必须要提供数字签名, 服务器端的数字签名必须和客户端一样,私钥

步骤:

1.服务器端生成数字签名

2.服务器程序必须要将第一步生成的数字签名使用进去

3.客户端的数字签字可以直接安装成客户端的计算机或者相应的设备中, 必须客户端能找到这个数字签名文件

以下是代码:

1.服务器端程序SSLServer.java

package com.zhai.Test;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
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.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;

public class SSLServer {
    static int port = 8266; // 系统将要监听的端口号,82.6.6是偶以前女朋友的生日^_^
    static SSLServerSocket server;

    /*
     * 构造函数
     */

    public SSLServer() {
    }

    /*
     * @param port 监听的端口号
     *
     * @return 返回一个SSLServerSocket对象
     */

    private static SSLServerSocket getServerSocket(int thePort) {
        SSLServerSocket s = null;
        try {
            // String key = "SSLKey";
            String key = "/home/zhai/mykey/SSLKey"; // 要使用的证书名

            char keyStorePass[] = "654321".toCharArray(); // 证书密码

            char keyPassword[] = "654321".toCharArray(); // 证书别称所使用的主要密码

            KeyStore ks = KeyStore.getInstance("JKS"); // 创建JKS密钥库

            ks.load(new FileInputStream(key), keyStorePass);

            // 创建管理JKS密钥库的X.509密钥管理器
            KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");

            kmf.init(ks, keyPassword);

            // 构造SSL环境,指定SSL版本为3.0,也可以使用TLSv1,但是SSLv3更加常用。
            SSLContext sslContext = SSLContext.getInstance("SSLv3");

            /*
             * 初始化SSL环境。第二个参数是告诉JSSE使用的可信任证书的来源,
             * 设置为null是从javax.net.ssl.trustStore中获得证书。
             * 第三个参数是JSSE生成的随机数,这个参数将影响系统的安全性, 设置为null是个好选择,可以保证JSSE的安全性。
             */
            sslContext.init(kmf.getKeyManagers(), null, null);

            // 根据上面配置的SSL上下文来产生SSLServerSocketFactory,与通常的产生方法不同
            SSLServerSocketFactory factory = sslContext
                    .getServerSocketFactory();

            s = (SSLServerSocket) factory.createServerSocket(thePort);

        } catch (Exception e) {
            System.out.println(e);
        }
        return (s);
    }

    public static void main(String args[]) {
        try {
            server = getServerSocket(port);
            System.out.println("在”+port+”端口等待连接…");

            while (true) {
                SSLSocket socket = (SSLSocket) server.accept();

                // 将得到的socket交给CreateThread对象处理,主线程继续监听
                new CreateThread(socket);

            }
        } catch (Exception e) {
            System.out.println("main方法错误80:" + e);
        }
    }
}

/*
* 内部类,获得主线程的socket连接,生成子线程来处理
*/

class CreateThread extends Thread {
    static BufferedReader in;
    static PrintWriter out;
    static Socket s;

    /*
     * 构造函数,获得socket连接,初始化in和out对象
     */
    public CreateThread(Socket socket) {
        try {
            s = socket;
            in = new BufferedReader(new InputStreamReader(s.getInputStream(),
                    "gb2312"));

            out = new PrintWriter(s.getOutputStream(), true);

            start(); // 开新线程执行run方法

        } catch (Exception e) {
            System.out.println(e);
        }

    }

    /*
     * 线程方法,处理socket传递过来的数据
     */
    public void run() {
        try {
            String msg = in.readLine();
            System.out.println(msg);
            s.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

2.客户端的代码SSLClient.java

package com.zhai.test;

import java.io.PrintWriter;
import java.net.Socket;

import javax.net.ssl.SSLSocketFactory;

/*
*
运行的方法
zhai@linux:~/workspace/TestJavaSSLClient/bin$ java -Djavax.net.ssl.trustStore=SSLKey com.zhai.test.SSLClient

*
*/
public class SSLClient {
    static String server = "127.0.0.1";

    static int port = 8266;

    public static void main(String args[]) {
        try {
            SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory
                    .getDefault();

            Socket s = factory.createSocket(server, port);

            PrintWriter out = new PrintWriter(s.getOutputStream(), true);
            out.println("say,helloe");
            out.close();
            s.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

3.生成数字签名文件,并导入

zhai@linux:~/workspace/TestJavaSSLClient/bin$ java -Djavax.net.ssl.trustStore=SSLKey com.zhai.test.SSLClient