CAC e Autenticazione reciproca

Introduzione

Adobe® LiveCycle® Enterprise Suite 4 (ES4) fornisce il supporto per l'autenticazione reciproca per accedere ai server LiveCycle. Sono supportati i seguenti elementi:

  • Tutte le interfacce utente LC, eccetto WorkBench
  • Adobe Acrobat e Adobe Reader
  • Microsoft Office

Nel caso di autenticazione tramite CAC (Common Access Cards), i certificati incorporati possono essere utilizzati come certificati nell'archivio Microsoft® Windows® Certificate Store. Quando si verifica l'autenticazione reciproca e viene selezionato il certificato in CAC, il client viene autenticato.

Supporto LiveCycle per l'autenticazione reciproca

È disponibile il supporto all'autenticazione reciproca in LiveCycle:

  • Apertura di documenti protetti da policy utilizzando Adobe Reader o Adobe Acrobat.
  • Interfacce utente LiveCycle Web. Sono supportate tutte le interfacce utente finale e le interfacce utente amministratore.
  • Autenticazione tramite SharePoint Connector. Il LiveCycle SharePoint Connector Web può essere configurato per l'autenticazione tramite un certificato utente di sistema al posto di un nome utente e una password preconfigurati.
  • Indicizzazione dei documenti protetti in LiveCycle iFilter.
  • Estensioni di gestione dei diritti per Microsoft® Office®.
Nota:

L'autenticazione reciproca non è supportata:

  • LiveCycle Java Client SDK
  • LiveCycle Workbench

Configurazione

Configurazione dell'Application Server

L'abilitazione dell'autenticazione reciproca dipende dal server applicativo utilizzato.

Segui le linee guida specifiche dell'applicazione server per abilitare l'autenticazione reciproca a 2 fattori.

Configurazione del server LiveCycle Server

Per consentire l'autenticazione reciproca sul server LiveCycle, è necessario implementare e configurare un UM AuthProvider SPI personalizzato con un dominio LiveCycle.

Per informazioni dettagliate su come creare fornitori di autenticazione, vedi Creazione di fornitori di autenticazione.

Di seguito è riportato un esempio di Auth Provider SPI per abilitare l'autenticazione reciproca:

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

Questo Auth Provider deve essere incluso in un dominio ibrido in LiveCycle. Gli utenti di quel dominio sarebbero quindi abilitati per l'autenticazione reciproca.

Dopo aver creato l'Auth Provider SPI DSC segui la procedura descritta di seguito per la distribuzione e la configurazione nel server LiveCycle:

  1. Distribuisci e avvia l'Auth Provider SPI DSC utilizzando Workbench.

  2. Accedi a Home > Impostazioni > Gestione utenti > Gestione domini.

  3. Fai clic su su Nuovo Dominio Ibrido.

  4. Aggiungi l'autenticazione.

    Seleziona Personalizzato dall' elenco dei provider di autenticazione.

  5. Seleziona il nome dell'SPI che viene distribuito al punto 1 di cui sopra dall'elenco degli SPI personalizzati visualizzati.

  6. Fai clic su Save.

Per configurare la gestione dei diritti segui la procedura descritta di seguito:

  1. In Admin UI, vai a: Servizi > Gestione diritti > Configurazione.

  2. Controlla e conferma che l'URL di base corrisponda al certificato del server.

  3. Attivare l'autenticazione estesa.

    Nota:

    L'autenticazione estesa non si applica nel caso di estensione della gestione dei diritti per Microsoft Office.

  4. Fai clic su Save.

  5. Riavviare il server LiveCycle.

Nota:

Questa autenticazione SPI può essere utilizzata anche per creare l'utente Just in time.

Modifiche alla parte Web del connettore SharePoint Connector

Per la parte Web per accedere a un server LiveCycle configurato SSL, è necessario apportare le seguenti modifiche nel file web.config del server SharePoint:

Per abilitare l'autenticazione reciproca, sostituisci quanto segue:

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

Con:

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

Segui le risorse e le istruzioni riportate di seguito, se necessario per il tuo ambiente.

Risorsa

Instructions

Nella sezione sharepoint-site-Settings della pagina delle impostazioni di LiveCycle, specifica <nome-soggetto> (il nome del soggetto nel certificato) come Nome utente e seleziona la casella di controllo Abilita Https.

Nota: Webpart presuppone che ci sia un solo certificato con un soggetto specifico.

Dopo aver installato la parte web, apporta le modifiche al web.config (come descritto sopra).

Nota: Durante l'attivazione, se si verifica un errore di Access denied error, esegui lo script powershell disponibile all'indirizzo http://support.microsoft.com/it_it/kb/2564009.

Nel caso in cui webpart sia precedentemente installato, prima disinstallalo utilizzando lo script disponibile qui.

Modifiche a iFilter PDF

Nota:

I certificati autofirmati non sono supportati. Utilizzare i certificati CA rilasciati per l'autenticazione reciproca.

Modifiche per l'accesso allHTML Workspace tramite autenticazione CAC

Per consentire agli utenti di accedere all'HTML Workspace con certificati CAC (Common Access Cards), è necessario effettuare le seguenti modifiche nel server: 

  1. Vai a http://[server]:[port]/lc/libs/granite/security/content/useradmin.html e accedi come amministratore.

  2. Tocca Amministratore. Si apre la pagina Modifica impostazioni utente.

  3. Tocca Crea trustStore e imposta una password di accesso a trustStore. Per ulteriori informazioni, consulta Aggiungere il certificato IdP all'AEM TrustStore.

  4. Tocca Crea keyStore e imposta una password per keyStore. Per ulteriori informazioni, vedi Aggiungi la Service Provider key e la chain di certificati al keystore AEM.

  5. Esci e prova ad accedere al workspace con la porta :8443 e dovresti essere in grado di raggiungere il workspace con la scheda CAC.

Logo Adobe

Accedi al tuo account