2011-01-07 9 views
7

Estoy trabajando en un proyecto para controlar la luz y la calefacción en edificios. El backend (escrito en Java) se ejecutará en un Mac Mini y debe ser accesible a través de SOAP.Uso de javax.xml.ws.Endpoint con HTTPS

Quiero mantener la complejidad de este proyecto al mínimo porque no quiero que todos lo usen al tener que configurar un servidor de aplicaciones. Así que hasta ahora he trabajado con javax.xml.ws.Endpoint:

Endpoint endpoint = Endpoint.create(frontendInterface); 
String uri = "http://"+config.getHost()+":"+config.getPort()+config.getPath(); 

endpoint.publish(uri); 

Esto funciona sorprendentemente bien (? Bueno, cuando vio por última vez algo en Java trabajar con sólo 3 líneas de código), pero ahora Estoy buscando una forma de usar HTTPS en lugar de HTTP.

¿Hay alguna manera de hacerlo sin usar un servidor de aplicaciones o hay alguna otra forma de asegurar esta conexión?

Saludos, Marek

Respuesta

15

Para el servidor:

SSLContext ssl = SSLContext.getInstance("TLS"); 

KeyManagerFactory keyFactory = KeyManagerFactory     .getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
KeyStore store = KeyStore.getInstance("JKS"); 

store.load(new FileInputStream(keystoreFile),keyPass.toCharArray()); 

keyFactory.init(store, keyPass.toCharArray()); 


TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 

trustFactory.init(store); 

ssl.init(keyFactory.getKeyManagers(), 
trustFactory.getTrustManagers(), new SecureRandom()); 

HttpsConfigurator configurator = new HttpsConfigurator(ssl); 

HttpsServer httpsServer = HttpsServer.create(new InetSocketAddress(hostname, port), port); 

httpsServer.setHttpsConfigurator(configurator); 

HttpContext httpContext = httpsServer.createContext(uri); 

httpsServer.start(); 

endpoint.publish(httpContext); 

para el cliente, asegúrese de hacer esto:

System.setProperty("javax.net.ssl.trustStore", "path"); 
System.setProperty("javax.net.ssl.keyStore", "password"); 
System.setProperty("javax.net.ssl.keyStorePassword", "password"); 
System.setProperty("javax.net.ssl.keyStoreType", "JKS"); 
//done to prevent CN verification in client keystore 
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 
    @Override 
    public boolean verify(String hostname, SSLSession session) { 
    return true; 
    } 
}); 
+1

Wow - gracias, esto realmente funciona! Casi pierdo la esperanza ... – marekventur

+3

No verificar el nombre de host (con este 'HostnameVerifier' que permite el paso) está eliminando un paso importante para asegurar la comunicación. No lo hagas! – Bruno

+1

Tenga en cuenta que el segundo argumento en HttpsServer.create es "el número máximo de conexiones entrantes en cola para permitir en el socket de escucha" de acuerdo con: http://docs.oracle.com/javase/6/docs/jre/api/ net/httpserver/spec/com/sun/net/httpserver/HttpsServer.html – zpon