Liberty 中配置 SPNEGO 认证

可通过对 WebSphere® Application Server Liberty 使用简单且受保护的 GSS-API 协商机制 (SPNEGO) Web 认证以将单点登录用于 HTTP 请求。SPNEGO 单点登录允许 HTTP 用户只在其桌面登录 Microsoft® 域控制器一次就可通过 Liberty 服务器实现单点登录 (SSO)。

开始之前

配置以下软件以确保它可用:
  1. 正在运行 Active Directory 域控制器和关联 Kerberos 密钥分发中心 (KDC) 的 Microsoft Windows® Server。对于本主题,这类域控制器的示例主机为 myAdMachine.example.com。域控制器名称为 mydomain.example.com,Kerberos 域名为 MYDOMAIN.EXAMPLE.COM,这是字母全大写的域控制器名称。
  2. 按 IETF RFC 2478 中的定义支持 SPNEGO 认证机制的 Microsoft Windows® 域成员(客户机)。相应客户机的示例可能包括现代浏览器或 Microsoft .NET 客户机。大部分现代浏览器支持 SPNEGO 认证。对于本主题,此客户机的示例主机为 myClientMachine.example.com
  3. Liberty 服务器(其应用程序内包含受保护资源)的服务器平台。Active Directory 中的用户必须能够使用本机 Liberty 服务器认证机制访问 Liberty 服务器的受保护资源。对于本主题,示例 Liberty 服务器主机为 myLibertyMachine.example.com
注: 软件配置必须具有正运行的域控制器,该域中至少有一个客户机,以及配备 Liberty 服务器(其应用程序内包含受保护资源)的服务器平台,即,总共三台必需机器。不支持直接从域控制器使用 SPNEGO。
注: 确保客户机、Microsoft Active Directory 服务器和 Liberty 服务器的时钟同步不超过 5 分钟(缺省情况下)。同步中的可允许时差是可配置的。
注: 当前仅支持 IBM® JDK。不支持非 IBM JDK。

关于此任务

此任务的目标是允许用户成功访问 Liberty 服务器资源而不必再次认证,从而实现 Microsoft Windows® 桌面单点登录功能。

此任务说明如何配置 Liberty 服务器以支持将单点登录用于 HTTP 请求(通过使用 SPNEGO Web 认证)。

过程

  1. 在 Microsoft 域控制器 (myAdMachine.example.com) 上,为 Liberty 服务器创建 Kerberos 服务主体名称 (SPN) 和密钥表文件。
    1. 创建 Liberty 服务器的用户帐户。此帐户用于映射到 Kerberos 服务主体名称 (SPN)。对于 Active Directory 机器,此帐户创建通常可通过以下方法来完成:转至开始 > 管理工具 > Active Directory 用户和计算机,在面板上右键单击用户,然后选择新建 > 用户。本主题假定将创建用户 myLibertyMachine_http,其密码为 security
    2. 运行 Microsoft setspn 命令以将该用户帐户映射至 Kerberos SPN。此用户帐户将 Liberty 服务器表示为带有 KDC 的 Kerberos 服务。 setspn 命令的示例:
      C:\> setspn -a HTTP/myLibertyMachine.example.com myLibertyMachine_http
      
      Registering ServicePrincipalNames for CN=myLibertyMachine_http,CN=Users,DC=MYDOMAIN,DC=EXAMPLE,DC=COM
                       HTTP/myLibertyMachine.example.com
      Updated object
      注: 如果您的 Microsoft setspn 命令版本支持 -S 选项,那么必须使用 -S 选项而不是 -A 选项。
    3. 使用 Microsoft ktpass 工具创建 Kerberos 密钥表文件。此文件的缺省名称为 krb5.keytab

      ktpass 命令的示例:

      C:\> ktpass -out krb5.keytab -princ HTTP/myLibertyMachine.example.com@MYDOMAIN.EXAMPLE.COM -mapUser myLibertyMachine_http -mapOp set -pass security -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL
      
      				Targeting domain controller: myAdMachine.MYDOMAIN.EXAMPLE.COM
      				Using legacy password setting method
      				Successfully mapped HTTP/myLibertyMachine.example.com to myLibertyMachine_http.
      				Key created.
      				Output keytab to krb5.keytab:
      				Keytab version: 0x502
      				keysize 93 HTTP/myLibertyMachine.example.com@MYDOMAIN.EXAMPLE.COM ptype 1 (KRB5_NT_PRINCIPAL) vno 3 etype 0x17 (RC4-HMAC) keylength 16 (0x148d643db283327d3f3d44547da8cade)

      使用下列其中一个命令确保 Microsoft 林中没有重复的 SPN:

      • 如果您的 Microsoft setspn 命令版本支持 -X 选项搜索重复 SPN,请使用 setspn -X
        C:\>setspn -X HTTP/myLibertyMachine.example.com 
        
        Processing entry 0 
        found 0 group of duplicate SPNs. 
      • 还可使用 Microsoft ldif 命令。以下示例显示返回了一个条目,指示没有重复 SPN。
        C:\>ldifde -f check_SPN.txt -t 3268 -d "" -l servicePrincipalName -r " 
        (servicePrincipalName=HTTP/myLibertyMachine.example.com)" -p subtree 
        
        Connecting to "myAdMachine.MYDOMAIN.EXAMPLE.COM" 
        Logging in as current user using SSPI 
        Exporting directory to file check_SPN.txt 
        Searching for entries... 
        Writing out entries. 
        1 entries exported 

      有关在不同 KDC 系统上创建 SPN 和密钥表文件的信息,请参阅创建 Kerberos 服务主体名称和密钥表文件

  2. Liberty 服务器 (myLibertyMachine.example.com) 上,启用 Kerberos 密钥表和配置文件及 SPNEGO Web 认证。
    1. 将域控制器中的 Kerberos 密钥表文件复制到 Liberty 服务器。此文件的缺省名称为 krb5.keytab,缺省位置随平台不同而变化,但与 Kerberos 配置文件位于同一目录。有关各种平台的缺省位置,请参阅下一步。
    2. 创建 Kerberos 配置文件。

      Kerberos 配置文件包含客户机配置信息。此信息包括相关领域的 KDC 的位置,当前 Kerberos 领域的缺省值,以及主机名到 Kerberos 领域的映射。对于 Liberty 服务器,您必须手动创建此文件。

      此文件的缺省位置和名称随操作系统不同而变化:
      • For Windows platformsWindows - 缺省位置为 c:\winnt\krb5.ini。如果 krb5.ini 文件不在 c:\winnt 目录中,那么它可能在 c:\windows
      • For LINUX platformsLinux - 缺省位置为 /etc/krb5.conf
      • For AIX platformsFor HP UNIX platformsFor Solaris platformsAIX®、z/OS®、HP-UX 和 Solaris - 缺省位置为 /etc/krb5/krb5.conf

      以下是 AIX、z/OS、HP-UX 或 Solaris 平台的样本 Kerberos 配置文件(基于缺省密钥表位置):

      [libdefaults]
                default_realm = MYDOMAIN.EXAMPLE.COM
                default_keytab_name = FILE:/etc/krb5/krb5.keytab
                default_tkt_enctypes = rc4-hmac 
                default_tgs_enctypes = rc4-hmac 
                forwardable  = true
                renewable  = true
                noaddresses = true
                clockskew  = 300
                udp_preference_limit = 1
      [realms]
                MYDOMAIN.EXAMPLE.COM = {
                      kdc = myAdMachine.example.com:88
                      default_domain = example.com
      			}
      [domain_realm]
              .example.com = MYDOMAIN.EXAMPLE.COM
      注: 域名通常以大写字母指定。如果您使用的是 Microsoft Active Directory,那么领域名称必须为大写。
      注: 不是所有可用 KDC 解决方案支持所有加密类型。在选择加密类型前,请参阅《Kerberos 管理员和用户指南》以确保 KDC 支持您要使用的加密类型。

      确保您具有适用于 Kerberos 配置文件、Kerberos 密钥表文件、Kerberos SPN 和 Kerberos 客户机的通用加密类型。例如,如果 Kerberos 客户机使用 RC4-HMAC 加密类型,那么目标服务器必须也支持 RC4-HMAC 加密类型,并且 Kerberos 配置文件必须在 default_tgt_enctypesdefault_tkt_enctypes 参数中先列示 RC4-HMAC

      有关此文件内容的更多信息和要求,请参阅创建 Kerberos 配置文件

    3. 验证 Kerberos 配置文件和密钥表文件。
      • 可使用 JDK 命令 klist 列示密钥表文件中的 SPN。
        klist -k -t /etc/krb5.keytab
      • 可使用 JDK 命令 kinit 验证密钥表文件和 Kerberos 配置文件中的 SPN。
        kinit -k -t /etc/krb5.keytab HTTP/myLibertyMachine.example.com

      执行 kinit 命令后,可使用 klist 命令列示 Kerberos 凭单。如果您获得 Kerberos 凭单,那么说明 Kerberos 密钥表和配置有效。

    4. Liberty 服务器上配置并启用 SPNEGO Web 认证。

      可通过启用 Libertyspnego-1.0 功能部件来启用 SPNEGO Web 认证。

      1. spnego-1.0 功能部件添加至 server.xml 文件。
        <featureManager>
                <feature>spnego-1.0</feature>
                <feature>appSecurity-2.0</feature>
                ...
        </featuremanager>

        添加 spnego-1.0 功能部件会自动实施某个最低配置。不必在 server.xml 文件中指定 <spnego> 元素。如果未指定 <spnego> 元素,那么以下配置是隐式的。

        <spnego
               canonicalHostName="true"
               disableFailOverToAppAuthType="true"
               trimKerberosRealmNameFromPrincipal="true"
               includeClientGSSCredentialInSubject="true" />
        注: 运行时形成以下格式的缺省 SPN:
        "HTTP/" + java.net.InetAddress.getLocalHost().getCanonicalHostName();

        如果缺省 SPN 与 krb5.keytab 文件中的内容不匹配,那么您需要指定 servicePrincipalNames,例如:

        <spnego id="mySpnego" servicePrincipalNames="HTTP/myLibertyMachine.example.com"/>
        注: 如果已启用 spnego-1.0 功能部件并且 <spnego> 元素被省略或未对其配置 authFilterRef 属性,那么要访问受保护资源的所有请求使用 SPNEGO 认证。

        有关配置认证过滤器的更多信息,请参阅认证过滤器

        注: 如果未给定 krb5Configkrb5Keytab 属性值,那么每个相应文件应在其缺省位置。本示例之前给出了 Kerberos 配置文件和密钥表文件在各个平台上的缺省位置。
      2. 可选:必要时指定所有附加配置选项。Liberty 支持许多常见 SPNEGO 方案和配置。例如,可过滤 HTTP 请求以仅要求对某些请求、Web 应用程序、主机或用户代理使用 SPNEGO 认证。而且,还可将 Kerberos 配置文件和密钥表文件从其相应缺省位置移开。以下是更改缺省 <spnego> 设置的样本配置:
        <server>
                <featureManager>
                        <feature>spnego-1.0</feature>
                        <feature>appSecurity-2.0</feature>
                        ...
                </featureManager>
                ...
                <authFilter id="myAuthFilter">
                         <host id="myHost" name="example.com" matchType="contains" />
                         <webApp id="myWebApp" name="protectedApp" matchType="equals" />
                </authFilter>
        
                <spnego id="mySpnego"
                        includeClientGSSCredentialInSubject="false"
                        krb5Config="${server.config.dir}/resources/security/kerberos/krb5.conf"
                        krb5Keytab="${server.config.dir}/resources/security/kerberos/krb5.keytab"
                        servicePrincipalNames="HTTP/myLibertyMachine.example.com"
                        authFilterRef="myAuthFilter" />
                </spnego> 
                ...
        </server>

        根据此配置,对于 Web 应用程序 protectedApp 内的资源,系统将对所接收的所有包含主机名 example.com 的请求使用 SPNEGO 认证。此外,成功认证时,客户机的 GSS 凭证不会添加至用户主体集。最后,系统对服务器要使用的 Kerberos 配置文件和密钥表文件指定服务器配置目录内的特定位置(而不是指定其相应缺省位置)。

        有关更多配置选项,请参阅简单且受保护的 GSS-API 协商机制 (SPNEGO)

        有关将 Kerberos 主体名称映射至 WebSphere 用户注册表标识的信息,请参阅将客户机 Kerberos 主体名称映射至 WebSphere 用户注册表标识

        如果出现将 Kerberos 主体名称用于授权的极少数情况,请参阅将 Kerberos 主体名称与 SPNEGO 认证配合使用以进行授权。仅当需要时才应执行这些步骤,并由明确选择不使用缺省映射或 JASS 定制登录模块映射的用户执行。

  3. 在客户机应用程序机器 (myClientMachine.example.com) 上配置客户机应用程序。

    以下步骤只能在客户端机器上完成。在 Active Directory 机器或 Liberty 服务器上启动浏览器并执行这些步骤时不起作用。

    以下步骤适用于从浏览器访问受 SPNEGO 保护的资源的用户。您必须已安装支持 SPNEGO 认证的浏览器。

    Microsoft Internet Explorer:
    1. 在桌面上登录 Windows Active Directory 域。
    2. Internet Explorer 窗口中,单击工具 > Internet 选项。在所显示的窗口中,单击安全选项卡。
    3. 选择本地 Intranet 图标并单击站点
    4. 如果您使用的是 Internet Explorer V9 或更低版本,请转至下一步。如果您使用的是 Internet Explorer 10 或更高版本,请在“本地 Intranet”窗口中单击高级
    5. 在“本地 Intranet”窗口中,使用主机名的 Web 地址填写将该网站添加到区域字段,以便可对网站字段中显示的网站列表启用单点登录 (SSO)。您的站点信息技术人员应提供此信息。关闭第二个“本地 Intranet”窗口,然后单击确定以完成此步骤并关闭“本地 Intranet”窗口。
    6. 在“Internet 选项”窗口上,单击高级选项卡并滚动至“安全”设置。确保启用集成 Windows® 验证框已选中。
    7. 单击确定。重新启动 Microsoft Internet Explorer 以激活此配置。
    Mozilla Firefox:
    1. 在桌面上登录 Windows Active Directory 域。
    2. 在 Firefox 的地址字段中,输入 about:config
    3. 在“过滤/搜索”框中,输入 network.n
    4. 双击 network.negotiate-auth.trusted-uris。此首选项列示允许使用此浏览器进行 SPNEGO 认证的站点。输入可信域或 URL 的逗号定界列表。
      注: 必须设置 network.negotiate-auth.trusted-uris 的值。
    5. 如果所部署 SPNEGO 解决方案使用高级 Kerberos 功能部件“凭证授权”,请双击 network.negotiate-auth.delegation-uris。此首选项列示该浏览器可将其用户授权委托给服务器的站点。输入可信域或 URL 的逗号定界列表。
    6. 单击确定。此配置将反映更新。
    7. 重新启动 Firefox 浏览器以激活此配置。
    注: 用户必须登录域控制器才能使 SPNEGO 生效。通过使用先前的示例机器,用户必须登录位于 MYDOMAIN.EXAMPLE.COM\username 的域控制器以使通过浏览器进行的 SPNEGO 认证生效。
    注: 如果系统多次提示您输入用户标识和密码,请确保您已遵循先前的指示信息在客户机浏览器上启用了 SPNEGO 支持。还必须确保 <spnego> 配置中的 disableFailOverToAppAuthType 属性设置为 false

结果

互联网浏览器现在已适当配置以进行 SPNEGO 认证。您可使用部署在 Liberty 服务器上具有受保护资源的应用程序,而不会收到要求您输入用户标识和密码的提示。

要验证 SPNEGO 是否工作,可登录域控制器然后访问 Liberty 服务器上的受保护资源,因为您已登录域控制器,所以系统不会提示您输入凭证。但是,如果您未登录域控制器并尝试访问受保护资源,那么系统会提示您输入凭证。


用于指示主题类型的图标 任务主题

文件名:twlp_spnego_config.html