CAC et authentification mutuelle

Introduction

Adobe® LiveCycle® Enterprise Suite 4 (ES4) prend en charge l’authentification mutuelle pour se connecter aux serveurs LiveCycle. Les éléments suivants ne sont pas pris en charge :

  • Toutes les interfaces utilisateur LC, à l’exception de WorkBench
  • Adobe Acrobat et Adobe Reader
  • Microsoft Office

Dans le cas de l’authentification utilisant CAC (Common Access Cards), les certificats incorporés peuvent être utilisés comme des certificats dans le magasin de certificats Microsoft® Windows®. Lorsque l’authentification mutuelle se produit et que le certificat dans CAC est sélectionné, le client est authentifié.

Prise en charge de LiveCycle pour l’authentification mutuelle

La prise en charge de l’authentification mutuelle dans LiveCycle est disponible pour :

  • Ouverture d’une stratégie contenant des documents à l’aide d’Adobe Reader ou d’Adobe Acrobat.
  • Interfaces utilisateur Web LiveCycle. Toutes les interfaces utilisateur utilisateur final et les interfaces utilisateur administrateur sont prises en charge.
  • Authentification via SharePoint Connector. LiveCycle SharePoint Connector Web peut être configuré pour s’authentifier via un certificat d’utilisateur système au lieu d’un nom d’utilisateur et d’un mot de passe préconfigurés.
  • Indexation de Rights Management Documents protégés dans LiveCycle iFilter.
  • Extensions de gestion des droits pour Microsoft® Office®.
Remarque :

L’authentification mutuelle n’est pas prise en charge pour :

  • SDK LiveCycle Java Client
  • LiveCycle Workbench

Configuration

Configuration du serveur d’applications

L’activation de l’authentification mutuelle dépend du serveur d’applications utilisé.

Suivez les instructions spécifiques à l’application pour activer l’authentification mutuelle bidirectionnelle.

Configuration du serveur LiveCycle

Pour activer l’authentification mutuelle sur le serveur LiveCycle, une messagerie unifiée personnalisée SPI AuthProvider doit être implémentée et configurée avec un domaine LiveCycle.

Pour plus de détails sur la création de fournisseurs d’authentification, voir Création de fournisseurs d’authentification.

Voici un exemple du fournisseur d’authentification d’identité SPI pour activer l’authentification mutuelle :

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};
    }
 
}

Ce fournisseur d’authentification doit être inclus dans un domaine hybride dans LiveCycle. Les utilisateurs de ce domaine seront alors activé pour l’authentification mutuelle.

Après avoir créé le fournisseur d’authentification SPI DSC, suivez les étapes décrites ci-dessous pour déployer et configurer le serveur LiveCycle :

  1. Déployez et démarrez le fournisseur d’authentification SPI DSC à l’aide de Workbench.

  2. Aller à Accueil > Paramètres > Gestion des utilisateurs > Gestion des domaines.

  3. Cliquez sur nouveau Domaine hybride.

  4. Ajout d’authentification.

    Sélectionnez Personnalisé dans la liste Fournisseur d’authentification.

  5. Sélectionnez le nom de la SPI déployée à l’étape 1 ci-dessus dans la liste des SPI personnalisées affichée.

  6. Cliquez sur Enregistrer.

Pour configurer Rights Management, procédez comme suit :

  1. Dans Interface utilisateur administrateur, accédez à : Services > Gestion des droits > Configuration.

  2. Vérifiez que l’URL de base correspond au certificat du serveur.

  3. Activez Authentification étendue.

    Remarque :

    L’authentification étendue ne s’applique pas dans le cas de l’extension Rights Management pour Microsoft Office.

  4. Cliquez sur Enregistrer.

  5. Redémarrez le serveur LiveCycle.

Remarque :

Ce SPI d’authentification peut également être utilisé pour créer l’utilisateur Just in time.

Modification du composant WebPart SharePoint Connector

Pour que le composant WebPart accède à un serveur LiveCycle configuré SSL, les modifications suivantes doivent être apportées au fichier web.config du serveur SharePoint :

Pour activer l’authentification mutuelle, remplacez les éléments suivants :

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

Par :

<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>" />

Suivez les ressources et les instructions ci-dessous, en fonction des besoins pour votre environnement.

Ressource

Instructions

Dans la section sharepoint-site-Settings de la page LiveCycle settings, spécifiez <subject-name> (le nom du sujet dans le champ certificat) comme User Name et cochez la case Enable Https.

Remarque : Webpart suppose qu’il existe un seul certificat avec un nom de sujet spécifique

Après avoir installé le composant WebPart, apportez les modifications au web.config (comme décrit ci-dessus).

Remarque : lors de l’activation, si une erreur de refus d’accès se produit, exécutez le script powershell disponible sur http://support.microsoft.com/fr-fr/kb/2564009.

Si Webpart est déjà installé, désinstallez-le d’abord en utilisant le script disponible ici.

Modifications iFilter PDF

Remarque :

Les certificats auto-signés ne sont pas pris en charge. Utilisez les certificats délivrés par une autorité de certification pour l’authentification mutuelle.

Modifications relatives à l’accès à Workspace HTML via l’authentification CAC

Pour que vos utilisateurs puissent se connecter à HTML Workspace avec des certificats CAC (Common Access Cards), vous devez apporter les modifications suivantes au serveur :

  1. Accédez à http://[serveur]:[port]/lc/libs/granite/security/content/useradmin.html et connectez-vous en tant qu’administrateur.

  2. Appuyez sur Administrateur. La page Modifier les paramètres utilisateur s’ouvre.

  3. Appuyez sur Créer trustStore et définissez un mot de passe d’accès pour trustStore. Pour plus d’informations, voir Ajouter le certificat de fournisseur d’identité au TrustStore AEM.

  4. Appuyez sur Créer keyStore et définissez un mot de passe pour keyStore. Pour plus d’informations, voir Ajouter la clé du fournisseur de services et la chaîne de certificats au Keystore AEM.

  5. Déconnectez-vous et essayez d’accéder à l’espace de travail avec le port: 8443 et vous devriez pouvoir atteindre l’espace de travail avec la carte CAC.

 Adobe

Recevez de l’aide plus rapidement et plus facilement

Nouvel utilisateur ?

Adobe MAX 2024

Adobe MAX
La conférence sur la créativité

Du 14 au 16 octobre à Miami Beach et en ligne

Adobe MAX

La conférence sur la créativité

Du 14 au 16 octobre à Miami Beach et en ligne

Adobe MAX 2024

Adobe MAX
La conférence sur la créativité

Du 14 au 16 octobre à Miami Beach et en ligne

Adobe MAX

La conférence sur la créativité

Du 14 au 16 octobre à Miami Beach et en ligne