我正在尝试使用SPNEGO filter为Tomcat(6)设置Windows Active Directory SSO。
我在示例中进行了设置,但在尝试访问hello_spnego.jsp时,仍然提示我输入登录名和密码。
我可能错过了一些东西所以这是我的conf:
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>false</param-value>
</init-param>
<init-param>
<param-name>spnego.allow.localhost</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>spnego.allow.unsecure.basic</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>spnego.login.client.module</param-name>
<param-value>spnego-client</param-value>
</init-param>
<init-param>
<param-name>spnego.login.server.module</param-name>
<param-value>spnego-server</param-value>
</init-param>
<init-param>
<param-name>spnego.krb5.conf</param-name>
<param-value>${catalina.home}\conf\krb5.conf</param-value>
</init-param>
<init-param>
<param-name>spnego.login.conf</param-name>
<param-value>${catalina.home}\conf\login.conf</param-value>
</init-param>
<init-param>
<param-name>spnego.preauth.username</param-name>
<param-value>aqw</param-value>
</init-param>
<init-param>
<param-name>spnego.preauth.password</param-name>
<param-value>pass</param-value>
</init-param>
<init-param>
<param-name>spnego.prompt.ntlm</param-name>
<param-value>false</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>*.jsp</url-pattern>
</filter-mapping>
krb5.conf:
[libdefaults]
default_realm = TEST.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]
TEST.LOCAL = {
kdc = SERVER_WITH_AD:88
default_realm = TEST.LOCAL
}
[domain_realm]
dev.local = TEST.LOCAL
.dev.local = TEST.LOCAL
login.conf:
spnego-client {
com.sun.security.auth.module.Krb5LoginModule required;
};
spnego-server {
com.sun.security.auth.module.Krb5LoginModule required
storeKey=true
isInitiator=false
useKeyTab=true
keyTab="C:\Osys\QuartisTools\Tomcat\conf\aqw.keytab"
;
};
编辑:这就是我的所作所为:
我使用以下命令设置了他的SPN:
setspn -A HTTP / SERVER_WITH_AD.Test.local aqw
我使用以下命令为他创建了一个keytab文件:
ktpass / out c:\ aqw.keytab / mapuser aqw@Test.local / princ HTTP/TOMCAT_SERVER@Test.local / pass * / kvno 0
我将keytab文件传输到Tomcat / conf。
其他信息:
- SERVER_WITH_AD运行Windows Server 2012(x64)
- TOMCAT_SERVER运行Windows 7旗舰版(x64)。
编辑2: 正如Whome所建议的那样,我将地址添加到可信站点列表中。
在某些时候我已经停止看到用户名/登录提示,但我现在在Tomcat中收到错误(显示为HTTP 500错误):
KrbException:无效参数(400) - 无法找到适当类型的密钥以使用HMAC SHA1-96解密AP REP-AES256 CTS模式
所以它可能找不到我的keytab。
答案 0 :(得分:0)
做完&#34;找不到键&#34;错误,我已经翻新了我的conf文件,并提出了Whome的建议,将文件名称为Unix样式。那个和我把它们移到conf文件旁边,以便有最短的路径。我还添加了一个主体as in the server keytab testing procedure described here:,以便我的login.conf是:
spnego-client {
com.sun.security.auth.module.Krb5LoginModule required;
};
spnego-server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="appserver.keytab"
principal=aqw
storeKey=true;
};
这给了我一个校验和错误,所以我重新生成了我的keytab文件。
这又显示出不同的错误:
javax.security.auth.login.LoginException:没有可用于从用户获取身份验证信息的CallbackHandler
所以我编辑了我的web.xml以允许不安全,基本,NTLM提示和localhost。像这样:
<init-param>
<param-name>spnego.prompt.ntlm</param-name>
<param-value>true</param-value>
</init-param>
<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>
奇怪的是,这显示了另一个例外:
javax.security.auth.login.LoginException:没有可用于从用户获取身份验证信息的CallbackHandler
我说奇怪,因为我对它的理解是,通过允许NTLM提示我授权另一个方法进行身份验证。
最奇怪的部分是,今天早上,它有效。我不知道为什么。重启我的服务器后它仍然有效。我得到了#34; Hello用户!&#34;与合适的用户的消息。但是the HelloKeytab test class不起作用。
编辑:最后,它停止工作,无法让它工作。我一直收到校验和错误。所以我最终使用了Waffle。