Active-Directory

Tomcat 9.0.46 的解決方法(錯誤 65308) - JNDIRealm 中的 NPE

  • May 20, 2021

在 Tomcat 9.0.46 中使用 JNDIRealm/ActiveDirectory 時有人遇到過 NPE 錯誤並有解決方法嗎?

語境

我不得不從 9.0.43 升級,因為在啟用 keep-alive/re-use 時套接字輸入流被損壞(並混淆了請求主體)的並發錯誤。日誌中充滿了“解析 HTTP 請求標頭時出錯”和“HTTP 方法名稱必須是令牌 000x000x000x000x000x…”等。升級到 9.0.46 後,此問題已解決,但現在我們的 ActiveDirectory 登錄已損壞。

日誌

17-May-2021 14:31:49.405 INFO [Catalina-tomcat-workers-thread7] org.apache.catalina.realm.JNDIRealm.authenticate Exception performing authentication. Retrying...
   java.lang.NullPointerException
           at org.apache.catalina.realm.JNDIRealm.doAttributeValueEscaping(JNDIRealm.java:2884)
           at org.apache.catalina.realm.JNDIRealm.getRoles(JNDIRealm.java:1892)
           at org.apache.catalina.realm.JNDIRealm.authenticate(JNDIRealm.java:1350)
           at org.apache.catalina.realm.JNDIRealm.authenticate(JNDIRealm.java:1232)
           at org.apache.catalina.realm.CombinedRealm.authenticate(CombinedRealm.java:191)
           at org.apache.catalina.realm.CombinedRealm.authenticate(CombinedRealm.java:191)
           at org.apache.catalina.realm.LockOutRealm.authenticate(LockOutRealm.java:154)
           at org.apache.catalina.authenticator.BasicAuthenticator.doAuthenticate(BasicAuthenticator.java:101)
           at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:632)

漏洞

根據錯誤報告(https://bz.apache.org/bugzilla/show_bug.cgi?id=65308),userRoleAttribute為空/null存在問題。估計再過 3-4 週就不會發布了。

Tomcat 文件(https://tomcat.apache.org/tomcat-9.0-doc/realm-howto.html#JNDIRealm)說:

roleSearch - the LDAP search filter for selecting role entries.
It optionally includes pattern replacements "{0}" for the distinguished name and/or "{1}" for the username and/or "{2}" for an attribute from user's directory entry, of the authenticated user.
Use userRoleAttribute to specify the name of the attribute that provides the value for "{2}".

我沒有在 roleSearch 屬性中使用“{2}”,所以我不需要設置userRoleAttribute。儘管如此,我還是嘗試將其設置為非空,但無濟於事。

在他們發布 9.0.47 之前,我需要一個解決方法。有接盤俠嗎?

由於您已經完成了尋找更新檔的繁重工作,因此最簡單的*“解決方法”*是修補受該錯誤影響的類。

你只需要:

  1. 下載更新檔JNDIRealm.java文件,
  2. 針對 Tomcat 的 jar 編譯它:
javac -cp '/path/to/tomcat/lib/*:/path/to/tomcat/bin/*' JNDIRealm.java
  1. 將生成的類文件放入$CATALINA_BASE/lib/org/apache/catalina/realm. 由於通用載入器的配置方式,類文件將覆蓋catalina.jar.

引用自:https://serverfault.com/questions/1063875