Bezpieczeństwo

Sprawdzanie znacznika czasu wiadomości

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:

 

Autoryzacja typu użytkownik/hasło

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>

 

Szyfrowanie

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.

 

Podpisywanie

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.

 

Łą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.

 

<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 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