每当尝试使用 SSL 绑定到 LDAP(活动目录)时,我们的脚本都会继续失败,这让我很困惑。我们可以使用不安全的方法成功连接,但我们尝试执行需要 SSL 的密码更改。我们的脚本片段如下:
配置.php
// SSL
$LDAPDOMAIN="dc=campus,dc=local";
$LDAPLOCALDOMAIN="campus.local";
$LDAPHOST='ldaps://localhost';
$LDAPPORT=636;
$ldap = ldap_connect($LDAPHOST, $LDAPPORT) or die ('<p class="message">Error connecting');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
reset.php (使用 config.php)
if ($ldap) {
$bind = @ldap_bind($ldap,$username."@".$LDAPLOCALDOMAIN,$password);
if (!($bind)) {
@ldap_close($ldap);
die ('<p class="message">Your password is incorrect, please try again
<a href=javascript:history.back()>click here</a><br>');
}
无论我们做什么,脚本都会在 reset.php 中“死亡”。当我们使用常规 LDAP 时,我们至少可以进行通信。我们的 config.php 代码如下:
$ldap = ldap_connect($LDAPHOST) or die ('<p class="message">Error connecting to LDAP');
我非常感谢您的帮助,并提前向您表示感谢。
更新*
我尝试运行以下简单程序来测试我的 LDAP。SSL 仍然不起作用,但常规 LDAP 可以。这是配置问题吗?我的证书应该没问题,我创建了一个新证书并注册了我的服务器。我使用了一个 LDAP 实用程序,它可以很好地绑定和连接。但不是 PHP。
<?php
$ldap = ldap_connect("ldaps://localhost/");
$username="[email protected]";
$password="password";
if($bind = ldap_bind($ldap, $username,$password ))
echo "logged in";
else
echo "fail";
echo "<br/>done";
?>
我的结果是失败。
答案1
您可以尝试运行ldapsearch
并给我们错误输出吗?它看起来像这样:
ldapsearch -x -d 1 -LLL -H ldaps://localhost -b 'dc=campus,dc=local' -D 'username' -W '(sAMAccountName=username)'
其中参数为:
- -x:强制连接使用简单身份验证而不是 SASL(模拟 PHP ldap_bind() 函数)
- -d 1:显示调试输出,增加数字以获得更详细的信息
- -LLL:更改输出格式以删除一些调试不需要的 LDIF 信息
- -H:主机 URI 说明符;您可以将其更改为“ldap://”以测试非 SSL 绑定
- -b:绑定 DN
- -D:绑定凭证用户名、CN 或其他识别字符串
- -W:强制
ldapsearch
要求输入密码
如果您使用 SASL 通过 LDAPS 连接到 Active Directory 服务器,则需要设置“最大ssf“参数设置为零。我不太清楚 PHP 的 LDAP 函数是如何工作的,所以如果您能弄清楚如何工作的话,可能值得尝试设置该参数。