嘿嘿 無聊中

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
發佈了97 篇原創文章 · 獲贊 0 · 訪問量 2754
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章