Clientzertifikatsauthentifizierung für Web-Service-Zugriff festlegen

Sie können die Clientzertifikatsauthentifizierung konfigurieren, damit Ihre Clientanwendungen auf Web-Services zugreifen können.

Vorbereitende Schritte

Bevor Sie die Clientzertifikatsauthentifizierung für den Zugriff auf Web-Services festlegen, müssen die folgenden Voraussetzungen erfüllt werden:
  • Generieren Sie ein Paar selbst signierter öffentlicher und privater Schlüssel für den Provider.
    keytool -genkey -alias default -keystore serverKey.jks -dname "CN=myServer, O=IBM, C=CN"     -storepass passw0rd -keypass passw0rd -storetype jks  -validity 1000 -keyalg RSA
  • Exportieren das Zertifikat des Standards und importieren Sie das Zertifikat in den Truststore.
    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
  • Generieren Sie zwei Paar selbst signierte öffentliche und private Schlüssel für den 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
  • Exportieren Sie das Zertifikat der beiden Aliasse und importieren Sie das Zertifikat in den Truststore.
    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
  • Kopieren Sie die Dateien serverKey.jks, serverTrust.jks, clientKey.jks und clientTrust.jks in das Verzeichnis ${server.config.dir}/resources/security.
Anmerkung: Das Dienstprogramm keytool befindet sich in Ihrem Java™-Installationsverzeichnis.

Informationen zu diesem Vorgang

Wenn Sie für den Zugriff auf die gesicherten Web-Service-Ressourcen die Web-Service-Clientanwendung mit der Clientzertifikatsauthentifizierung verwenden müssen, muss der Client das gültige Zertifikat in der Anforderung bereitstellen und er muss für die Kommunikation mit dem Service-Provider HTTPS verwenden.

Vorgehensweise

  1. Aktivieren Sie die Features jaxws-2.2, servlet-3.0 (oder servlet-3.1) und appSecurity-2.0 in der Datei server.xml.
    <featureManager>
      <feature>jaxws-2.2</feature>
      <feature>servlet-3.0</feature>
      <feature>appSecurity-2.0</feature>
    </featureManager>
  2. Konfigurieren Sie das SSL-Element und das für den Client angepasste SSL-Element in der Datei server.xml.
    <!-- SSL-Serverkonfiguratino -->
    <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" /> 
    
    <!-- SSL-Konfiguration anpassen -->
    <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. Konfigurieren Sie den Anmelderealm in der Datei server.xml und binden Sie den Realm an den Service-Provider.
    <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. Konfigurieren Sie den Service-Provider.
    1. Erstellen Sie Web-Services.
      @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. Konfigurieren Sie die Datei ibm-ws-bnd.xml für den Service-Provider.
      <?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>
      			<!-- Sicherheitsrollen -->
      			<security-role id="Staff">
      				<role-name>Employee</role-name>
      				<role-name>Manager</role-name>
      			</security-role>
      			<!-- Authentifizierungsmethode: Clientzertifikatsauthentifizierung -->
      			<!-- Anmeldekonfiguration -->
      			<login-config id="LoginConfig">
      				<auth-method>CLIENT-CERT</auth-method>
      				<realm-name>Authentication</realm-name>
      			</login-config>                   
      		</webservice-security>
      	</http-publishing>
      </webservices-bnd>
      Anmerkung:
      • Die Datei ibm-ws-bnd.xml muss im Verzeichnis /WEB-INF einer Webanwendung oder im Verzeichnis /META-INF einer EJB-basierten Web-Service-Anwendung (JAR-Archiv) enthalten sein.
      • Das Element login-config in der Datei ibm-ws-bnd.xml ist nur in einer EJB-basierten Web-Service-Anwendung (JAR-Archiv) wirksam. Für Webanwendungen wird das Element login-config ignoriert und der Wert des entsprechenden Elements in der Datei web.xml verwendet.
      .
  5. Konfigurieren Sie den Service-Client, indem Sie die Web-Service-Endpunkte angeben. Beispielsweise ist die Clientanwendung eine Webanwendung mit dem Namen TransportSecurityClient.war.
    1. Konfigurieren Sie die Clientanwendung in der Datei server.xml.
      <application id="TransportSecurityClient" name="TransportSecurityClient" 
      				location="TransportSecurityClient.war"
      		context-root="TransportSecurityClient" type="war" />
    2. Konfigurieren Sie die Datei ibm-ws-bnd.xml für die Clientanwendung.
      <?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-Servicereferenzbindung -->
      	<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>
      	<!-- Statusunabhängige Servicereferenzbindung -->
      	<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>
      Anmerkung:
      • Die Datei ibm-ws-bnd.xml muss sich im Verzeichnis /WEB-INF der Client-Web-Anwendung befinden.
      • Das Attribut key-alias gibt das gültige Clientzertifikat im Client-Keystore an, das in in der Datei server.xml definiert ist. In diesem Beispiel ist der Client-Keystore wie folgt definiert:
        <keyStore id="clientKeyStore" location="clientKey.jks" type="JKS" password="passw0rd" />
      • Das Attribut ssl-ref in der Datei ibm-ws-bnd.xml muss mit dem richtigen Attribut id im Element ssl in der Datei server.xml übereinstimmen. In diesem Beispiel ist das Element ssl wie folgt definiert:
        <ssl id="customizeSSLConfig" keyStoreRef="clientKeyStore" trustStoreRef="clientTrustStore" />
      • Der Wert des Attributs key-alias kann außerdem den Wert des Attributs clientKeyAlias im Element ssl der Datei server.xml überschreiben.
    3. Generieren Sie die Client-Stubs über die WSDL-Position.
      @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. Verwenden Sie die Annotation @WebServiceRef, um den Web-Service in das Servlet einzufügen. Beispiel: TestJaxWsTransportSecurityServlet.
      @WebServiceRef(name = "service/SayHelloPojoService")
      SayHelloPojoService pojoService;
      
      @WebServiceRef(name = "service/SayHelloStatelessService")
      SayHelloStatelessService statelessService;

Symbol das den Typ des Artikels anzeigt. Taskartikel

Dateiname: twlp_sec_ws_clientcert.html