列表,如何使用Tomcat 7爲PKI用戶證書身份驗證配置JNDI Realm?
我實際上在這個主題上進行了大量搜索,或者a)我不知道如何配置某些東西和/或b)我不太明白JNDI Realm究竟應該做什麼。我正在使用Tomcat 7.0.32和jdk 1.7.0_15。
這是我想要做的。我與使用PKI用戶證書的客戶合作。用戶證書有一個像「Joe Smith」這樣的cn。我需要做的是在LDAP中查找此CN並獲取用戶標識,可能類似於「jsmith23」,並在請求標頭中填充Principal用戶。原因是我在Tomcat中部署了一個專門調用getRemoteUser()的應用程序,並且此ID(例如「jsmith23」)必須正確填充。此應用程序有點像另一個第三方工具的Web適配器,因此會再次檢查LDAP。但是,它必須是這個用戶名。
我嘗試了很多事情,但似乎無法通過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身份驗證。
它提示我申請我的證書,所以我知道通過了。本地主機日誌文件顯示:
FINE:Realm.authenticate()返回false
但是,我知道我是正確連接,因爲如果我更改了密碼,我不能打的部位都沒有。
我想我的問題之一是JNDI領域設置的結果是什麼。如果它在LDAP中查找用戶名的CN,那麼是什麼?這是否假設提供進行我的Web應用程序所需的身份驗證?如果我將所有內容都更改爲BASIC並使用用戶名/密碼進行身份驗證,則完美無缺。但是使用CLIENT-CERT並使用LDAP查找,我似乎無法達到我需要的。
我需要一個基於證書CN查找用戶ID的進程,然後在http請求中填充Principal用戶,以便稍後調用getTemoteUser()可以正常工作。
任何幫助,將不勝感激。