Проблема с защитой веб-службы Tomcat / Axis2 через SSL - PullRequest
1 голос
/ 06 ноября 2011

Я успешно создал работающий веб-сервис, клиент и .jsp-управляемый интерфейс. Я сделал это с Eclipse, Axis2, Tomcat 7 и Java 7.

Основной поток состоит в том, что пользователь посещает .jsp и отправляет форму с входными данными. JSP пересылает объект «запрос» клиенту Java. Клиент Java использует веб-сервис и отправляет пользовательский ввод. Служба подключается к базе данных SQL Server через JDBC для получения информации, которая отображается обратно пользователю.

Все это прекрасно работает по HTTP, но теперь я хочу защитить процесс, и именно здесь я сталкиваюсь с проблемами. Я могу создать сертификат и заставить его использовать Tomcat. Я могу подключиться к веб-интерфейсу через HTTPS, отправить форму и получить данные обратно очень хорошо. Проблема в том, что это только защита интерфейса. Код клиента веб-службы все еще подключается к службе через HTTP в фоновом режиме.

Согласно этой странице , все, что мне действительно нужно сделать, чтобы включить службу для подключений через SSL, - это обновить файл axis2.xml и включить новый узел transportReceiver для HTTPS. Я сделал это и восстановил свой клиентский код для использования защищенной конечной точки. Это не работает.

Я настроил Tomcat на прослушивание портов 8081 для http и 8443 для https. Но после изменения axis2.xml и запуска Tomcat я получаю следующее:

[INFO] Прослушивание через порт 8443 [ERROR] Завершение соединения слушатель org.apache.axis2.transport.http.server.DefaultConnectionListener@16d60567 после 10 попыток за 0 секунд. java.net.BindException: адрес уже используется: JVM_Bind на java.net.DualStackPlainSocketImpl.bind0 (Native Метод) в java.net.DualStackPlainSocketImpl.socketBind (Неизвестно Источник) в java.net.AbstractPlainSocketImpl.bind (Неизвестный источник) в java.net.PlainSocketImpl.bind (неизвестный источник) в java.net.ServerSocket.bind (неизвестный источник) в java.net.ServerSocket. (Неизвестный источник) в java.net.ServerSocket. (Неизвестный источник) в org.apache.axis2.transport.http.server.DefaultConnectionListener.run (DefaultConnectionListener.java:80) в java.util.concurrent.ThreadPoolExecutor.runWorker (Неизвестный источник) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (неизвестный источник) at java.lang.Thread.run (неизвестный источник)

Я попытался изменить номер порта в axis2.xml (например, на 8445), и это работает. Сервер может запускаться без ошибок, но в конечном итоге появляются те же самые ошибки. Например, когда я получаю WSDL, я вижу ошибку через консоль (хотя WSDL действительно появляется). Кроме того, если я пытаюсь использовать службу на порте 8445, я получаю следующую ошибку:

org.apache.axis2.AxisFault: Соединение было отключено: javax.net.ssl.SSLException: нераспознанное сообщение SSL, открытый текст подключение

Я могу только предположить, что это потому, что Tomcat настроен для обработки HTTPS на 8443, а не 8445, но я, честно говоря, не знаю.

Если я оставляю порт как 8443 и игнорирую ошибки при запуске, я получаю следующее сообщение при подключении к услуге:

org.apache.axis2.AxisFault: Соединение было отключено: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: не удалось построить путь PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный путь сертификации к запрошенной цели

Я выполнил эти шаги , чтобы попытаться заставить его распознать мой сертификат, но при импорте в мое хранилище ключей JRE7 я получаю следующее:

ошибка keytool: java.lang.Exception: ответ сертификата и сертификат в хранилище ключей идентичны

По сути, этот сертификат уже существует. Это имеет смысл, потому что это тот, который Tomcat уже успешно использует.

Итак, я довольно невежественен на данный момент.Я действительно не уверен, что я должен делать.Любое общее руководство или ссылка на пошаговое руководство было бы очень полезно.

Но для конкретного вопроса ... Что именно я делаю, когда устанавливаю узлы transportReceiver вaxis2.xml?Я говорю, на каких портах работает Tomcat и что он должен использовать, или у Axis2 есть собственные серверы, которые будут запускаться на этих портах?Кажется, это последнее, но это не имеет большого смысла для меня.

Ответы [ 3 ]

2 голосов
/ 06 ноября 2011

Правильный способ настройки транспорта сервлета описан в документации Axis2 .Симптомы, которые вы описываете, предполагают, что у вас есть transportReceiver, который ссылается на org.apache.axis2.transport.http.SimpleHTTPServer.Также убедитесь, что вы используете последнюю версию Axis2 (1.5.6 или 1.6.1).

0 голосов
/ 03 сентября 2012

Один из способов подключения к HTTPS - использовать jax-ws

E:\WSDL>wsimport -keep -p com.mypack.webservice https://domain:port/ws/MyService?wsdl

. Это создаст структуру пакета в папке wsdl.Используйте его.

Теперь все, что вам нужно сделать, это поместить хранилище доверенных сертификатов в run.bat или использовать класс System для установки свойства.

Это будет работать нормально.

0 голосов
/ 06 ноября 2011

См. Ответ Андреаса на проблему с портом. Что касается выдачи сертификата, то это было недоразумение с моей стороны по поводу различия между хранилищем ключей и хранилищем доверенных сертификатов. По умолчанию JVM использует JAVA_HOME \ lib \ security \ cacerts в качестве хранилища доверия, а не файл USER_HOME \ .keystore. Как только я импортировал свой сертификат туда, ошибки исчезли.

Мне также удалось разрешить проблемы с сертификатом, установив в качестве хранилища доверия файл хранилища ключей с помощью кода. Я сделал это до импорта сертификата в хранилище cacerts. Идет в коде клиента, прямо перед вызовом сервиса:

System.setProperty("javax.net.ssl.trustStore","C:\\path\\to\\.keystore");
System.setProperty("javax.net.ssl.trustStorePassword","password");
...