/*
* $Id: SSLServerSocketCreator.java,v 1.4 2002-10-22 12:44:43 cvs Exp $
*/
package javatunnel;
import javax.net.ServerSocketFactory;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocketFactory;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.security.KeyStore;
import java.util.Map;
import org.dcache.util.Args;
public class SSLServerSocketCreator extends ServerSocketFactory {
private final SSLServerSocketFactory ssf;
private UserValidatable uv;
public SSLServerSocketCreator(String args, Map<?,UserValidatable> map) throws IOException {
this(args);
uv = map.get("UserValidatable");
}
public SSLServerSocketCreator(String args) throws IOException {
this(new Args(args));
}
public SSLServerSocketCreator(Args args) throws IOException {
// args[0] : keystore
// args[1] : passphrase
try {
// set up key manager to do server authentication
SSLContext ctx;
KeyManagerFactory kmf;
KeyStore ks;
char[] passphrase = null;
if (args.argv(1) != null) {
passphrase = args.argv(1).toCharArray();
}
ctx = SSLContext.getInstance("TLS");
kmf = KeyManagerFactory.getInstance("SunX509");
ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(args.argv(0)), passphrase);
kmf.init(ks, passphrase);
ctx.init(kmf.getKeyManagers(), null, null);
ssf = ctx.getServerSocketFactory();
} catch (Exception e) {
e.printStackTrace();
throw new IOException("ssl failed");
}
}
@Override
public ServerSocket createServerSocket( int port ) throws IOException {
return new SSLTunnelServerSocket(port, ssf, uv );
}
@Override
public ServerSocket createServerSocket() throws IOException {
return new SSLTunnelServerSocket(ssf, uv );
}
@Override
public ServerSocket createServerSocket(int port, int backlog)
throws IOException {
return new SSLTunnelServerSocket(port, backlog, ssf, uv);
}
@Override
public ServerSocket createServerSocket(int port, int backlog,
InetAddress ifAddress) throws IOException {
return new SSLTunnelServerSocket(port, backlog, ifAddress, ssf, uv);
}
public static void main(String[] args) {
try{
SSLServerSocketCreator sc = new SSLServerSocketCreator(new Args(args));
ServerSocket ss = sc.createServerSocket(1717);
ss.accept();
} catch (Exception e) {
e.printStackTrace();
}
}
}