2011-01-07 3 views
7

저는 빌딩에서 빛과 난방을 제어하는 ​​프로젝트를 진행하고 있습니다. 백엔드 (Java로 작성)는 Mac Mini에서 실행되며 SOAP를 통해 액세스 할 수 있어야합니다.HTTPS에서 javax.xml.ws.Endpoint 사용

저는이 프로젝트의 복잡성을 최소한으로 유지하기 위해 모든 사람들이 응용 프로그램 서버를 설정하는 것을 원하지 않기 때문에이 프로젝트의 복잡성을 최소화하고 싶습니다. 그래서 지금까지 최대 난 javax.xml.ws.Endpoint 함께 일 :

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

endpoint.publish(uri); 

이 (? 이봐, 때 마지막 코드 불과 3 라인 작업 자바에서 뭔가를 보았는가) 놀라 울 정도로 잘 작동,하지만 지금 HTTP 대신 HTTPS를 사용하는 방법을 찾고 있습니다.

응용 프로그램 서버를 사용하지 않고이 작업을 수행 할 방법이 있습니까? 아니면이 연결을 보호하는 다른 방법이 있습니까?

인사말, 서버의 경우 마렉

답변

15

: 클라이언트에 대한

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

, 당신이 수행해야합니다 :

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

와우 - 감사합니다, 이건 정말 작품! 나는 거의 희망을 포기했다. ... – marekventur

+3

호스트 이름을 확인하지 않고 (이 'HostnameVerifier'를 통해 무엇이든 가능하게 함) 통신을 보호하는 중요한 단계를 제거하고 있습니다. 하지 마! – Bruno

+1

HttpsServer.create의 두 번째 인수는 "수신 소켓에서 대기 할 최대 대기열 수신 연결 수"입니다. http://docs.oracle.com/javase/6/docs/jre/api/ net/httpserver/spec/com/sun/net/httpserver/HttpsServer.html – zpon

관련 문제