Использование javax.xml.ws.Endpoint с HTTPS - PullRequest
9 голосов
/ 07 января 2011

Я работаю над проектом по управлению освещением и отоплением в зданиях. Бэкэнд (написанный на Java) будет работать на Mac Mini и должен быть доступен через SOAP.

Я хочу свести к минимуму сложность этого проекта, потому что я не хочу, чтобы все, кто его использует, настраивали сервер приложений. До сих пор я работал с 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.

Есть ли способ сделать это без использования сервера приложений или есть другой способ защитить это соединение?

Привет, Marek

1 Ответ

16 голосов
/ 19 января 2011

Для сервера:

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;
   }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...