Einführung

Adobe® LiveCycle® Enterprise Suite 4 (ES4) unterstützt die gegenseitige Authentifizierung, um sich bei den LiveCycle-Servern anzumelden. Folgende Anwendungen werden unterstützt:

  • Alle LC-Benutzeroberflächen, außer WorkBench
  • Adobe Acrobat und Adobe Reader
  • Microsoft Office

Bei der Authentifizierung mit CAC (Common Access Cards) können die eingebetteten Zertifikate wie Zertifikate im Microsoft® Windows® Certificate Store verwendet werden. Wenn die gegenseitige Authentifizierung erfolgt und das Zertifikat in CAC ausgewählt ist, wird der Client authentifiziert.

LiveCycle-Unterstützung für die gegenseitige Authentifizierung

Unterstützung für gegenseitige Authentifizierung in LiveCycle ist verfügbar für:

  • Öffnen von richtliniengeschützten Dokumenten mit Adobe Reader oder Adobe Acrobat.
  • LiveCycle Web-Benutzeroberflächen. Alle Endbenutzeroberflächen und Administrator-Benutzeroberflächen werden unterstützt.
  • Authentifizierung über SharePoint-Connector. Der LiveCycle SharePoint-Connector Web kann für die Authentifizierung über ein Systembenutzerzertifikat anstelle eines vorkonfigurierten Benutzernamens und Kennworts konfiguriert werden.
  • Indizierung von durch Rights Management geschützte Dokumente in LiveCycle iFilter.
  • Rights Management-Erweiterungen für Microsoft® Office®.

Hinweis:

Gegenseitige Authentifizierung wird nicht unterstützt für:

  • LiveCycle Java-Client SDK
  • LiveCycle Workbench

Konfiguration

Anwendungsserverkonfiguration

Die Aktivierung der gegenseitigen Authentifizierung hängt vom verwendeten Anwendungsserver ab.

Befolgen Sie die anwendungsserverspezifischen Richtlinien, um die beidseitige gegenseitige Authentifizierung zu aktivieren.

LiveCycle Server-Konfiguration

Um die gegenseitige Authentifizierung auf dem LiveCycle-Server zu aktivieren, muss ein benutzerdefinierter UM-AuthProvider-SPI implementiert und mit einer LiveCycle-Domäne konfiguriert werden.

Weitere Informationen zum Erstellen von Authentifizierungsanbietern finden Sie unter Erstellen von Authentifizierungsanbietern.

Im Folgenden finden Sie ein Beispiel für den Authentifizierungsanbieter-SPI zum Aktivieren der gegenseitigen Authentifizierung:

package com.adobe.livecycle.usermanager.sslauthprovider;

import com.adobe.idp.um.spi.authentication.*;
import com.adobe.logging.AdobeLogger;
 
import javax.naming.InvalidNameException;
import javax.naming.ldap.LdapName;
import javax.naming.ldap.Rdn;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import javax.security.auth.x500.X500Principal;
import javax.servlet.http.HttpServletRequest;
import java.security.cert.X509Certificate;
import java.util.*;
import org.apache.commons.codec.binary.Base64;
 
public class SSLMutualAuthProvider implements AuthProvider{
    private static AdobeLogger logger = AdobeLogger.getAdobeLogger(SSLMutualAuthProvider.class);
 
    public AuthResponse authenticate(Map credentials, List passedAuthConfigs) {
 
        ...
        //Extract the client certificate from the request
        X509Certificate[] certs = extractCertificate(request);
        if(certs == null || certs.length == 0){
            return null;
        }
 
        AuthResponse ar = new AuthResponseImpl();
    ar.setAuthStatus(AuthResponse.AUTH_SUCCESS);
        ar.setDomain(authConfigs.get(0).getDomainName()); //Assuming config is single domain and using its domainName
 
        Map<String,String> oidMap = new HashMap<String, String>();
        String name = certs[0].getSubjectX500Principal().getName();
        logger.info("Got Subject DN as "+name);
        LdapName ldapName = null;
        try{
            ldapName = new LdapName(name);
        }catch(InvalidNameException e){
            throw new RuntimeException(e);
        }
 
    //In this sample the CN of the Subject Name maps to user's loginid, however this can be changed to meet your requirements.
        for(Rdn rdn : ldapName.getRdns()){
            String type = rdn.getType();
            if("CN".equals(type)){
                String cn = (String) rdn.getValue();
                ar.setUsername(cn);
                return ar;
            }
        }
        return null;
    }
 
   private X509Certificate[] extractCertificate(HttpServletRequest request) {
        X509Certificate[] certs =  (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
        if(certs != null){
            logger.debug("No certificate found in the HTTP Header javax.servlet.request.X509Certificate");
            return certs;
        }
 
        //Check for certificate value passed in HTTP header which is the case with proxy
        String certDataInPemFormat = request.getHeader("SSL_CLIENT_CERT");
        if(certDataInPemFormat == null){
            logger.debug("No certificate found in the HTTP Header SSL_CLIENT_CERT ");
            return null;
        }
        String PREFIX = "-----BEGIN CERTIFICATE----- ";
        String SUFFIX = " -----END CERTIFICATE-----";
        int dataLength =  certDataInPemFormat.length();
        String encodedData = certDataInPemFormat.substring(PREFIX.length(), dataLength - SUFFIX.length() - 1);
 
        Certificate c = null;
        try {
            byte[] certData = Base64.decodeBase64(encodedData.getBytes("utf-8"));
            //Certificate factory would take care of removing the prefixes and suffixes
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            c = cf.generateCertificate(new ByteArrayInputStream(certData));
        } catch (CertificateException e) {
            throw new RuntimeException(e);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        return new X509Certificate[]{(X509Certificate) c};
    }
 
}

Dieser Authentifizierungsanbieter muss in einer Hybriddomäne in LiveCycle enthalten sein. Benutzer aus dieser Domäne wären dann für Gegenseitige Authentifizierung aktiviert.

Gehen Sie nach dem Erstellen des Authentifizierungsanbieter-SPI folgendermaßen vor, um die Bereitstellung und Konfiguration im LiveCycle-Server durchzuführen:

  1. Stellen Sie den Authentifizierungsanbieter-SPI mithilfe von Workbench bereit und starten Sie ihn.

  2. Gehen Sie zu Startseite > Einstellungen > Benutzerverwaltung > Domänenverwaltung.

  3. Klicken Sie auf Neue Hybriddomäne.

  4. Fügen Sie eine Authentifizierungsfunktion hinzu.

    Wählen Sie Benutzerdefiniert aus der Liste Authentifizierungsanbieter.

  5. Wählen Sie den Namen des SPI aus, der im vorgenannten Schritt 1 oben auf der Liste der benutzerdefinierten SPI gezeigt und bereitgestellt wird.

  6. Klicken Sie auf Speichern.

Gehen Sie zum Konfigurieren von Rights Management wie folgt vor:

  1. Gehen Sie in Admin-Benutzeroberfläche zu: Services > Rights Management > Konfiguration.

  2. Überprüfen und bestätigen Sie, dass die Basis-URL mit dem Serverzertifikat übereinstimmt.

  3. Aktivieren Sie die erweiterte Authentifizierung.

    Hinweis:

    Die erweiterte Authentifizierung gilt nicht für die Rights Management-Erweiterung für Microsoft Office.

  4. Klicken Sie auf Speichern.

  5. Starten Sie den LiveCycle-Server neu.

Hinweis:

Dieses Authentifizierungs-SPI kann auch zum Erstellen des Benutzers Just in time verwendet werden.

Teiländerungen am SharePoint-Connector Web

Damit ein Webpart auf einen SSL-konfigurierten LiveCycle-Server zugreifen kann, müssen die folgenden Änderungen in der Datei web.config des SharePoint-Servers vorgenommen werden:

Um die gegenseitige Authentifizierung zu aktivieren, ersetzen Sie Folgendes:

<system.serviceModel>
    <bindings>
      ...
    </bindings>
    <client>
      ...
    </client>
  </system.serviceModel>

Mit:

<system.serviceModel>
    <behaviors>
        <endpointBehaviors>
          <behavior name="MutualSslBehavior">
            <clientCredentials>
              <clientCertificate storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectName" findValue="chetanm" />
            </clientCredentials>
          </behavior>
        </endpointBehaviors>
      </behaviors>
    <bindings>
      <basicHttpBinding>
        <binding name="ReaderExtensionsServiceSoapBinding" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:05:00"
          allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
          maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
          messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
          useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="81920000"
            maxArrayLength="16384000" maxBytesPerRead="40960000" maxNameTableCharCount="16384" />
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Certificate" proxyCredentialType="None"
              realm="" />
          </security>
        </binding>
        <binding name="TaskManagerServiceSoapBinding" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:05:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="81920000" maxArrayLength="16384000"
              maxBytesPerRead="40960000" maxNameTableCharCount="16384" />
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Certificate" proxyCredentialType="None"
              realm="" />
          </security>
        </binding>
        <binding name="TaskManagerQueryServiceSoapBinding" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:05:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="81920000" maxArrayLength="16384000"
              maxBytesPerRead="40960000" maxNameTableCharCount="16384" />
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Certificate" proxyCredentialType="None"
              realm="" />
          </security>
        </binding>
        <binding name="FormsServiceSoapBinding" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:05:00"
          allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
          maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
          messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
          useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="81920000"
            maxArrayLength="16384000" maxBytesPerRead="40960000" maxNameTableCharCount="16384" />
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Certificate" proxyCredentialType="None"
              realm="" />
          </security>
        </binding>
        <binding name="DirectoryManagerServiceSoapBinding" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:05:00"
          allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
          maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
          messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
          useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="81920000"
            maxArrayLength="16384000" maxBytesPerRead="40960000" maxNameTableCharCount="16384" />
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Certificate" proxyCredentialType="None"
              realm="" />
          </security>
        </binding>
        <binding name="MSSharePointConfigServiceSoapBinding" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:05:00"
         allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
         maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
         messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
         useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="81920000"
            maxArrayLength="16384000" maxBytesPerRead="40960000" maxNameTableCharCount="16384" />
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Certificate" proxyCredentialType="None"
              realm="" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="https://<AdobeLiveCycleServer>:<port>/soap/services/ReaderExtensionsService"
        binding="basicHttpBinding" bindingConfiguration="ReaderExtensionsServiceSoapBinding" behaviorConfiguration="MutualSslBehavior"
        contract="LiveCycleReaderExtensions.ReaderExtensionsService"
        name="ReaderExtensionsService" />
      <endpoint address="https://<AdobeLiveCycleServer>:<port>/soap/services/FormsService"
        binding="basicHttpBinding" bindingConfiguration="FormsServiceSoapBinding" behaviorConfiguration="MutualSslBehavior"
        contract="FormsService.FormsService" name="FormsService" />
      <endpoint address="https://<AdobeLiveCycleServer>:<port>/soap/services/TaskManagerService"
        binding="basicHttpBinding" bindingConfiguration="TaskManagerServiceSoapBinding" behaviorConfiguration="MutualSslBehavior"
        contract="TaskManagerService.TaskManagerService" name="TaskManagerService" />
      <endpoint address="https://<AdobeLiveCycleServer>:<port>/soap/services/TaskManagerQueryService"
        binding="basicHttpBinding" bindingConfiguration="TaskManagerQueryServiceSoapBinding" behaviorConfiguration="MutualSslBehavior"
        contract="TaskManagerQueryService.TaskManagerQueryService" name="TaskManagerQueryService" />
      <endpoint address="https://<alfresco-server>:<port>/soap/services/DirectoryManagerService"
        binding="basicHttpBinding" bindingConfiguration="DirectoryManagerServiceSoapBinding" behaviorConfiguration="MutualSslBehavior"
        contract="DirectoryManagerService.DirectoryManagerService" name="DirectoryManagerService" />
      <endpoint address="https://<AdobeLiveCycleServer>:<port>/soap/services/MSSharePointConfigService"
        binding="basicHttpBinding" bindingConfiguration="MSSharePointConfigServiceSoapBinding"
        contract="MSSharePointConfigService.MSSharePointConfigService" behaviorConfiguration="MutualSslBehavior"
        name="MSSharePointConfigService" />
    </client>
  </system.serviceModel>
The certificate specification sections needs to be changed according to the certificate and its location of installation.
<clientCertificate storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectName" findValue="<subject-name>" />

Befolgen Sie die Ressourcen und die folgenden Anweisungen, soweit sie für Ihre Umgebung erforderlich sind.

Ressource Anweisungen
Installieren von importierten Zertifikaten auf einem Webserver

Geben Sie auf der Seite LiveCycle-Einstellungen im Abschnitt Sharepoint-Site-Einstellungen den <Subjektnamen> (der Name des Subjekts im Zertifikat) als Benutzername an und aktivieren Sie das Kontrollkästchen Https aktivieren.

Hinweis: Webpart geht davon aus, dass es nur ein Zertifikat mit einem bestimmten Subjekt-Namen gibt.

Installationsanleitung für den SharePoint-Connector-Webpart

Nach der Installation des Webparts nehmen Sie die Änderungen an der web.config (wie oben beschrieben) vor.

Hinweis: Wenn während der Aktivierung ein Zugriffsverweigerungsfehler auftritt, führen Sie das Powershell-Skript unter http://support.microsoft.com/de-de/kb/2564009 aus.

Konfigurieren des Connectors für Microsoft SharePoint Falls der Webpart zuvor installiert wurde, deinstallieren Sie ihn zunächst mittels des hier verfügbaren Skripts.

PDF iFilter-Änderungen

Hinweis:

Die selbst signierten Zertifikate werden nicht unterstützt. Verwenden Sie Zertifikate der Zertifizierungsstelle für gegenseitige Authentifizierung.

Änderungen für den Zugriff auf HTML Workspace durch CAC-Authentifizierung

Damit sich Ihre Benutzer mit CAC-Zertifikaten (Common Access Cards) in HTML Workspace anmelden können, müssen Sie folgende Änderungen am Server vornehmen:

  1. Gehen Sie zu http://[server]:[port]/lc/libs/granite/security/content/useradmin.html und melden Sie sich als Administrator an.

  2. Tippen Sie auf Administrator. Die Seite „Benutzereinstellungen bearbeiten“ wird geöffnet.

  3. Tippen Sie auf „trustStore erstellen“ und legen Sie ein Passwort für trustStore fest. Weitere Informationen finden Sie unter Das IdP-Zertifikat dem AEM-TrustStore hinzufügen.

  4. Tippen Sie auf „keyStore erstellen“ und legen Sie ein Kennwort für den keyStore fest. Weitere Informationen finden Sie unter Dem AEM-Keystore den Schlüssel und die Zertifikatkette des Dienstanbieters hinzufügen.

  5. Melden Sie sich ab und versuchen Sie, mit Port: 8443 auf den Arbeitsbereich (Workspace) zuzugreifen, und Sie sollten den Arbeitsbereich mit der CAC-Karte erreichen können.

Dieses Werk unterliegt den Bedingungen der Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.  Twitter™- und Facebook-Beiträge fallen nicht unter die Bedingungen der Creative Commons-Lizenz.

Rechtliche Hinweise   |   Online-Datenschutzrichtlinie