2011-01-07 16 views
7

Pracuję nad projektem sterowania oświetleniem i ogrzewaniem w budynkach. Backend (napisany w Javie) będzie działał na Mac Mini i powinien być dostępny poprzez SOAP.Używanie javax.xml.ws.Endpoint z HTTPS

Chcę ograniczyć złożoność tego projektu do minimum, ponieważ nie chcę, aby każdy, kto go używa, musiał skonfigurować serwer aplikacji. Tak jak do tej pory pracowałem z javax.xml.ws.Endpoint:

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

endpoint.publish(uri); 

To działa zaskakująco dobrze (? Hej, kiedy po raz ostatni zobaczyć coś w Javie pracy z zaledwie 3 linii kodu), ale teraz Szukam sposobu na użycie HTTPS zamiast HTTP.

Czy można to zrobić bez korzystania z serwera aplikacji lub czy istnieje inny sposób zabezpieczenia tego połączenia?

Pozdrowienia, Marek

Odpowiedz

15

serwer:

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

for Client, upewnij się to zrobić:

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 - dziękuję, to naprawdę działa! Prawie zrezygnowałem z nadziei ... – marekventur

+3

Brak weryfikacji nazwy hosta (z tym 'HostnameVerifier', który przepuszcza wszystko) eliminuje ważny krok do zabezpieczenia komunikacji. Nie rób tego! – Bruno

+1

Należy zauważyć, że drugim argumentem w HttpsServer.create jest "maksymalna liczba oczekujących połączeń przychodzących, aby zezwolić na gniazdo nasłuchu" zgodnie z: http://docs.oracle.com/javase/6/docs/jre/api/ net/httpserver/spec/com/sun/net/httpserwer/HttpsServer.html – zpon