Przykładowa konfiguracja usługi sieciowej:
<service class="devel.webservices.TestServiceImpl">
<security>
<!-- sprawdzanie ważności znacznika czasu żądań -->
<in>
<param name="action">Timestamp</param>
<param name="timeToLive">300</param>
</in>
<!-- ustawienie znacznika czasu w odpowiedzi -->
<out>
<param name="action">Timestamp</param>
<param name="timeToLive">300</param>
</out>
</security>
</service>
Uwagi do przykładu:
Przy autoryzacji użytkownik/hasło wykorzystywane są mechanizmy bezpieczeństwa jPALIO. W domyślnej konfiguracji użytkownicy usługi to użytkownicy systemu (P_USERS). Dla danej usługi można przypisać przywileje, dla których ma być dostępna.
Przykładowa konfiguracja usługi sieciowej:
<service class="devel.webservices.TestServiceImpl">
<security>
<!-- autoryzacja żądań -->
<in>
<param name="action">UsernameToken</param>
<param name="privs">admin basic test</param>
</in>
</security>
</service>
Uwagi do przykładu:
Istnieje możliwość skonfigurowania własnego mechanizmu autoryzacji żądań. Aby tego dokonać należy w konfiguracji usługi dodać dodatkowy parametr o nazwie authorizationHandlerClass. Jako wartość należy podać pełną nazwę klasy odpowiedzialną za implementację własnego mechanizmu. Klasa ta musi dziedziczyć po klasie palio.webservices.security.UserAuthorizationHandler. jPALIO posiada wbudowane następujące implementacje tej klasy:
palio.webservices.security.PalioUserAuthorizationHandler | Autoryzacja i uwierzytelnianie na podstawie wbudowanych mechanizmów w jPALIO (P_USERS) |
palio.webservices.security.ServerAdminAuthorizationHandler | Uwierzytelnianie na podstawie loginu i hasła administratora serwera jPALIO. |
Domyślną implementacją jest palio.webservices.security.PalioUserAuthorizationHandler
Przykładowa konfiguracja z nadpisanym domyślnym mechanizmem autoryzacji:
<service class="devel.webservices.TestServiceImpl">
<security>
<in>
<param name="action">UsernameToken</param>
<param name="authorizationHandlerClass">palio.webservices.security.ServerAdminAuthorizationHandler</param>
</in>
</security>
</service>
Przykładowa konfiguracja usługi sieciowej:
<service class="devel.webservices.TestServiceImpl">
<security>
<!-- deszyfrowanie żądań -->
<in>
<param name="action">Encrypt</param>
<!-- Względna ścieżka do pliku z parametrami dotyczącymi deszyfrowania -->
<param name="decryptionPropFile">serviceSecurity.properties</param>
<!-- Hasło do klucza prywatnego -->
<param name="privateKeyPassword">skpass</param>
<!-- Określa które części wiadomości zostały zaszyfrowane -->
<param name="encryptionParts"></param>
</in>
<!-- szyfrowanie odpowiedzi -->
<out>
<param name="action">Encrypt</param>
<!-- Względna ścieżka do pliku z parametrami dotyczącymi szyfrowania -->
<param name="encryptionPropFile">serviceSecurity.properties</param>
<!-- Alias klucza publicznego jakim mają być szyfrowane wiadomości -->
<param name="encryptionUser">clientkey</param>
<!-- Określa które części wiadomości mają zostać zaszyfrowane -->
<param name="encryptionParts"></param>
</out>
</security>
</service>
Przykładowy plik 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ółowy opis parametrów znaleźć można tutaj.
Przykładowa konfiguracja usługi sieciowej:
<service class="devel.webservices.TestServiceImpl">
<security>
<!-- weryfikacja podpisu żądań -->
<in>
<param name="action">Signature</param>
<!-- Względna ścieżka do pliku z parametrami dotyczącymi podpisywania -->
<param name="signaturePropFile">serviceSecurity.properties</param>
<!-- Określa które części wiadomości zostały podpisane -->
<param name="signatureParts"></param>
</in>
<!-- podpisywanie odpowiedzi -->
<out>
<param name="action">Signature</param>
<!-- Względna ścieżka do pliku z parametrami dotyczącymi podpisywania -->
<param name="signaturePropFile">serviceSecurity.properties</param>
<!-- Alias klucza, który ma zostać użyty do podpisywania -->
<param name="user">servicekey</param>
<!-- Hasło do klucza prywatnego -->
<param name="privateKeyPassword">skpass</param>
<!-- Określa które części wiadomości mają zostać podpisane -->
<param name="signatureParts"></param>
</out>
</security>
</service>
Przykładowy plik 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ółowy opis parametrów znaleźć można tutaj.
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.
<service class="devel.webservices.TestServiceImpl">
<security>
<in>
<param name="action">Encrypt Signature Timestamp</param>
<param name="decryptionPropFile">serviceSecurity.properties</param>
<param name="privateKeyPassword">skpass</param>
<param name="signaturePropFile">serviceSecurity.properties</param>
</in>
<out>
<param name="action">Encrypt Signature Timestamp</param>
<param name="encryptionPropFile">serviceSecurity.properties</param>
<param name="encryptionUser">clientkey</param>
<param name="signaturePropFile">serviceSecurity.properties</param>
<param name="user">servicekey</param>
<param name="privateKeyPassword">skpass</param>
</out>
</security>
</service>
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