обновление, я получил это работает. когда cxf находится на пути к классам, это не работает из-за изменений в java spi

отаю над проектом по управлению освещением и отоплением в зданиях. Бэкэнд (написанный на 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.

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

Привет, Марек

Ответы на вопрос(1)

Решение Вопроса

Для сервера:

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;
   }
});
 spy08 мар. 2019 г., 00:28
переменная 'uri' должна быть чем-то вроде '/ contextPath / или' / '. К сожалению, это не сработало для меня. Сообщение об ошибке не было найдено обработчик для контекста. На jre8
 spy08 мар. 2019 г., 13:00
обновление, я получил это работает. когда cxf находится на пути к классам, это не работает из-за изменений в java spi
 marekventur22 янв. 2011 г., 00:13
Вау - спасибо, это действительно работает! Я почти потерял надежду ...
 zpon29 февр. 2012 г., 17:01
Обратите внимание, что второй аргумент в HttpsServer.create - это «максимальное количество входящих соединений в очереди, разрешенное для сокета прослушивания» в соответствии с:docs.oracle.com/javase/6/docs/jre/api/net/httpserver/spec/com/...
 Bruno13 янв. 2012 г., 23:10
Не проверять имя хоста (с этимHostnameVerifier который пропускает все, что угодно) удаляет важный шаг для обеспечения безопасности общения. Не делай этого!

Ваш ответ на вопрос