Autenticação CAC e Mútua

Introdução

O Adobe® LiveCycle® Enterprise Suite 4 (ES4) fornece suporte para Autenticação Mútua para efetuar logon nos servidores do LiveCycle. Os seguintes são compatíveis:

  • Todas as interfaces de usuário do LC, exceto WorkBench
  • Adobe Acrobat e Adobe Reader
  • Microsoft Office

No caso de autenticação usando CAC (Cartões de acesso comum), os certificados incorporados podem ser usados como certificados no armazenamento de certificados do Microsoft® Windows®. Quando a autenticação mútua ocorre e o certificado em CAC é selecionado, o cliente é autenticado.

Compatibilidade do LiveCycle para Autenticação Mútua

O compatibilidade de autenticação mútua no LiveCycle está disponível para:

  • Abrir documentos protegidos por política usando o Adobe Reader ou o Adobe Acrobat.
  • Interfaces de usuário do LiveCycle Web. Todas as interfaces de usuário do usuário final e as interfaces de usuário do administrador são compatíveis.
  • Autenticação via SharePoint Connector. O LiveCycle SharePoint Connector Web pode ser configurado para autenticar por meio de um certificado de usuário do sistema, em vez de um nome de usuário e senha pré-configurados.
  • Indexação de documento protegido pelo Gerenciamento de Direitos no LiveCycle iFilter.
  • Extensões de Gerenciamento de Direitos para o Microsoft® Office®.
Observação:

A autenticação mútua não é compatível com:

  • Kit de desenvolvimento de software do LiveCycle Java Client
  • LiveCycle Workbench

Configuração

Configuração do Servidor de Aplicativos

A ativação da autenticação mútua depende do servidor de aplicativos usado.

Siga as diretrizes específicas do servidor de aplicativos para habilitar a Autenticação Mútua de 2 vias.

Configuração do LiveCycle Server

Para habilitar a autenticação mútua no servidor LiveCycle, um SPI UM AuthProvider personalizado precisa ser implementado e configurado com um domínio do LiveCycle.

Para obter detalhes sobre como criar provedores de autenticação, consulte Criação de Provedores de Autenticação.

A seguir, uma amostra do SPI do Provedor de Autenticação para habilitar a autenticação mútua:

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

Este Provedor de Autenticação precisa ser incluído em um domínio híbrido no LiveCycle. Os usuários desse domínio seriam habilitados para Autenticação Mútua.

Depois de criar o certificado de assinatura digital (DSC) do SPI do provedor de autenticação, siga as etapas descritas abaixo para implantar e configurar no servidor LiveCycle:

  1. Implemente e inicie o DSC do SPI do Provedor de Autenticação usando o Workbench.

  2. Vá para Início > Configurações > Gerenciamento de usuários > Gerenciamento de domínios.

  3. Clique em Novo domínio híbrido.

  4. Adicione a autenticação.

    Selecione Personalizado na lista Provedor de autenticação.

  5. Selecione o nome do SPI que é implantado na Etapa 1 acima na lista de SPIs personalizados mostrados.

  6. Clique em Salvar.

Para configurar o Gerenciamento de Direitos siga os passos descritos abaixo:

  1. Na Interface de administração, vá para: Serviços > Gerenciamento de Direitos > Configuração.

  2. Verifique e confirme se o URL base corresponde ao certificado do servidor.

  3. Habilite Autenticação estendida.

    Observação:

    A Autenticação Estendida não se aplica no caso da Extensão de Gerenciamento de Direitos para o Microsoft Office.

  4. Clique em Salvar.

  5. Reinicie o LiveCycle Server.

Observação:

Este SPI de Autenticação também pode ser usado para criar o usuário Na hora certa.

Alterações na Web part do SharePoint Connector

Para que a web part acesse um servidor LiveCycle configurado para SSL, as seguintes alterações precisam ser feitas no arquivo web.config do servidor SharePoint:

Para habilitar a autenticação mútua, substitua o seguinte:

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

Com:

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

Siga os recursos e instruções abaixo, conforme necessário para o seu ambiente.

Recurso

Instructions

Na seção Configurações do site do sharepoint da página Configurações do LiveCycle, especifique o <nome da entidade> (o nome da entidade no certificado) como Nome de usuário e verifique a caixa de verificação Habilitar Https.

Observação: a Webpart assume que há apenas um certificado com um nome de entidade específico.

Depois de instalar a Webpart, faça as alterações no web.config (como descrito acima).

Observação: Durante a ativação, se ocorrer um erro de acesso negado, execute o script powershell disponível em http://support.microsoft.com/pt-br/kb/2564009.

Caso o Webpart tenha sido instalado anteriormente, primeiro desinstale-o usando o script disponível aqui.

Alterações no PDF iFilter

Observação:

Os certificados autoassinados não são compatíveis. Use certificados emitidos por CA para Autenticação Mútua.

Alterações para acesso ao HTML Workspace por meio de autenticação CAC

Para que seus usuários possam efetuar logon no HTML Workspace com certificados Cartões de Acesso Comuns (CAC), é necessário fazer a seguinte alteração no servidor: 

  1. Vá para http://[server]:[port]/lc/libs/granite/security/content/useradmin.html e efetue logon como administrador.

  2. Toque em Administrador. A página Editar configurações do usuário será aberta.

  3. Toque em Criar trustStore e defina uma senha de acesso para trustStore. Para mais informações, consulte Adicionar o certificado IdP ao AEM TrustStore.

  4. Toque em Criar keyStore e defina uma senha para keyStore. Para mais informações, consulte Adicionar a chave do provedor de serviços e a cadeia de certificados ao keystore do AEM.

  5. Efetue logoff e tente acessar o espaço de trabalho com a porta :8443 e deverá ser possível acessar o espaço de trabalho com o cartão CAC.

 Adobe

Receba ajuda com mais rapidez e facilidade

Novo usuário?

Adobe MAX 2024

Adobe MAX

The Creativity Conference

14 a 16 de outubro, Miami Beach e online

Adobe MAX 2024

Adobe MAX

The Creativity Conference

14 a 16 de outubro, Miami Beach e online