Tomcat 6 使用 SPNEGO SSO 仍然提示输入登录名和密码
Tomcat 6 with SPNEGO SSO still prompts for login and password
我正在尝试使用 SPNEGO filter.
为 Tomcat (6) 设置 Windows Active Directory SSO
我已经按照示例进行了设置,但是当我尝试访问 hello_spnego.jsp.
时,系统仍然提示我输入登录名和密码
我可能遗漏了什么,所以这是我的配置文件:
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"
;
};
编辑:这是我所做的:
- 我在我的服务器上创建了一个用户 (aqw),SERVER_WITH_AD
我使用以下命令设置他的 SPN:
setspn -A HTTP/SERVER_WITH_AD.Test.local aqw
我使用以下命令为他创建了一个密钥表文件:
ktpass /out c:\aqw.keytab /mapuser aqw@Test.local /princ HTTP/TOMCAT_SERVER@Test.local /pass * /kvno 0
我将 keytab 文件传输到 Tomcat/conf。
- 我将 login.conf 和 krb5.conf 添加到 Tomcat/conf。
- 我编辑了我的用户帐户(在 AD 的用户界面上)以接受 AES 128 位加密。
- 我在 SO 的另一个问题中找到信息后,将 JCE 罐子添加到我的 jdk1.7。0_51/jre/lib/security 来自 this page。
附加信息:
- SERVER_WITH_AD 运行 Windows Server 2012 (x64)。
- TOMCAT_SERVER 运行 Windows 7 Ultimate (x64)。
编辑 2:
按照 Whome 的建议,我将地址添加到受信任站点的列表中。
有时我不再看到 username/login 提示,但我现在在 Tomcat 中收到错误(显示为 HTTP 500 错误):
KrbException:参数无效 (400) - 找不到适当类型的密钥来解密 AP REP - AES256 CTS 模式与 HMAC SHA1-96
所以它可能找不到我的密钥表。
出现 "cannot find key" 错误后,我重新阅读了我的 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 提示符和本地主机。像这样:
<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 提示我授权另一个方法进行身份验证。
最奇怪的是今天早上,它起作用了。我不知道为什么。重新启动我的服务器后它仍然有效。我收到了正确用户的 "Hello user!" 消息。但是 the HelloKeytab test class 不起作用。
编辑:最后,它停止工作并且无法正常工作。我一直收到校验和错误。所以我最终使用了 Waffle.
我正在尝试使用 SPNEGO filter.
为 Tomcat (6) 设置 Windows Active Directory SSO我已经按照示例进行了设置,但是当我尝试访问 hello_spnego.jsp.
时,系统仍然提示我输入登录名和密码我可能遗漏了什么,所以这是我的配置文件:
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"
;
};
编辑:这是我所做的:
- 我在我的服务器上创建了一个用户 (aqw),SERVER_WITH_AD
我使用以下命令设置他的 SPN:
setspn -A HTTP/SERVER_WITH_AD.Test.local aqw
我使用以下命令为他创建了一个密钥表文件:
ktpass /out c:\aqw.keytab /mapuser aqw@Test.local /princ HTTP/TOMCAT_SERVER@Test.local /pass * /kvno 0
我将 keytab 文件传输到 Tomcat/conf。
- 我将 login.conf 和 krb5.conf 添加到 Tomcat/conf。
- 我编辑了我的用户帐户(在 AD 的用户界面上)以接受 AES 128 位加密。
- 我在 SO 的另一个问题中找到信息后,将 JCE 罐子添加到我的 jdk1.7。0_51/jre/lib/security 来自 this page。
附加信息:
- SERVER_WITH_AD 运行 Windows Server 2012 (x64)。
- TOMCAT_SERVER 运行 Windows 7 Ultimate (x64)。
编辑 2: 按照 Whome 的建议,我将地址添加到受信任站点的列表中。
有时我不再看到 username/login 提示,但我现在在 Tomcat 中收到错误(显示为 HTTP 500 错误):
KrbException:参数无效 (400) - 找不到适当类型的密钥来解密 AP REP - AES256 CTS 模式与 HMAC SHA1-96
所以它可能找不到我的密钥表。
出现 "cannot find key" 错误后,我重新阅读了我的 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 提示符和本地主机。像这样:
<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 提示我授权另一个方法进行身份验证。
最奇怪的是今天早上,它起作用了。我不知道为什么。重新启动我的服务器后它仍然有效。我收到了正确用户的 "Hello user!" 消息。但是 the HelloKeytab test class 不起作用。
编辑:最后,它停止工作并且无法正常工作。我一直收到校验和错误。所以我最终使用了 Waffle.