2011-11-05 2 views
1

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

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

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

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

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

[INFO] Listening on port 8443 [ERROR] Terminating connection listener org.apache.axis2.transport.http.server.DefaultConnect[email protected] after 10retries in 0 seconds. java.net.BindException: Address already in use: JVM_Bind at java.net.DualStackPlainSocketImpl.bind0(Native Method) at java.net.DualStackPlainSocketImpl.socketBind(Unknown Source) at java.net.AbstractPlainSocketImpl.bind(Unknown Source) at java.net.PlainSocketImpl.bind(Unknown Source) at java.net.ServerSocket.bind(Unknown Source) at java.net.ServerSocket.(Unknown Source) at java.net.ServerSocket.(Unknown Source) at org.apache.axis2.transport.http.server.DefaultConnectionListener.run(DefaultConnectionListener.java:80) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

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

org.apache.axis2.AxisFault: Connection has been shutdown: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

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

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

org.apache.axis2.AxisFault: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

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

keytool error: java.lang.Exception: Certificate reply and certificate in keystore are identical

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

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

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

ответ

2

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

+0

Да, это было! Я изменил записи transportReceiver для использования AxisServletListener и решил проблемы с портом. Благодаря! –

0

См. Ответ Андреаса на вопрос о порте. Что касается проблемы с сертификатом, это было непонимание с моей стороны в отношении различия между хранилищем ключей и доверительным магазином. 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"); 
0

один из способов подключения к HTTPS использует JAX-WS

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

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

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

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

Смежные вопросы