好的,两周后,我终于可以让它工作了!!!!
我将尽可能详细地发布整个过程,这样没有人会遭受我所遭受的痛苦。
在这个过程中我使用了domian DEV-MITROL.LOCAL 中的三台计算机:
域控制器:主机名:AR-SRV-DC-007 用户:管理员密码:somePass40
Tomcat 机器:ip:192.168.40.91(我在 DC 上创建了一个 dns 条目以将此 IP 解析为 santi.dev-mittrol.net) 用户:tomcat 密码:tomcatPass40
客户端机器向 Tomcat 机器发出请求(如果您从运行服务器的同一台机器发出请求,它将无法正常工作)
脚步:
1) 以管理员用户 y 创建此 SPN 登录 DC:
setspn -A HTTP/santi.dev-mitrol.net tomcat
setspn -A HTTP/santi.dev-mitrol.net.dev-mitrol.local tomcat
2) 在“管理工具>Active Directory 用户和计算机”中找到用户“tomcat”,在“委派”选项卡中选择“信任此用户以委派任何服务(仅限 Kerberos)”选项,然后在“帐户”选项卡中,在“帐户选项”选中“不需要 Kerberos 预身份验证”。
3)使用以下命令创建密钥表:
ktpass -princ HTTP/santi.dev-mitrol.net.dev-mitrol.local@DEV-MITROL.LOCAL -mapuser tomcat@DEV-MITROL.LOCAL -pass * -ptype KRB5_NT_PRINCIPAL -out test.keytab
您必须在这里使用的密码是:tomcatPass40。
4) 现在,是时候使用 tomcat 用户登录并粘贴在此路径上创建的密钥表了:
C:\Program Files\Apache Software Foundation\Tomcat 8.5\conf\
除此之外,您必须在此文件夹中再创建两个文件:
KRB5.ini
[libdefaults]
default_realm = DEV-MITROL.LOCAL
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-MITROL.LOCAL = {
kdc = AR-SRV-DC-007
}
[domain_realm]
dev-mitrol.local= DEV-MITROL.LOCAL
.dev-mitrol.local= DEV-MITROL.LOCAL
和 JAAS.conf
com.sun.security.jgss.krb5.initiate {
com.sun.security.auth.module.Krb5LoginModule required;
};
com.sun.security.jgss.krb5.accept {
com.sun.security.auth.module.Krb5LoginModule required
storeKey=true
useKeyTab=true
keyTab="file:///C:/Program Files/Apache Software Foundation/Tomcat 8.5/conf/test.keytab"
principal="HTTP/santi.dev-mitrol.net.dev-mitrol.local";
};
5) 编辑同一文件夹中的 web.xml 文件,并包含 SPNEGO 过滤器:
<filter>
<filter-name>SpnegoHttpFilter</filter-name>
<filter-class>net.sourceforge.spnego.SpnegoHttpFilter</filter-class>
<init-param>
<param-name>spnego.allow.basic</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>spnego.allow.localhost</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>spnego.allow.unsecure.basic</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>spnego.login.client.module</param-name>
<param-value>com.sun.security.jgss.krb5.initiate</param-value>
</init-param>
<init-param>
<param-name>spnego.krb5.conf</param-name>
<param-value>krb5.ini</param-value>
</init-param>
<init-param>
<param-name>spnego.login.conf</param-name>
<param-value>jaas.conf</param-value>
</init-param>
<init-param>
<param-name>spnego.login.server.module</param-name>
<param-value>com.sun.security.jgss.krb5.accept</param-value>
</init-param>
<init-param>
<param-name>spnego.prompt.ntlm</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>spnego.logger.level</param-name>
<param-value>1</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SpnegoHttpFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
6)在“C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\ROOT”中创建一个JSP文件,内容如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Hello SPNEGO Example</title>
</head>
<body>
Hello <%= request.getRemoteUser() %> !
</body>
</html>
7) 如果您已按照此步骤操作,它应该可以正常工作,并且您将根据您的请求收到 Windows 用户的名称。
希望能帮助到你。