集成 Windows 验证(Integrated Windows authentication)往往用于局域网环境中,因为需要使用服务器执行验证,被验证的用户也必须处于同一域内。为了能够自动验证用户,用户所用的客户端机器也必须处于同一域内。
可以利用以下几种方案来实现 Tomcat 下的集成 Windows 验证:
内建 Tomcat 支持
需要仔细配置 Kerberos 身份验证服务(集成 Windows 验证的基础)。如果严格按照下列步骤去做,配置就会生效。这些配置的灵活度很小,所以必须严格按照下列方式去做。从测试到现在,已知的规则是:
DEV.LOCAL
)不区分大小写,在jaas.conf 中也是这样。
在配置 Windows 验证的 Tomcat 内建支持时,共涉及到4个组件:域控制器、托管 Tomcat 的服务器、需要使用 Windows 验证的 Web 应用,以及客户端机器。下面将讲解每个组件所需的配置。
下面配置范例中用到的 3 个机器名称为:win-dc01.dev.local
(域控制器)、win-tc01.dev.local
(Tomcat 实例)、win-pc01.dev.local
(客户端)。它们都是DEV.LOCAL
域成员。
注意:为了在下面的步骤中使用密码,不得不放宽了域密码规则,对于生产环境,可不建议这么做。
下列步骤假设前提是:经过配置,服务器可以做为域控制器来使用。关于如何配置 Windows 服务器配置成域控制器,不在本章讨论范围之内。
配置域控制器,使 Tomcat 支持 Windows 验证的步骤为:
tc01
,密码为 tc01pass
。
将 SPN 映射到用户账户上。SPN 的形式为:<service class>/<host>:<port>/<service name>
。本文档所用的 SPN 为 HTTP/win-tc01.dev.local
。要想将用户映射到 SPN 上,运行以下命令:
setspn -A HTTP/win-tc01.dev.local tc01
生成 keytab 文件,Tomcat 服务器会用该文件将自身注册到域控制器上。该文件包含用于服务提供者账户的 Tomcat 私钥,所以也应该受到保护。运行以下命令生成该文件(全部命令都应写在同一行中):
ktpass /out c:\tomcat.keytab /mapuser tc01@DEV.LOCAL /princ HTTP/win-tc01.dev.local@DEV.LOCAL /pass tc01pass /kvno 0
test
,密码为 testpass
。
以上步骤测试环境为:运行 Windows Server 2008 R2 64 位标准版的域控制器。对于域功能级别和林(forest)功能级别,使用 Windows Server 2003 的功能级别。
下列步骤假定前提为:已经安装并配置好了 Tomcat 和 Java 6 JDK/JRE,并以 tc01@DEV.LOCAL
用户来运行 Tomcat。配置用于 Windows 验证的 Tomcat 实例的步骤如下:
tomcat.keytab
文件复制到 $CATALINA_BASE/conf/tomcat.keytab
。
$CATALINA_BASE/conf/krb5.ini
。本文档使用的文件包含以下内容:
[libdefaults]
default_realm = DEV.LOCAL
default_keytab_name = FILE:c:\apache-tomcat-8.0.x\conf\tomcat.keytab
default_tkt_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts- hmac-sha1-96
default_tgs_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts- hmac-sha1-96
forwardable=true
[realms]
DEV.LOCAL = {
kdc = win-dc01.dev.local:88
}
[domain_realm]
dev.local= DEV.LOCAL
.dev.local= DEV.LOCAL
该文件的位置可以通过 `java.security.krb5.conf` 系统属性来修改。
$CATALINA_BASE/conf/jaas.conf
。本文档使用的文件包含以下内容:
com.sun.security.jgss.krb5.initiate {
com.sun.security.auth.module.Krb5LoginModule required
doNotPrompt=true
principal="HTTP/win-tc01.dev.local@DEV.LOCAL"
useKeyTab=true
keyTab="c:/apache-tomcat-8.0.x/conf/tomcat.keytab"
storeKey=true;
};
com.sun.security.jgss.krb5.accept {
com.sun.security.auth.module.Krb5LoginModule required
doNotPrompt=true
principal="HTTP/win-tc01.dev.local@DEV.LOCAL"
useKeyTab=true
keyTab="c:/apache-tomcat-8.0.x/conf/tomcat.keytab"
storeKey=true;
};
本文件位置可以通过 java.security.auth.login.config
系统属性来修改。所用的 LoginModule 是 JVM 所专有的,从而能保证所指定的 LoginModule 匹配所用的 JVM。登录配置名称必须与验证 valve 所用值相匹配。
SPNEGO 验证器适用于任何 Realm,但如果和 JNDI Realm 一起使用的话,JNDI Realm 默认将使用用户的委托凭证(delegated credentials)连接 Active 目录。
上述步骤测试环境为:Tomcat 服务器运行于 Windows Server 2008 R2 64 位标准版上,带有 Oracle 1.6.0_24 64 位 JDK。
测试环境如下:
虽然建议使用最新的稳定版本,但其实所有 Tomcat 8 的版本都能使用。
配置与 Windows 基本相同,但存在以下一些差别:
配置 Web 应用,以便使用 web.xml 中的 Tomcat 专有验证方法 SPNEGO
(而不是 BASIC
等)。和其他的验证器一样,通过显式地配置验证 valve并且在 Valve 中设置属性来自定义行为。
配置客户端,以便使用 Kerberos 认证。对于 IE 浏览器来说,这就需要 Tomcat 实例位于“本地局域网”安全域中,并且需要在“工具 > Internet 选项 > 高级”中启用集成 Windows 认证。注意:客户端和 Tomcat 实例不能使用同一台机器,因为 IE 会使用未经证实的 NTLM 协议。
正确配置 Kerberos 验证是有一定技巧性的。下列参考资料有一定帮助。一般来说,Tomcat 用户邮件列表中的建议也是可取的。
关于该解决方案的完整详情,可浏览 Waffle 网站。其关键特性为:
关于该解决方案的完整详情,可浏览 Kerberos 扩展网站。其关键特性为:
关于该解决方案的完整详情,可浏览 该项目网站。其关键特性为:
关于该解决方案的完整详情,可浏览 该项目网站。其关键特性为:
通过配置 IIS 提供 Windows 验证的步骤如下:
tomcatAuthentication
属性设为 false
,从而配置 Tomcat 使用来自 IIS 的验证用户信息。另一种方法是,将tomcatAuthorization
设为 true
,从而在Tomcat 执行授权时,允许 IIS 进行验证。
Apache httpd 默认并不支持 Windows 验证,但可以使用很多第三方模块来实现:
采用以下步骤配置 httpd,以便提供 Windows 验证:
tomcatAuthentication
属性设为 false
,从而配置 Tomcat 使用来自 httpd 的验证用户信息。