Apache 针对 LDAP 的身份验证因密码带元音变音而失败

Apache 针对 LDAP 的身份验证因密码带元音变音而失败

当从 Apache 服务器针对 LDAP(Active Directory,Server 2008)进行身份验证时,我在错误日志中收到以下消息:

authentication failure for "/": Password Mismatch

仅当密码包含德语变音符号 (ä、ö、ü) 时才会发生这种情况。更改密码或尝试使用密码中不包含变音符号的其他帐户后,身份验证即可正常进行。

这是我的配置:

AuthType Basic
AuthzLDAPAuthoritative off
AuthLDAPURL "ldap://[SERVER]:3268/DC=[DOMAIN]?sAMAccountName?sub?(objectClass=user)"
AuthLDAPBindDN       "user"
AuthLDAPBindPassword "pass"
require valid-user

我在 Debian (2.6.26-2-686) 下使用 Apache2 (2.2.16-6+squeeze1)。有趣的是,上述配置直到昨天都有效(即使密码带有变音符号),而我却没有动过它(我发誓 ;-) )。我已经发现其他人也遇到了同样的问题,但没有解决方案。

有谁知道如何解决这个问题或者下一步该做什么才能识别错误的模块?

谨致问候,Stefan

答案1

似乎某个地方发生了编码问题。我无法告诉你问题出在哪里,但我可以建议如何找到它。

据我了解,有 5 个地方可能会错误地处理或解释编码。这些是:

  1. 浏览器将字符转换为字节并发送到 Web 服务器
  2. Apache 理解这些字节来构建密码字符串
  3. Apache + OpenLDAP 将密码字符串转换为字节以发送到 LDAP 服务器
  4. Active Directory 将 LDAP 绑定请求中的字节转换为可以与其密码数据库进行比较的内容
  5. 设置用户密码时 Active Directory 将字符转换为字节

假设您可以以用户身份登录 Windows,那么我们知道 #5 不是您的问题。您需要做的是确定问题出在哪里。我的直觉是它出现在步骤 2 或 3 中,但我不确定。

首先,确保您不使用 https 与 Web 服务器通信,也不使用 ldaps 与 LDAP 服务器通信。(您可能不希望在生产中使用这种方式,但它可以让生活更轻松)。现在,使用 wireshark 嗅探两条线路的流量,即浏览器 -> Apache 和 Apache -> AD。您在那里看到正确的信息了吗?

接下来,将 Apache 中的日志级别设置为调试,然后查看打印的内容。这不会显示密码,但在调试级别,它应该会显示其他信息,例如用户名。如果您使用包含重音符号的假用户名,它们会正确显示吗?

一旦您确定了破坏编码的步骤,您就已经知道了如何修复它的 90%!

相关内容