= Wstęp = jPALIO zostało zintegrowane z WebServices przy użyciu biblioteki [http://cxf.apache.org Apache CXF] = Konfiguracja = Za integrację jPALIO z WebServices odpowiedzialny jest serwlet palio.webservices.WebServicesServlet. Należy dodać do pliku web.xml dodatkowe wpisy dotyczące tego serwletu. webservices palio.webservices.WebServicesServlet webservices /webservices/* Każda instancja jPALIO może mieć zdefiniową dowolną liczbę, niezależnych usług. Usługi są definiowane w pliku konfiguracyjnym instancji. Najprostsza konfiguracja WebServices: ... * '''webServices/service/@class''' :Pełna nazwa klasy implementującej usługę Obsługiwane parametry: * enableMTOM - Włącza MTOM (Message Transmission Optimization Mechanism). MTOM umożliwia bardziej wydajne przesyłanie danych binarnych w żądaniach i odpowiedziach SOAP. Pełna konfiguracja usługi: true = Implementacja usługi = W pierwszej kolejności należy stworzyć interfejs usługi. Zadaniem tego intefejsu jest opisanie usługi (nazwa usługi, które metody metody mają zostać udostępnione, nazwy argumentów itd.). Opisywanie usługi wykonuje się za pomocą adnotacji. Pełny opis adnotacji znajduje się [https://jax-ws.dev.java.net/jax-ws-ea3/docs/annotations.html tutaj] Przykładowy interfejs usługi: package sample; import javax.jws.WebService; import javax.jws.WebParam; @WebService public interface TestService { public String getText(@WebParam(name="text") String text); } Kolejnym krokiem jest stworzenie klasy implementującej interfejs usługi. Nazwę tej klasy należy podać w konfiguracji usługi. Przykładowa implementacja interfejsu usługi: package sample; import javax.jws.WebService; @WebService(serviceName="TestService", endpointInterface="sample.WebService") public class TestServiceImpl implements TestService { public String getText(String text) { return "text: " + text } } Zarówno interfejs jak i klasa go implementująca może być zdefiniowany w obiektach jPALIO typu Groovy lub JAVA. Ważne jest to, że modyfikacja tych obiektów nie wymaga restartu jPALIO. W przypadku modyfikacji tych obiektów, jPALIO automatycznie przeładowuje usługi. Poprawność konfiguracji usługi można sprawdzić poprzez uruchomienie strony o podanym adresie: '''http://[host]:[port]/palio/webservices''' WSDL dla danej usługi generowany jest automatycznie. Dostępny jest pod adresem: '''http://[host]:[port]/palio/webservices/[nazwa instancji]/[nazwa usługi]?wsdl''' = Bezpieczeństwo = == Sprawdzanie znacznika czasu wiadomości == Timestamp 300 Timestamp 300 Szczegółowe opisy parametrów: *[http://ws.apache.org/wss4j/apidocs/org/apache/ws/security/handler/WSHandlerConstants.html#TTL_TIMESTAMP timeToLive] == Autoryzacja typu użytkownik/hasło == Przy autoryzacji użytkownik/hasło wykorzystywane są mechanizmy bezpieczeńśtwa jPALIO. Użytkownicy usługi to użytkownicy systemu (P_USERS). Dla danej usługi można przpisać przywileje, dla których ma być dostępna. UsernameToken admin basic test == Szyfrowanie == Encrypt serviceSecurity.properties skpass Encrypt serviceSecurity.properties clientkey serviceSecurity.properties
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
org.apache.ws.security.crypto.merlin.keystore.password=sspass
org.apache.ws.security.crypto.merlin.file=/home/tests/security/serviceKeystore.jks
Szczegółowe opisy parametrów: *[http://ws.apache.org/wss4j/apidocs/org/apache/ws/security/handler/WSHandlerConstants.html#ENCRYPTION_PARTS encryptionParts] == Podpisywanie == Signature serviceSecurity.properties Signature serviceSecurity.properties servicekey skpass serviceSecurity.properties
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
org.apache.ws.security.crypto.merlin.keystore.password=sspass
org.apache.ws.security.crypto.merlin.file=/home/tests/security/serviceKeystore.jks
Szczegółowe opisy parametrów: *[http://ws.apache.org/wss4j/apidocs/org/apache/ws/security/handler/WSHandlerConstants.html#SIGNATURE_PARTS signatureParts] == Łączenie mechanizmów bezpieczeństwa == W bardzo prosty sposób można połączyć mechanizmy bezpieczeństwa. Poniżej przedstawiona została konfiguracja realizująca deszyfrowanie, sprawdzanie podpisu oraz sprawdzanie znacznika czasu żądania oraz szyfrowanie, podpisywanie i umieszczanie znacznika czasu w odpowiedzi. Encrypt Signature Timestamp serviceSecurity.properties skpass serviceSecurity.properties Encrypt Signature Timestamp serviceSecurity.properties clientkey serviceSecurity.properties servicekey skpass == Generowanie testowych kluczy == Generowanie kluczy usługi i klienta:
keytool -genkey -alias servicekey -keyalg RSA -sigalg SHA1withRSA -keypass skpass -storepass sspass -keystore serviceKeystore.jks -dname "cn=localhost"
keytool -genkey -alias clientkey -keyalg RSA -sigalg SHA1withRSA -keypass ckpass -storepass cspass -keystore clientKeystore.jks -dname "cn=clientuser"
Dodanie klucza publicznego klienta do kluczy zaufanych usługi:
keytool -export -rfc -keystore clientKeystore.jks -storepass cspass -alias ClientKey -file Client.cer
keytool -import -trustcacerts -keystore serviceKeystore.jks -storepass sspass -alias ClientKey -file Client.cer -noprompt
Dodanie klucza publicznego usługi do kluczy zaufanych klienta:
keytool -export -rfc -keystore serviceKeystore.jks -storepass sspass -alias ServiceKey -file Service.cer
keytool -import -trustcacerts -keystore clientKeystore.jks -storepass cspass -alias ServiceKey -file Service.cer -noprompt