带有SPNEGO SSO的Tomcat 6仍然提示输入登录名和密码

时间:2015-07-02 17:20:19

标签: java tomcat single-sign-on spnego

我正在尝试使用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"
    ;
};
编辑:这就是我的所作所为:

  • 我在服务器上创建了一个用户(aqw),SERVER_WITH_AD
  • 我使用以下命令设置了他的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。

  • 我将login.conf和krb5.conf添加到Tomcat / conf。
  • 我编辑了用户的帐户(在AD的用户界面上)以接受AES 128位加密。
  • 在找到SO上另一个问题的信息后,我从this page将jCE jars添加到了我的jdk1.7.0_51 / jre / lib / security。

其他信息:
- 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。

1 个答案:

答案 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