昨天突然间,我的一台 apache 服务器无法连接到我的 LDAP (AD) 服务器。我在该服务器上运行了两个站点,当用户登录到任一站点时,这两个站点都使用 LDAP 对我的 AD 服务器进行身份验证。两天前它一直运行良好。由于未知原因,截至昨天,它停止工作。错误日志只说:
auth_ldap authenticate: user foo authentication failed; URI /FrontPage [LDAP: ldap_simple_bind_s() failed][Can't contact LDAP server], referer: http://mysite.com/
我想也许我的自签名 SSL 证书已经过期,所以我为 mysite.com 创建了一个新证书,但没有为服务器主机名本身创建一个,问题仍然存在。我启用了调试级别的日志记录。它显示了与 LDAP 服务器的完整 SSL 事务,并且在我收到“无法联系 LDAP 服务器”消息之前,它似乎一直没有错误地完成。我可以从这个服务器上的命令行运行 ldapsearch,我可以登录到它,它也使用 LDAP,所以我知道服务器可以连接和查询 LDAP/AD 服务器。只有apache无法连接。
谷歌搜索没有任何结果,所以我在这里问。任何人都可以提供有关此问题的见解吗?
这是 apache 配置中的 LDAP 部分:
<Directory "/web/wiki/">
Order allow,deny
Allow from all
AuthType Basic
AuthName "Login"
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
#AuthBasicAuthoritative off
AuthLDAPUrl ldaps://domain.server.ip/dc=full,dc=context,dc=server,dc=name?sAMAccountName?sub
AuthLDAPBindDN cn=ldapbinduser,cn=Users,dc=full,dc=context,dc=server,dc=name
AuthLDAPBindPassword password
require valid-user
</Directory>
来自 httpd 服务器/LDAP 客户端的数据包跟踪显示有关 CA 未知的消息。
TLSv1 警报(级别:致命,描述:未知 CA)
我在 httpd.conf 中找到并添加了以下选项:
这解决了我在 CentOS 6 下的问题。CentOS 5 httpd 服务器不需要任何修改,并且在没有选项的情况下一直工作。
我之前在 Windows 2003 上使用 AD 时遇到过类似的问题:我发现的解决方案是不使用完整的 DN 进行绑定,而是使用 user@domain 语法:
您是否有权访问 LDAP 服务器中的日志?它们可能有助于解决此问题。
当包更新导致客户端 ldap.conf(通常是 /etc/ldap.conf 或 /etc/openldap/ldap.conf)发生更改并将 TLS_REQCERT 选项重置为更严格的设置时,我已经看到了这种情况。它可以正确协商 SSL,但最终仍会失败,因为它无法验证来自受信任根的证书链。
您可能需要检查服务器的时钟。如果时间差超过几分钟,则验证票将无效。
虽然这不完全是错误消息,但“另一台服务器突然遇到同样的问题”部分可能表明存在这样的问题。
您需要导入 LDAP CA 证书才能使用 LDAPS
我有一个类似的问题,我通过运行以下命令确定了这个问题:
openssl s_client -connect $ldap_host:636 -state -nbio 2>&1
. 我认为 mod_ldap 在下面使用 openssl,所以这对于调试应该是相当一致的。我将它与我知道正在运行的另一台 SSL 加密服务器进行了比较。正确验证的 SSL 连接将显示一条链到根 CA 并返回 0。SSL 验证失败将给出一个数字和原因。您可以使用输出来确定出了什么问题。
就我而言,LDAP 服务器证书由 Verisign 签名,它使用Intermediate CA certs。OpenSSL 无法验证证书并且连接被拒绝(“连接被服务器拒绝”没有帮助)。
我有一个类似的问题。我可以使用 openssl 获得证书,我可以在相同端口上使用 ldapsearch 通过 SSL 查询 Active Directory。最后,我更改为 Microsoft 全局目录端口 3268 或 3269,它们都可以工作。Microsoft Windows 2003 服务器已经打了补丁,但是这发生在问题开始发生前几天。
我在我们所有的服务器上实施 LDAPS,也遇到了这个问题。如果您恢复为纯文本 LDAP,它会消失吗(不理想,但有助于了解问题的根源)。如果是这样,我还没有找到解决方案,但也许我们可以一起隔离 authnz_ldap 中的错误。
我假设您的命令行实验使用与您的 apache 配置中相同的“绑定用户”。如果没有,您应该检查您是否拥有正确的当前密码。
过去,我曾经不得不为 AD 域使用全局编录端口而不是标准 LDAP 端口。我不记得为什么。对于上面 url 中的 ldaps,这将是端口 3269。