SSLServer


package test;

import java.io.FileInputStream;
import java.io.InputStream;
import java.security.KeyStore;

import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;

public class SSLServerFactory {
	private SSLServerSocketFactory sslSSFactory = null;	
	private  char[] passwd = null;
	private boolean initSession = false;
	private String keyFile = null;
	
	public void createServer(int port){
		if(!initSession){
			initSession();
		}
		
		SSLServer service = new SSLServer(sslSSFactory, port);
		service.start();
	}
	
	private void initSession(){		
		InputStream fileIn = null;
		KeyStore keyStore = null;
		KeyManagerFactory keyManagerFactory = null;
		KeyManager[] keyManagers = null;
		TrustManagerFactory trustManagerFactory = null;
		TrustManager[] trustManagers = null;
		SSLContext sslContext = null;
		
		try{			
			try{
				keyStore = KeyStore.getInstance("JKS");			
				fileIn = new FileInputStream(keyFile);
				keyStore.load(fileIn, passwd);
			}finally{
				try{
					if(null != fileIn) fileIn.close();
				}catch(Exception ex){				
				}
			}
			
			keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
			keyManagerFactory.init(keyStore,passwd);
			keyManagers = keyManagerFactory.getKeyManagers();
			trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
			trustManagerFactory.init(keyStore);
			trustManagers = trustManagerFactory.getTrustManagers();
			
			sslContext = SSLContext.getInstance("TLS");//SSl
			sslContext.init(keyManagers, trustManagers, null);			
			
			sslSSFactory = sslContext.getServerSocketFactory();			
			initSession = true;
		}catch(Exception ex){
			initSession = false;
			throw new RuntimeException(ex);
		}
	}
	
	public void setPasswd(String passwd){
		this.passwd = passwd.toCharArray();
	}
	
	public void setKeyFile(String keyFile){
		this.keyFile = keyFile;
	}
}


package test;

import java.net.InetSocketAddress;

import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;

public class SSLServer extends Thread{
	private SSLServerSocketFactory sslSSFactory = null;
	private int port;
	
	public SSLServer(SSLServerSocketFactory sslSSFactory, int port){
		this.sslSSFactory = sslSSFactory;
		this.port = port;
	}
		
	public void run(){
		SSLSocket connect = null;
		InetSocketAddress localAddress = null;
		
		try{
			localAddress = new InetSocketAddress("192.168.2.23", port);
			SSLServerSocket ss = (SSLServerSocket) sslSSFactory.createServerSocket();
			//如果這個值爲true,則表示需要雙向驗證
			ss.setNeedClientAuth(true);
			ss.bind(localAddress);
			ss.setEnableSessionCreation(true);
			
			System.out.println("SSLServer已開啓,監聽端口:"+port);
			
			for(int i=0;;i++){				
				connect = (SSLSocket) ss.accept();
				new SSLRequestHandler(i, connect).start();
			}	
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
	
}


package test;

import java.io.InputStream;
import java.io.OutputStream;

import javax.net.ssl.SSLSocket;

class SSLRequestHandler  extends Thread{
	private int id;
	private SSLSocket connect;
	
	public SSLRequestHandler(int id, SSLSocket connect){
		this.id = id;
		this.connect = connect;			
	}
	
	public void run(){
		InputStream in = null;
		OutputStream out = null;
		byte[] buffer = new byte[512];
		int readLen = 0;
		
		try{
			this.connect.setSoTimeout(3*1000);
			
			if(connect.isConnected()){
				in = connect.getInputStream();
				out = connect.getOutputStream();
				
				for(;-1 != (readLen=in.read(buffer));){
					System.out.println("id:"+id+"  msg:"+new String(buffer, 0, readLen));
				}
			}				
		}catch(Exception ex){
			ex.printStackTrace();
		}finally{
			try{
				if(null != connect) connect.close();
			}catch(Exception ex){					
			}
		}
	}
	
}







發佈了65 篇原創文章 · 獲贊 18 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章