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){
}
}
}
}