2011-01-07 36 views
7

Tôi đang làm việc trên một dự án để kiểm soát ánh sáng và sưởi ấm trong các tòa nhà. Phần cuối (viết bằng Java) sẽ chạy trên Mac Mini và có thể truy cập được thông qua SOAP.Sử dụng javax.xml.ws.Endpoint với HTTPS

Tôi muốn giữ sự phức tạp của dự án này ở mức tối thiểu vì tôi không muốn mọi người sử dụng nó phải thiết lập máy chủ ứng dụng. Vì vậy, cho đến bây giờ tôi làm việc với javax.xml.ws.Endpoint:

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

endpoint.publish(uri); 

này hoạt động cũng đáng ngạc nhiên (? Hey, khi nào bạn cuối cùng nhìn thấy một cái gì đó trong Java làm việc chỉ với 3 dòng mã), nhưng bây giờ tôi đang tìm cách sử dụng HTTPS thay vì HTTP.

Có cách nào để thực hiện việc này mà không cần sử dụng máy chủ ứng dụng hoặc có cách nào khác để bảo mật kết nối này không?

Greetings, Marek

Trả lời

15

Đối với máy chủ:

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

Đối với khách hàng, hãy chắc chắn bạn làm điều này:

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 - cảm ơn bạn, điều này thực sự làm việc! Tôi gần như đã từ bỏ hy vọng ... – marekventur

+3

Không xác minh tên máy (với 'HostnameVerifier' cho phép bất cứ điều gì thông qua) là loại bỏ một bước quan trọng để đảm bảo thông tin liên lạc. Đừng làm thế! – Bruno

+1

Xin lưu ý rằng đối số thứ hai trong HttpsServer.create là "số lượng kết nối đến hàng đợi tối đa cho phép trên ổ cắm nghe" theo: http://docs.oracle.com/javase/6/docs/jre/api/ net/httpserver/spec/com/sun/net/httpserver/HttpsServer.html – zpon

Các vấn đề liên quan