`
夏文权
  • 浏览: 237886 次
  • 性别: Icon_minigender_1
  • 来自: 贵州
社区版块
存档分类
最新评论

Java ssl socket 双向认证

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

}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics