/** * Copyright 1999-2009 The Pegadi Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.pegadi.server; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLServerSocketFactory; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.Serializable; import java.net.ServerSocket; import java.rmi.server.RMIServerSocketFactory; import java.security.KeyStore; public class RMISSLServerSocketFactory implements RMIServerSocketFactory, Serializable { private static final long serialVersionUID = 659705895199260217L; private String passphrase; private File keystore; private boolean inDeveloperMode; Logger log = LoggerFactory.getLogger(getClass()); public ServerSocket createServerSocket(int port) throws IOException { log.info("createServerSocket: Port " + port); log.info("createServerSocket: keystore is: " + keystore); SSLServerSocketFactory ssf; try { // set up key manager to do server authentication SSLContext ctx; KeyManagerFactory kmf; KeyStore ks; ctx = SSLContext.getInstance("TLS"); kmf = KeyManagerFactory.getInstance("SunX509"); ks = KeyStore.getInstance("JKS"); //If in devmode, just generate a key. if (inDeveloperMode) { ks.load(getClass().getResourceAsStream("dummyssl.keys"), passphrase.toCharArray()); } else { if(!keystore.exists()) { throw new IllegalArgumentException("File " + keystore + " does not exist"); } ks.load(new FileInputStream(keystore), passphrase.toCharArray()); } kmf.init(ks, passphrase.toCharArray()); ctx.init(kmf.getKeyManagers(), null, null); ssf = ctx.getServerSocketFactory(); } catch (Exception e) { log.error("Error", e); throw new IOException("Exceptinon getting socket factory " +e.getClass() + e.getMessage()); } return ssf.createServerSocket(port); } public void setPassphrase(String passphrase) { this.passphrase = passphrase; } public void setKeystore(File keystore) { this.keystore = keystore; } public void setInDeveloperMode(boolean inDeveloperMode) { this.inDeveloperMode = inDeveloperMode; } }