2011-01-07 3 views
7

Je travaille sur un projet de contrôle de la lumière et du chauffage dans les bâtiments. Le backend (écrit en Java) fonctionnera sur un Mac Mini et devrait être accessible via SOAP. Je veux minimiser la complexité de ce projet parce que je ne veux pas que tout le monde l'utilise pour mettre en place un serveur d'applications. Donc, jusqu'à présent, je travaillais avec javax.xml.ws.Endpoint:Utilisation de javax.xml.ws.Endpoint avec HTTPS

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

endpoint.publish(uri); 

Cela fonctionne étonnamment bien (hey, quand vous avez vu quelque chose en dernier Java travailler avec seulement 3 lignes de code), mais maintenant je Je cherche un moyen d'utiliser HTTPS au lieu de HTTP.

Existe-t-il un moyen de le faire sans utiliser un serveur d'applications ou existe-t-il un autre moyen de sécuriser cette connexion?

Salutations, Marek

Répondre

15

Pour le serveur:

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); 

Pour le client, assurez-vous que vous faites ceci:

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 - merci, cela fonctionne vraiment! J'ai presque perdu espoir ... – marekventur

+3

Ne pas vérifier le nom d'hôte (avec ce 'HostnameVerifier' qui laisse passer n'importe quoi) enlève une étape importante pour sécuriser la communication. Ne fais pas ça! – Bruno

+1

Veuillez noter que le second argument dans HttpsServer.create est "le nombre maximum de connexions entrantes en file d'attente à autoriser sur le socket d'écoute" selon: http://docs.oracle.com/javase/6/docs/jre/api/ net/httpserveur/spec/com/sun/net/httpserver/HttpsServer.html – zpon

Questions connexes