Tomcat 6.0.37无法从LDAP检索用户名

时间:2013-11-12 19:21:00

标签: tomcat ldap jndi client-certificates

我一直在撞墙。我最近将Tomcat从6.0.18升级到6.0.37以修复安全团队的一些漏洞。除CAC登录功能外,一切正常。这些配置在6.0.18中工作正常但在6.0.37时没有(给出HTTP500错误) 当用户使用CAC登录时,站点提示要求CAC证书,用户选择证书后,会将用户登录。

基本上,该站点从CAC获取证书并通过LDAP进行身份验证以从LDAP检索用户名。该应用程序使用用户名来验证用户和日志使用。

需要访问/process.jsp才能对用户名进行身份验证。但是在web.xml中它被设置为(受保护页面)

请指点我正确的方向。我真的很感激。

我只是不明白为什么它在Tomcat 6.0.37中不起作用。是否需要为Tomcat 6.0.37

设置任何新配置

下面是server.xml文件中Connector和JNDIRealm的配置:

<Connector port="443" 
    maxHTTPHeaderSize="8192" 
    allowUnsafeLegacyRenegotiation="true" 
    protocol="org.apache.coyote.http11.Http11Protocol" 
    SSLEnabled="true" 
    enableLookups="false" 
    disableUploadTimeout="true" 
    acceptCount="200" 
    maxThreads="150" 
    scheme="https" 
    secure="true" 
    keystoreFile="C:\Tomcat 6.0\cert\xxxx.keystore" 
    keystorePass="changeit" 
    truststoreFile="D:\Sun\SDK\jdk\jre\lib\security\cacerts" 
    truststorePass="changeit" 
    clientAuth="false" 
    sslProtocol="TLS" 
    ciphers="xxxxxxxxx" 
    address="0.0.0.0"/>



<Realm className="org.apache.catalina.realm.JNDIRealm"
    connectionURL="ldap://xxx.xx.xx.xxx/" 
    alternateURL="ldap://xxx.xx.xx.xxx/" 
    connectionName="CN=xxxxxx,OU=xxxx Accounts,OU=xxxxx,DC=xxxx,DC=xxxx,DC=local" connectionPassword="MyPassword" 
    authentication="simple" 
    referrals="follow" 
    userSubtree="true" 
    userBase="OU=xxxxx,DC=xxxx,DC=dhhq,DC=local" 
    userRoleName="xxx" 
    userSearch="(altSecurityIdentities={0})" roleBase="CN=xxxxxxx,OU=xxxxxx,OU=Accounts,DC=xxxx,DC=xxxx,DC=local" roleSubtree="true" 
    roleName="cn" 
    roleSearch="(member={0})" />

web.xml安全配置:

    <security-constraint>
           <web-resource-collection>
                <web-resource-name>Myapp</web-resource-name>
                <url-pattern>/process.jsp</url-pattern>
           </web-resource-collection>
        <auth-constraint>
        <role-name>User</role-name>
        </auth-constraint>   
           <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
       </user-data-constraint>
       </security-constraint>   
    <login-config>
            <auth-method>CLIENT-CERT</auth-method>
            <realm-name>TOMCATLDAP</realm-name>
        </login-config>
    <security-role>
        <role-name>User</role-name>
    </security-role>

1 个答案:

答案 0 :(得分:0)

我终于找到了解决这个问题的方法,但它并不完美...来自web.xml的安全约束:

<security-constraint> 
<web-resource-collection> 
<web-resource-name>Myapp</web-resource-name> 
<!--url-pattern>/process.jsp</url-pattern--> 
</web-resource-collection> 
<auth-constraint> 
<role-name>User</role-name> 
</auth-constraint> 
<user-data-constraint> 
<transport-guarantee>CONFIDENTIAL</transport-guarantee> 
</user-data-constraint> 
</security-constraint> 

它保护了触发智能卡的process.jsp页面,从AD获取用户名,然后process.jsp可以登录用户。我有几天的根本原因是process.jsp无法访问当用户名无法访问process.jsp时,为什么身份验证会死掉。但是,如果我将process.jsp从(受保护的页面)中取出,那么智能卡就不会获得触发器而且根本没有用户名。

我所做的是设置clientAuth =“true”,以便每次网站上的页面访问/点击时智能卡都会触发,这样无论是否需要,都会返回用户名;我也删除了process.jsp,以便用户名可以访问process.jsp并执行魔术来记录用户。它可以工作!问题是现在网站上的每次点击都会触发智能卡,这非常烦人。

任何人都知道为什么即使智能卡身份验证通过也无法访问受保护的页面?(这适用于Tomcat 6.0.37; 6.0.18没有问题,不确定是错误还是安全修复...)或者你能建议一个更好的工作......

谢谢! 映