php7 ldap 通过 TLS 连接和绑定

php7 ldap connect and bind via TLS

我有这个简单的 php 文件:

    $ldap="localhost";
    $port=636;
    $usr="CN=admin";
    $pwd="pwd123";

    $ds=ldap_connect("$ldap", $port); 
    $ldapbind=false;
    // for debugging
    ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 9);
    if(ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3))
    if(ldap_set_option($ds, LDAP_OPT_X_TLS_REQUIRE_CERT, 0))
                    if(ldap_set_option($ds, LDAP_OPT_REFERRALS, 0))
                    if(ldap_start_tls($ds))
                            $ldapbind = @ldap_bind($ds, $usr, $pwd);   
    ldap_close($ds);

    if(!$ldapbind)
            echo "BIND ERROR!\n";
    else
            echo "BIND OK!\n";

尝试在本地主机上连接和绑定 ldap 服务器。 (命令:php testcon.php)。我也将 TLS_REQCERT never 行添加到 /etc/ldap.conf

但是我得到了 BIND ERROR! 结果。此外,我也收到了警告消息:

PHP Warning:  ldap_start_tls(): Unable to start TLS: Can't contact LDAP server in /root/testfolder/testcon.php on line 16

如果我注释掉 16. 行,我不会收到任何警告,但 BIND ERROR! 仍然存在。

更多信息:

我尝试使用 basedn 和不使用 base dn(结果相同)。

Can't contact LDAP server

这可能意味着两件事:

  1. 无法通过网络访问服务器或
  2. 由于证书验证错误,无法建立 TLS 连接

错误信息

ldap_start_tls(): Unable to start TLS

有点误导,因为在使用 ldap_connect() 初始化上下文后,TCP 连接仍未建立。第一个真正的 LDAP 操作称为 ldap_start_tls() 在您的例子中,是打开 TCP 连接。

我会推荐:

  • 在同一台机器上使用 CLI 工具 ldapwhoami 检查是否可以连接
  • 不要关闭证书验证 即使是测试

根据对问题的评论,因为它最终成为答案:

将端口更改为 389。端口 636 用于基于 SSL 的 LDAP,已弃用(实际上从未标准化为 LDAP 的一部分)。 LDAP 从端口 389 工作,当您发出 StartTLS(使用 ldap_start_tls())时,它会加密连接。