2011-01-07 140 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); 

这工作得非常好(?哎,你什么时候看到最后在Java中的东西只有3行代码的工作),但现在我正在寻找一种使用HTTPS而不是HTTP的方式。

有没有办法做到这一点,而不使用应用程序服务器或有另一种方法来保护此连接?

问候, 马立克

回答

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 2011-01-21 23:13:29

相关问题