Activation de l'authentification par certificat client pour l'accès aux services Web

Vous pouvez configurer l'authentification par certificat client pour que vos applications client puissent accéder aux services Web.

Avant de commencer

Vous devez satisfaire les exigences suivantes pour pouvoir activer l'authentification par certificat client pour l'accès aux services Web :
  • Générez une paire de clés publique et privée autosignées pour le fournisseur.
    keytool -genkey -alias default -keystore serverKey.jks -dname "CN=myServer, O=IBM, C=CN" 
        -storepass passw0rd -keypass passw0rd -storetype jks  -validity 1000 -keyalg RSA
  • Exportez le certificat par défaut et importez-le dans le fichier de clés sécurisées.
    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
  • Générez deux paires de clés privée et publique autosignées pour le client.
    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
  • Exportez les certificats des deux alias et importez-les dans le fichier de clés certifiées.
    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
  • Copiez les fichiers serverKey.jks, serverTrust.jks, clientKey.jks et clientTrust.jks dans le répertoire ${server.config.dir}/resources/security.
Remarque : L'utilitaire keytool se trouve dans le répertoire d'installation Java™.

Pourquoi et quand exécuter cette tâche

Si vous devez utiliser l'application client de service Web avec l'authentification par certificat client pour accéder aux ressources de service Web protégées, le client doit fournir le certificat valide dans la demande et utiliser le protocole HTTPS pour communiquer avec le fournisseur de services.

Procédure

  1. Activez les fonctions jaxws-2.2, servlet-3.0(ou servlet-3.1) et appSecurity-2.0 dans le fichier server.xml.
    <featureManager>
      <feature>jaxws-2.2</feature>
      <feature>servlet-3.0</feature>
      <feature>appSecurity-2.0</feature>
    </featureManager>
  2. Configurez l'élément SSL et l'élément SSL personnalisé par le client dans le fichier 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. Configurez le domaine de connexion dans le fichier server.xml et liez le domaine au fournisseur de services.
    <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. Configurez le fournisseur de services.
    1. Créez des services Web.
      @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. Configurez le fichier ibm-ws-bnd.xml pour le fournisseur de services.
      <?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>
      Remarque :
      • Le fichier ibm-ws-bnd.xml doit se trouver dans le répertoire /WEB-INF d'une application Web ou dans le répertoire /META-INF d'une application de service Web reposant sur un EJB (archive JAR).
      • L'élément login-config du fichier ibm-ws-bnd.xml n'a d'effet que dans une application de service Web reposant sur un EJB (archive JAR). Dans le cas d'une application Web, l'élément login-config est ignoré et la valeur du même élément figurant dans le fichier web.xml est utilisée.
      .
  5. Configurez le client de service en spécifiant les noeuds finaux de services Web. Par exemple, l'application client est une application Web nommée TransportSecurityClient.war.
    1. Configurez l'application client dans le fichier server.xml.
      <application id="TransportSecurityClient" name="TransportSecurityClient" 
      		location="TransportSecurityClient.war"
      		context-root="TransportSecurityClient" type="war" />
    2. Configurez le fichier ibm-ws-bnd.xml pour l'application client.
      <?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>
      Remarque :
      • Le fichier ibm-ws-bnd.xml doit se trouver dans le répertoire /WEB-INF de l'application Web client.
      • L'attribut key-alias spécifie le certificat client valide dans le fichier de clés de certificat qui est défini dans le fichier server.xml. Dans cet exemple, le fichier de clés du client est défini comme suit :
        <keyStore id="clientKeyStore" location="clientKey.jks" type="JKS" password="passw0rd" />
      • L'attribut ssl-ref figurant dans le fichier ibm-ws-bnd.xml doit correspondre à l'attribut id de l'élément ssl figurant dans le fichier server.xml. Dans cet exemple, l'élément ssl est défini comme suit :
        <ssl id="customizeSSLConfig" keyStoreRef="clientKeyStore" trustStoreRef="clientTrustStore" />
      • La valeur de l'attribut key-alias peut aussi remplacer la valeur de l'attribut clientKeyAlias de l'élément ssl figurant dans le fichier server.xml.
    3. Générez les modules de remplacement client via l'emplacement 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. Utilisez l'annotation @WebServiceRef pour injecter le service Web dans le servlet, par exemple TestJaxWsTransportSecurityServlet.
      @WebServiceRef(name = "service/SayHelloPojoService")
      SayHelloPojoService pojoService;
      
      @WebServiceRef(name = "service/SayHelloStatelessService")
      SayHelloStatelessService statelessService;

Icône indiquant le type de rubrique Rubrique Tâche

Nom du fichier : twlp_sec_ws_clientcert.html