Quiero abrir un socket de escucha segura en una aplicación de servidor Java. Sé que la forma recomendada para hacerlo es simplemente hacer esto:Configuración del certificado utilizado por Java SSL ServerSocket
SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
ServerSocket ss = ssf.createServerSocket(443);
pero esto requiere pasar el certificado del servidor para la JVM en el lanzamiento de Java. Debido a que esto complicaría algunas cosas en el despliegue, preferiría cargar el certificado en tiempo de ejecución.
Tengo un archivo de clave y una contraseña, y quiero un socket de servidor. ¿Como llego hasta ahí? Bueno, leer la documentación y la única manera que pude encontrar es la siguiente:
// these are my parameters for SSL encryption
char[] keyPassword = "[email protected]!".toCharArray();
FileInputStream keyFile = new FileInputStream("ssl.key");
// init keystore
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(keyFile, keyPassword);
// init KeyManagerFactory
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, keyPassword);
// init KeyManager
KeyManager keyManagers[] = keyManagerFactory.getKeyManagers();
// init the SSL context
SSLContext sslContext = SSLContext.getDefault();
sslContext.init(keyManagers, null, new SecureRandom());
// get the socket factory
SSLServerSocketFactory socketFactory = sslContext.getServerSocketFactory();
// and finally, get the socket
ServerSocket serverSocket = socketFactory.createServerSocket(443);
Y que incluso no tener ningún control de errores. ¿Es realmente tan complicado? ¿No hay una manera más fácil de hacerlo?
Esta pregunta es sobre el problema de establecer el certificado. Su título no resaltó eso (y la respuesta hasta ahora parece haber pasado por alto ese punto), así que me he tomado la libertad de cambiarlo. Mejore el título si lo desea. –
Creo que el código que se te ocurrió hasta ahora es (a) horrible y (b) no obstante, muy probable que sea la forma "correcta" de hacerlo. Java no siempre es excesivamente detallado, pero cuando lo es, es realmente excesivamente prolijo. –
Si crees que es complicado, intenta hacerlo con NIO. –