Włączanie uwierzytelniania przy użyciu certyfikatu klienta dla usług Web Service

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

  1. 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>
  2. 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" />
  3. 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>  
  4. Skonfiguruj dostawcę usług.
    1. 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 {
      	...
      }
    2. 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.
      .
  5. 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.
    1. Skonfiguruj aplikację kliencką w pliku server.xml .
      <application id="TransportSecurityClient" name="TransportSecurityClient" 
      		location="TransportSecurityClient.war"
      		context-root="TransportSecurityClient" type="war" />
    2. 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>
      Uwaga:
      • Plik ibm-ws-bnd.xml musi znajdować się w katalogu /WEB-INF aplikacji WWW klienta.
      • Atrybut key-alias określa poprawny certyfikat klienta w magazynie kluczy klienta, który jest zdefiniowany w pliku server.xml . W tym przykładzie magazyn kluczy klienta jest zdefiniowany w następujący sposób:
        <keyStore id="clientKeyStore" location="clientKey.jks" type="JKS" password="passw0rd" />
      • Atrybut ssl-ref w pliku ibm-ws-bnd.xml musi być zgodny z poprawnym atrybutem id elementu ssl w pliku server.xml . W tym przykładzie element ssl jest zdefiniowany w następujący sposób:
        <ssl id="customizeSSLConfig" keyStoreRef="clientKeyStore" trustStoreRef="clientTrustStore" />
      • Wartość atrybutu key-alias może także przesłonić wartość atrybutu clientKeyAlias elementu ssl w pliku server.xml .
    3. 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
      {...}
    4. 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;