ワークベンチを使用して Auth Provider SPI DSC を展開し、開始します。
概要
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 サーバーに展開し、構成します。
-
-
「Home (ホーム)」/「Settings (設定)」/「User Management (ユーザー管理)」/「Domain Management (ドメイン管理)」の順にクリックします。
-
New Hybrid Domain (新しいハイブリッドドメイン)をクリックします。
-
認証を追加します。
認証プロバイダーリストから「Custom (カスタム)」を選択します。
-
表示されているカスタム SPI のリストから、上記の手順 1 で展開した SPI の名前を選択します。
-
「保存」をクリックします。
著作権管理を構成するには、下記の手順に従ってください:
-
管理者 UI では、次の順にアクセスします:「Services (サービス)」/「著作権管理」/「Configuration (構成)」。
-
ベース URL がサーバー認証に一致することを確認します。
-
「Extended Authentication (拡張された認証)」を有効化します。
注意:拡張認証は、Rights Management Extension for Microsoft Office には適用されません。
-
「保存」をクリックします。
-
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 にログインできるようにするには、サーバーで次の変更を行う必要があります。
-
http://[server]:[port]/lc/libs/granite/security/content/useradmin.html に行き、管理者としてログインします。
-
「Administrator」をタップします。「ユーザ設定の編集」ページが開きます。
-
「Create trustStore」をタップし、trustStore のアクセスパスワードを設定します。詳細については、AEM 信頼ストアに IDP 証明書の追加を参照してください。
-
「Create keyStore」をタップし、keyStore のパスワードを設定します。詳細については、AEM キーストアにサービスプロバイダーのキーおよび証明書チェーンの追加を参照してください。
-
ログアウトして、port :8443 を使用してワークスペースにアクセスすると CAC カードを備えたワークスペースに接続できるようになります。