tomcat - 如何使用 Tomcat 7 配置 JNDI 领域以进行 PKI 用户证书身份验证?

标签 tomcat certificate jndi pki jdbcrealm

列表,

我实际上已经就这个主题进行了广泛的搜索,或者 a) 我不知道如何配置某些东西和/或 b) 我不太明白 JNDI 领域实际上应该做什么。我正在使用 Tomcat 7.0.32 和 jdk 1.7.0_15。

这是我想做的。我与使用 PKI 用户证书的客户合作。用户证书有一个类似“Joe Smith”的 cn。我需要做的是在 LDAP 中查找此 CN 并获取用户 ID,这可能类似于“jsmith23”,并在请求 header 中填充主要用户。这样做的原因是我在 Tomcat 中部署了一个应用程序,它专门调用 getRemoteUser() 并且必须正确填充此 ID(例如“jsmith23”)。此应用程序有点像另一个第三方工具的 Web 适配器,它随后会再次检查 LDAP。但是,必须是这个userid。

我已经尝试了很多东西,但我似乎无法通过 LDAP 查找。在我的 server.xml 中,它看起来像下面这样:

     <Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
                   maxThreads="150" scheme="https" secure="true"
                   clientAuth="true" sslProtocol="TLS"
                   keystoreFile="c:/tomcat7/pki/keystore.jks" keystorePass="changeit"
                   truststoreFile="c:/tomcat7/pki/cacerts.jks" truststorePass="changeit" />

<Realm className="org.apache.catalina.realm.JNDIRealm" debug="99" 
                connectionURL="ldap://servername:3268"
                allRolesMode="authOnly" 
                connectionName="cn=DC Services,OU=Generic,OU=Users,OU=Managed Objects,DC=domain,DC=com" 
                connectionPassword="mypassword" 
                userBase="DC=domain,DC=com" 
                userSubtree="true" 
                userSearch="cn={0}" 
                userRoleName="memberOf" />

我的应用程序的 web.xml 文件如下所示:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>ArcGIS Web Adapter</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</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>ArcGIS Web Adapter</realm-name>
</login-config>
<security-role>
    <role-name>*</role-name>
</security-role>
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

我遇到的问题是,无论我尝试什么,我都会不断收到此错误:

消息无法使用提供的凭据进行身份验证 描述 此请求需要 HTTP 身份验证。

它提示我提供我的证书,所以我知道它通过了。本地主机日志文件显示:

很好:Realm.authenticate() 返回 false

但是,我知道我连接正常,因为如果我更改密码,我根本无法访问该站点。

我想我的问题之一是 JNDI 领域设置的结果是什么。如果它在 LDAP 中查找用户名的 CN,然后呢?是否应该提供继续我的 Web 应用程序所需的身份验证?如果我将所有内容更改为 BASIC 并使用用户名/密码进行身份验证,它就可以完美运行。但是使用 CLIENT-CERT 和使用 LDAP 查找,我似乎无法实现我需要的。

我需要一个基于证书 CN 查找用户 ID 的过程,然后在 http 请求中填充主要用户,以便稍后对 getTemoteUser() 的调用能够正常工作。

如有任何帮助,我们将不胜感激。

最佳答案

问题是 org.apache.catalina.realm.JNDIRealm 需要用户名和密码。使用 CLIENT-CERT 进行身份验证时,org.apache.catalina.realm.RealmBase 能够使用证书中的 DN 作为用户名, 但无法获得 JNDIRealm 所需的密码。

关于tomcat - 如何使用 Tomcat 7 配置 JNDI 领域以进行 PKI 用户证书身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16639382/

相关文章:

java - tomcat6无法部署solr

php - 在 apache tomcat 服务器上使用 CakePHP

powershell - 使用Powershell导出包含私钥的证书,包括路径中的所有证书

ssl - 供内部使用的 HTTPS 证书

java - JTDS 数据源的 Tomcat 8 配置

java - Tomcat 返回 AppData 的错误路径

java - 如何禁用特定 WAR 或 EAR 的应用程序服务器嵌入式库 (jar)?

ios - 是否可以在测试的iPhone上安装我的App

java - 获取 Active Directory 中具有特殊字符的组名称的组属性

java - 在Tomcat中创建mssql数据库jndi资源时出现异常