写道
总体思路步骤是
1. 分别生成客户端和服务器端密钥库
keytool -genkey -keystore E:\server.jks -keyalg rsa -alias ssl_1 -validity 700
keytool -genkey -keystore E:\client.jks -keyalg rsa -alias ssl_2 -validity 700
2将服务器和客户端的公钥导出成证书
keytool -export -alias ssl_1 -file e:\ssl_1.cer -keystore e:\server.jks
keytool -export -alias ssl_2 -file e:\ssl_2.cer -keystore e:\client.jks
3 交换证书 导入到各自的密钥库
keytool -import -file e:\ssl_1.cer -keystore e:\client.jks
keytool -import -file e:\ssl_2.cer -keystore e:\server.jks
1. 分别生成客户端和服务器端密钥库
keytool -genkey -keystore E:\server.jks -keyalg rsa -alias ssl_1 -validity 700
keytool -genkey -keystore E:\client.jks -keyalg rsa -alias ssl_2 -validity 700
2将服务器和客户端的公钥导出成证书
keytool -export -alias ssl_1 -file e:\ssl_1.cer -keystore e:\server.jks
keytool -export -alias ssl_2 -file e:\ssl_2.cer -keystore e:\client.jks
3 交换证书 导入到各自的密钥库
keytool -import -file e:\ssl_1.cer -keystore e:\client.jks
keytool -import -file e:\ssl_2.cer -keystore e:\server.jks
public class BothwayServer {
public static void main(String[] args) {
// TODO Auto-generated method stub
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("e:/server.jks"),"changeit".toCharArray());
tks.load(new FileInputStream("e:/server.jks"),"changeit".toCharArray());
kmf.init(ks, "changeit".toCharArray());
tmf.init(tks);
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SSLServerSocket serverSocket = (SSLServerSocket) ctx.getServerSocketFactory().createServerSocket(26666);
serverSocket.setNeedClientAuth(true);
Socket ssls = serverSocket.accept();
// 以下代码同socket通讯实例中的代码
BufferedReader socketIn = new BufferedReader(new InputStreamReader(ssls.getInputStream()));
BufferedReader userIn = new BufferedReader(new InputStreamReader(System.in));
PrintStream socketOut = new PrintStream(ssls.getOutputStream());
String s;
while(true){
System.out.println("等待客户端的请求数据..");
System.out.println("");
s = socketIn.readLine().trim();
if(s != null && !s.equals("")){
System.out.println("客户端发来的消息: " + s);
if (s.trim().equalsIgnoreCase("BYE")){
break;
}
}
System.out.print("服务器发出去的消息............ ");
s = userIn.readLine();
if(s != null && !s.equals("")){
socketOut.println(s);
if (s.trim().equalsIgnoreCase("BYE")){
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class BothwayClient {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
SSLContext context = 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("e:/client.jks"), "changeit".toCharArray());
tks.load(new FileInputStream("e:/client.jks"),"changeit".toCharArray());
kmf.init(ks, "changeit".toCharArray());
tmf.init(tks);
context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SSLSocket csocket= (SSLSocket) context.getSocketFactory().createSocket("localhost", 26666);
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("客户端发出去的消息: ");
s = userIn.readLine();
if(s != null && !s.equals("")){
socketOut.println(s);
if (s.trim().equalsIgnoreCase("BYE")){
break;
}else {
System.out.println("Please wait Server Message..");
System.out.println("");
}
}
s = socketIn.readLine();
if(s != null && !s.equals("")){
System.out.println("服务器发过来的消息: " + s);
if (s.trim().equalsIgnoreCase("BYE")){
break;
}
}
}
socketIn.close();
socketOut.close();
userIn.close();
csocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}