CAC および相互認証

概要

Adobe® LiveCycle® Enterprise Suite 4 (ES4) は LiveCycle サーバーにログインできるようにするために相互認証をサポートします。以下がサポートされています。

  • WorkBench を除くすべての LC ユーザーインターフェイス
  • Adobe Acrobat および Adobe Reader
  • Microsoft Office

CAC(Common Access Cards)を使用する認証の場合は、埋め込まれた証明書を Microsoft® Windows® Certificate ストアの証明書と同様に使用できます。相互認証が実行され、CAC の証明書が選択されると、クライアントは認証されます。

相互認証の LiveCycle サポート

LiveCycle の相互認証サポートは次の用途で使用できます:

  • Adobe Reader または Adobe Acrobat を使用してポリシーで保護されたドキュメントを開く.
  • LiveCycle Web ユーザーインターフェイス。すべてのエンドユーザーと管理者のユーザーインターフェイスがサポートされています。
  • SharePoint Connector 経由での認証LiveCycle SharePoint Connector Web は事前定義されたユーザー名とパスワードの代わりに、システムユーザーの証明書を使用して認証するように構成できます。
  • LiveCycle iFilter の著作権管理で保護されたドキュメントに索引を付ける
  • Microsoft® Office® 向け著作権管理拡張機能
注意:

相互認証は次の場合サポートされていません:

  • LiveCycle Java Client SDK
  • LiveCycle Workbench

構成

アプリケーションサーバーの構成

使用されるアプリケーションに応じて相互認証を有効にします。

2 ウェイ相互認証を有効にするには、アプリケーションサーバー固有のガイドラインに従ってください。

LiveCycle サーバーの構成

LiveCycle サーバーの相互認証を有効にするには、カスタムの UM AuthProvider SPI を LiveCycle ドメインに実装し、構成しておく必要があります。

認証プロバイダーの作成の詳細については、認証プロバイダーの作成.を参照してください。

次は、相互認証を有効化するための認証プロバイダーのサンプルです:

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

この認証プロバイダーは LiveCycle のハイブリッドドメインに含める必要があります。その後、そのドメインからのユーザーに対する相互認証が有効になります。

Auth Provider SPI DSC の構築後、下記の手順に従って、LiveCycle サーバーに展開し、構成します。

  1. ワークベンチを使用して Auth Provider SPI DSC を展開し、開始します。

  2. Home (ホーム)」/「Settings (設定)」/「User Management (ユーザー管理)」/「Domain Management (ドメイン管理)」の順にクリックします。

  3. New Hybrid Domain (新しいハイブリッドドメイン)をクリックします。

  4. 認証を追加します。

    認証プロバイダーリストから「Custom (カスタム)」を選択します。

  5. 表示されているカスタム SPI のリストから、上記の手順 1 で展開した SPI の名前を選択します。

  6. 保存」をクリックします。

著作権管理を構成するには、下記の手順に従ってください:

  1. 管理者 UI では、次の順にアクセスします:「Services (サービス)」/「著作権管理」/「Configuration (構成)」。

  2. ベース URL がサーバー認証に一致することを確認します。

  3. Extended Authentication (拡張された認証)」を有効化します。

    注意:

    拡張認証は、Rights Management Extension for Microsoft Office には適用されません。

  4. 保存」をクリックします。

  5. LiveCycle サーバーを再始動します。

注意:

この認証 SPI はユーザー「Just in time」の作成にも使用できます。

SharePoint Connector Web パーツの変更

SSL 構成済みの LiveCycle サーバーにアクセスするための Web パーツについては、SharePoint サーバーの web.config ファイルに次の変更を行う必要があります。

相互認証を有効にするには、次の項目を置き換えてください:

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

変更内容:

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

お使いの環境に必要に応じて次のリソースおよび手順に従います。

リソース

Instructions

LiveCycle 設定ページの sharepoint-site-Settings セクションでは、<subject-name> (証明書のサブジェクト名) に「ユーザー名」を指定し、「Enable Https (Https を有効化)」チェックボックスをオンにします。

:Webpart では特定のサブジェクト名を持つ証明書が 1 つだけであると想定します。

Web パーツのインストール後、web.config を変更します (上述の説明の通り)。

アクティブ化処理中に Access denied error が発生したときは、http://support.microsoft.com/ja-jp/kb/2564009で入手できる powershell スクリプトを実行してください。

Web パーツが既にインストールされている場合は、まずここにあるスクリプトを使用してそれをアンインストールします。

PDF iFilter の変更

詳細については、http://help.adobe.com/ja_JP/livecycle/11.0/sharepoint_iFilter_RM_docs.pdf を参照してください。

注意:

自己署名証明書はサポートされていません。相互認証には CA 発行の証明書を使用します。

CAC 認証を介した HTML Workspace へのアクセスの変更

共通アクセスカード(CAC)証明書を使用して HTML Workspace にログインできるようにするには、サーバーで次の変更を行う必要があります。

  1. http://[server]:[port]/lc/libs/granite/security/content/useradmin.html に行き、管理者としてログインします。

  2. 「Administrator」をタップします。「ユーザ設定の編集」ページが開きます。

  3. 「Create trustStore」をタップし、trustStore のアクセスパスワードを設定します。詳細については、AEM 信頼ストアに IDP 証明書の追加を参照してください。

  4. 「Create keyStore」をタップし、keyStore のパスワードを設定します。詳細については、AEM キーストアにサービスプロバイダーのキーおよび証明書チェーンの追加を参照してください。

  5. ログアウトして、port :8443 を使用してワークスペースにアクセスすると CAC カードを備えたワークスペースに接続できるようになります。

アドビのロゴ

アカウントにログイン