写道
总体思路步骤是
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(); } } }