2012-09-11 17 views
8

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?

+1

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. –

+0

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. –

+0

Si crees que es complicado, intenta hacerlo con NIO. –

Respuesta

9

Pero esto requiere pasar el certificado del servidor a la JVM al iniciar java.

No, no lo hace. Sólo hay que establecer estas propiedades del sistema antes de crear el SSLServerSocket:

javax.net.ssl.keyStore ssl.key 
javax.net.ssl.keyStorePassword [email protected]! 

Usted puede hacer eso con System.setProperties() o en la línea de comandos.

2

Si mira el código, puede ver por qué es necesariamente complicado. Este código desacopla la implementación del protocolo SSL desde:

  • la fuente de su material de claves elección algoritmo (KeyStore)
  • certificado y la administración de claves (KeyManager)
  • gestión de reglas de pares de confianza (TrustManager) - no se utiliza aquí
  • algoritmo aleatorio seguro (SecureRandom)
  • NIO o aplicación de socket (SSLServerSocketFactory) - podría utilizar para SSLEngine NIO

¡Considere cómo se vería su propia implementación si estuviera tratando de alcanzar los mismos objetivos!

+0

Pero estoy usando el valor predeterminado para todo eso. Debería haber una manera más directa. – Philipp

+0

@Philipp No hay un almacén de claves predeterminado. – EJP

Cuestiones relacionadas