`

嘿嘿 无聊中

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

            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:

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

            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);
        }
    }

}


启动Server
启动Client,发送信息。


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

分享到:
评论

相关推荐

    esasarot:只是无聊的东西..

    埃萨罗只是无聊的东西...

    php soap webservice

    php soap webservice 简单的实现 ,也是无聊没事做,嘿嘿

    VB.NET 模拟操作系统

    大家如果没事的话也可以自己写 OS snv 系统的应用程序 它实际上是一个动态链接库文件 只是改名为 sapp 文件了(偷笑) 接口在 [应用程序] [用户应用程序]中开放出来了 如果大家有什么好的意见 可以发邮件到我邮箱 ...

    java 屏幕截图工具

    无聊写的简易java屏幕截图工具,还差一点任意截图和保存,以后再弄,嘿嘿

    求方程解的java可视化小程序

    无聊,自己编着玩的,以后可以给小学生检查数学作业用,嘿嘿…… 用java编的 ,就这样&

    超级漂亮的企业站-良精内核

    这个程序原来是要收费的,不过缺少的功能我已经补全了,嘿嘿,放心下载吧1没有其他什么说的,就是看不惯垃圾良精几十个马甲去整天JJWW的宣传一个小小的企业站! 同时,选择这个程序的理由很简单,第一,这个是...

    wuziqi1210.zip

    该应用实现了五子棋的简单功能,主要是五子连珠,悔棋,和棋,以及再来一局;遗憾的是播放音乐和人机交互没有实现,如果无聊,可以自己和自己玩,嘿嘿;

    单用鼠标画的花!

    单用鼠标画的花!无聊时候画的,老师看了,问我是不是学过平面设计,嘿嘿,从来就没学过~~就单用普通鼠标在电脑上一笔一笔的话出来的~!~~

    android 自定义ScrollView实现背景图片伸缩的实现代码及思路

    用过多米音乐的都市知道, 这个UI可以上下滑动,作用嘛—无聊中可以划划解解闷,这被锤子公司老罗称谓为“情怀”,其实叫“情味”更合适。嘿嘿.如今挪动互联网开展这么迅速,市场上已不再是那早期随便敲个APP放上架...

    HkeW3mModifier2.05

    [+]加入了个设置语言的功能 嘿嘿纯属无聊 不过说不定有用 1.2版更新 [+]加入MPQ头修复功能 没办法有的图不修复会卡死 不喜欢的话可以把那个选项勾掉 1.1版更新 [+]加入了读取/修改地图显示名的功能 [-]修正了...

    superCmd:超级“命令行”之程序猿专版(多人实时在线斗地主游戏)

    有一天早上,无意中看到了一个牛逼的游戏,需要程序猿使敲代码才可以玩游戏,代码越牛逼,游戏玩起来就越顺手,感觉听起来很牛逼的样子。受此启发,我突然想到了开发一个网络版的斗地主游戏可以在上班无聊的时候玩。...

    懂车帝hk-易语言

    无聊写的 懂车帝hk ... ...识别率却不尽人意 有什么好的思路可以交流下吗 嘿嘿 ~.~

    Js仿新浪微博首页内容滚动

    #我最喜欢的书#绝对不是言情和校园谈恋爱的那种,就是无聊的,只有看那些书的时候,我也一个字看不进。其它的书还都蛮喜欢的,嘿嘿 等会儿又要飞了,好想死。旁边放把剪刀,实在写不出东西来,随时准备从天灵盖插...

    PID算法的运用

    小明接到任务后就一直守在水缸旁边,时间长就觉得无聊,就跑到房里看小说了,每30分钟来检查一次水面高度。水漏得太快,每次小明来检查时,水都快漏完了,离要求的高度相差很远,小明改为每3分钟来检查一次,结果...

    flutter-login-screen-firebase-auth-facebook-login:具有Firebase身份验证和Facebook登录的Flutter登录屏幕

    不要通过编写无聊的样板启动器代码来重新发明轮子。 直接进入动作并严格关注您的核心应用功能。 Instaflutter入职 Flutter上最完整的入门套件项目。 特征 Instaflutter Onboarding是一款功能齐全的应用程序,可为...

Global site tag (gtag.js) - Google Analytics