W celu uzyskania dostępu do usług WWW można skonfigurować uwierzytelnianie certyfikatów klienta dla aplikacji klienckich.
Zanim rozpoczniesz
Przed włączeniem uwierzytelniania przy użyciu certyfikatu klienta dla dostępu do usług Web Service należy spełnić następujące wymagania wstępne:
- Wygeneruj parę samopodpisanych kluczy publicznych i prywatnych dla dostawcy.
keytool -genkey -alias default -keystore serverKey.jks -dname "CN=myServer, O=IBM, C=CN"
-storepass passw0rd -keypass passw0rd -storetype jks -validity 1000 -keyalg RSA
- Wyeksportuj certyfikat domyślnego i zaimportuj certyfikat do magazynu zaufanych certyfikatów.
keytool -export -alias default -file myserver.cer -keystore serverKey.jks
-storepass passw0rd -storetype jks
keytool -import -file myserver.cer -alias default -keystore clientTrust.jks
-storepass passw0rd -keypass passw0rd -storetype jks
- Wygeneruj dwie pary samopodpisanej opinii publicznej i prywatnej dla klienta.
keytool -genkey -alias user0 -keystore clientKey.jks -dname "CN=employee0, O=IBM, C=CN"
-storepass passw0rd -keypass passw0rd -storetype jks -validity 1000 -keyalg RSA
keytool -genkey -alias admin0 -keystore clientKey.jks -dname "CN=manager0, O=IBM, C=CN"
-storepass passw0rd -keypass passw0rd -storetype jks -validity 1000 -keyalg RSA
- Wyeksportuj certyfikaty z dwóch aliasów i zaimportuj certyfikat do magazynu zaufanych certyfikatów.
keytool -export -alias user0 -file user0.cer -keystore clientKey.jks -storepass passw0rd -storetype jks
keytool -export -alias admin0 -file admin0.cer -keystore clientKey.jks -storepass passw0rd -storetype jks
keytool -import -file user0.cer -alias user0 -keystore serverTrust.jks -storepass passw0rd -keypass passw0rd -storetype jks
keytool -import -file admin0.cer -alias admin0 -keystore serverTrust.jks -storepass passw0rd -keypass passw0rd -storetype jks
- Skopiuj pliki serverKey.jks, serverTrust.jks, clientKey.jksi clientTrust.jks do katalogu ${server.config.dir}/resources/security .
Uwaga: Program narzędziowy keytool można znaleźć w katalogu instalacyjnym środowiska Java™ .
Informacje o tej czynności
Jeśli do uzyskania dostępu do chronionych zasobów usługi Web Service wymagane jest użycie aplikacji klienckiej usługi Web Service z uwierzytelnianiem za pomocą certyfikatu klienta, klient musi podać poprawny certyfikat w żądaniu i musi używać protokołu HTTPS do komunikacji z dostawcą usług.
Procedura
- Włącz funkcje
jaxws-2.2, servlet-3.0(lub servlet-3.1) i appSecurity-2.0 w pliku server.xml .
<featureManager>
<feature>jaxws-2.2</feature>
<feature>servlet-3.0</feature>
<feature>appSecurity-2.0</feature>
</featureManager>
- Skonfiguruj element SSL i niestandardowy element SSL klienta w pliku server.xml .
<!-- Server SSL configuration -->
<ssl id="defaultSSLConfig" keyStoreRef="serverKeyStore" trustStoreRef="serverTrustStore"
clientAuthenticationSupported="true"/>
<keyStore id="serverKeyStore" location="serverKey.jks" type="JKS" password="passw0rd" />
<keyStore id="serverTrustStore" location="serverTrust.jks" type="JKS" password="passw0rd" />
<!-- customize SSL configuration -->
<ssl id="customizeSSLConfig" keyStoreRef="clientKeyStore" trustStoreRef="clientTrustStore" />
<keyStore id="clientKeyStore" location="clientKey.jks" type="JKS" password="passw0rd" />
<keyStore id="clientTrustStore" location="clientTrust.jks" type="JKS" password="passw0rd" />
- Skonfiguruj dziedzinę logowania w pliku server.xml i powiążaj tę dziedzinę z dostawcą usług.
<application id="TransportSecurityProvider" name="TransportSecurityProvider"
location="TransportSecurityProvider.war" type="ear">
<application-bnd>
<security-role name="Employee">
<user name="employee0" />
<group name="employeeGroup" />
</security-role>
<security-role name="Manager">
<user name="manager0" />
</security-role>
<security-role name="AllAuthenticated">
<special-subject type="ALL_AUTHENTICATED_USERS" />
</security-role>
</application-bnd>
</application>
<basicRegistry id="basic" realm="BasicRealm">
<user name="employee0" password="emp0pwd" />
<user name="employee1" password="emp1pwd" />
<user name="manager0" password="mgr0pwd" />
<group name="employeeGroup">
<member name="employee0" />
<member name="employee1" />
</group>
</basicRegistry>
- Skonfiguruj dostawcę usług.
- Utwórz usługi Web Service.
@WebService(serviceName = "SayHelloPojoService",
portName = "SayHelloPojoPort")
public class SayHelloPojoService implements SayHelloService {
...
}
@WebService(serviceName = "SayHelloStatelessService",
portName = "SayHelloStatelessPort",
endpointInterface = "com.ibm.ws.jaxws.transport.server.security.SayHelloService")
@Stateless(name = "SayHelloSessionBean")
public class SayHelloStatelessService implements SayHelloLocal {
...
}
- Skonfiguruj plik ibm-ws-bnd.xml dla dostawcy usług.
<?xml version="1.0" encoding="UTF-8"?>
<webservices-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-ws-bnd_1_0.xsd"
version="1.0">
<http-publishing>
<webservice-security>
<security-constraint>
<web-resource-collection>
<web-resource-name>Only Managers</web-resource-name>
<url-pattern>/manager/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint id="AuthConstraint_manager">
<role-name>Manager</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Employees</web-resource-name>
<url-pattern>/employee/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint id="AuthConstraint_employee">
<role-name>Employee</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<!-- SECURITY ROLES -->
<security-role id="Staff">
<role-name>Employee</role-name>
<role-name>Manager</role-name>
</security-role>
<!-- AUTHENTICATION METHOD: client-cert authentication -->
<!-- login configuration -->
<login-config id="LoginConfig">
<auth-method>CLIENT-CERT</auth-method>
<realm-name>Authentication</realm-name>
</login-config>
</webservice-security>
</http-publishing>
</webservices-bnd>
Uwaga:
- Plik ibm-ws-bnd.xml musi znajdować się w katalogu /WEB-INF aplikacji WWW lub w katalogu /META-INF aplikacji usługi Web Service opartej na komponencie EJB (archiwum JAR).
- Element
login-config w pliku ibm-ws-bnd.xml jest używany tylko w aplikacji usługi Web Service opartej na komponencie EJB (archiwum JAR). W przypadku aplikacji WWW element login-config jest ignorowany, a wartość tego samego elementu w pliku web.xml jest używana.
.
- Skonfiguruj klienta usługi, określając punkty końcowe usługi Web Service. Na przykład aplikacja kliencka jest aplikacją WWW o nazwie TransportSecurityClient.war.
- Skonfiguruj aplikację kliencką w pliku server.xml .
<application id="TransportSecurityClient" name="TransportSecurityClient"
location="TransportSecurityClient.war"
context-root="TransportSecurityClient" type="war" />
- Skonfiguruj plikibm-ws-bnd.xml dla aplikacji klienckiej.
<?xml version="1.0" encoding="UTF-8"?>
<webservices-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-ws-bnd_1_0.xsd"
version="1.0">
<!-- POJO service reference binding-->
<service-ref name="service/SayHelloPojoService">
<port name="SayHelloPojoPort"
namespace="http://ibm.com/ws/jaxws/transport/security/"
ssl-ref="customizeSSLConfig"
key-alias="user0"/>
<properties http.conduit.tlsClientParameters.disableCNCheck="true" />
</service-ref>
<!-- Stateless service reference binding-->
<service-ref name="service/SayHelloStatelessService">
<port name="SayHelloStatelessPort"
namespace="http://ibm.com/ws/jaxws/transport/security/"
ssl-ref="customizeSSLConfig"
key-alias="user0"/>
<properties http.conduit.tlsClientParameters.disableCNCheck="true" />
</service-ref>
</webservices-bnd>
- Wygeneruj kody pośredniczące klienta przy użyciu położenia pliku WSDL.
@WebServiceClient(name = "SayHelloPojoService",
targetNamespace = "http://ibm.com/ws/jaxws/transport/security/",
wsdlLocation = "https://localhost:8020/TransportSecurityProvider/unauthorized/employPojoService?wsdl")
public class SayHelloPojoService
extends Service
{...}
@WebServiceClient(name = "SayHelloStatelessService",
targetNamespace = "http://ibm.com/ws/jaxws/transport/security/",
wsdlLocation = "https://localhost:8020/TransportSecurityProvider/unauthorized/EmployStatelessService?wsdl")
public class SayHelloStatelessService
extends Service
{...}
- Użyj adnotacji
@WebServiceRef , aby wprowadzić usługę Web Service do serwletu. Na przykład TestJaxWsTransportSecurityServlet.
@WebServiceRef(name = "service/SayHelloPojoService")
SayHelloPojoService pojoService;
@WebServiceRef(name = "service/SayHelloStatelessService")
SayHelloStatelessService statelessService;