LDAP和PHP连接失败(LDAP and PHP connection failure)

2019-06-24 05:42发布

我试图连接到通过PHP安全LDAP服务器(使用的LDAP),但我有它的问题。 我得到以下错误

警告:的ldap_bind()[function.ldap绑定]:无法绑定到服务器:无法联系LDAP服务器中/var/www/test.php上线16

我的作品时,我尝试不连接的LDAP,但要求我使用的LDAP,因为我将要处理敏感信息。

我使用下面的代码

<?php
// basic sequence with LDAP is connect, bind, search, interpret search
// result, close connection

echo "<h3>LDAP query test</h3>";
echo "Connecting ...";
$ds=ldap_connect("ldaps://server");  // must be a valid LDAP server!




print $ds;

if ($ds) { 
    echo "<br><br>Binding ..."; 
    $r=ldap_bind($ds);     // this is an "anonymous" bind, typically
                           // read-only access
    echo "Bind result is " . $r . "<br />";

    echo "Searching for (sn=S*) ...";
    // Search surname entry
    $sr=ldap_search($ds, "ou=people,o=server.ca,o=server", "uid=username*");  
    echo "Search result is " . $sr . "<br />";

    echo "Number of entires returned is " . ldap_count_entries($ds, $sr) . "<br />";

    echo "Getting entries ...<p>";
    $info = ldap_get_entries($ds, $sr);
    echo "Data for " . $info["count"] . " items returned:<p>";

print_r($info);
//    for ($i=0; $i<$info["count"]; $i++) {
//        echo "dn is: " . $info[$i]["dn"] . "<br />";
//        echo "first cn entry is: " . $info[$i]["cn"][0] . "<br />";
//        echo "first email entry is: " . $info[$i]["mail"][0] . "<br /><hr />";
//    }

    echo "Closing connection";
    ldap_close($ds);

} else {
    echo "<h4>Unable to connect to LDAP server</h4>";
}
?>

Answer 1:

作为警告将是不同的,如果LDAP服务器无法验证凭证的问题与实际结合的过程(无效凭据)。 但正如保罗·狄克逊指出使用ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)应要求-尽管我不认为这是你的问题的原因。

  • 你连接到LDAP服务器类型? OpenLDAP的,Active Directory或其他什么东西?
  • 什么是计算机中运行你的PHP程序的操作系统?
  • 您是否使用LDAP服务器上的自签名SSL证书,是通过运行你的PHP程序的机器信任给定证书的证书颁发机构?
  • 哪个端口也LDAP服务器上运行? 636将是“官方”的端口LDAPS。 也许你可以明确地添加端口服务器地址: ldaps://<<server>>:636

ext/ldap与SSL / TLS安全连接的一些问题。 你可以尝试添加

TLS_REQCERT never

ldap.conf/etc/ldap.conf/etc/ldap/ldap.conf上基于* NIX的系统)或用于Windows机器创建ldap.conf与上述内容C:\OpenLDAP\sysconf\ldap.conf (因为它是硬编码到延伸的路径必须是精确匹配)。



Answer 2:

这似乎是使用SSL / TLS某些服务器上最近的PHP版本中的问题。 不知道为什么。 你可以参考我的文章在: 问题与安全绑定到Active Directory使用PHP

其中一个更可能的原因是从斯特凡原因。 为了确保这真的是这样,你可以使用:

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

之前你ldap_connect。 这将打印出更健全的错误信息进行登录(通常SSL证书无效,参考文献斯特凡格里克)



Answer 3:

虽然老了,我也遇到同样的问题,并希望提供一些见解为未来的读者。

问题的一部分是出于过期OpenSSL库,0.9.6 VS 1.0.0(这工作)。

更新服务器上的OpenSSL后,有人指出,PHP失去了OpenSSL的支持。

您可以检查与命令行下面的模块的支持:

php -m 

要么

echo phpinfo(INFO_MODULES);

从浏览器。

此外,在我的职业经验,使用OCI8 /甲骨文LDAP库时,已经出现了很多的问题与SSL支持LDAP。 在Debian平台,Libldap-2.4.2-dev的包是最好的。

此外,你应该看看LDAP服务器上的连接日志。 我几乎可以保证,你将看到指SSLv3的错误和丢失的证书的CA.

默认情况下,PHP将查找在UNIX系统中的CA文件,请确保它是由PHP调用可读(通过CLI,Apache用户,等用户):

/etc/pki/CA

这不一定是一个PHP的问题,但安全LDAP配置问题。 请参阅此PHP错误报告 ,这OpenLDAP的线程 。

上面的OpenLDAP的线程有一个工作的OpenLDAP配置参考的一个片段。

一些其他的事情要检查是在/ etc / services中的服务定义。 请确保您有以下几点:

ldaps           636/tcp                         # LDAP over SSL
ldaps           636/udp


Answer 4:

我想,你只需要设置LDAP协议版本为3

echo "<h3>LDAP query test</h3>";
echo "Connecting ...";

$ldap_server = 'ldaps://server';
$ldap_port = '636';

$ds = ldap_connect($ldap_server, $ldap_port);

if ($ds) 
{
    //add this
    if (!ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) 
    {
        fatal_error("Failed to set LDAP Protocol version to 3, TLS not supported.");
    }
    echo "<br><br>Binding ..."; 
    $r=ldap_bind($ds);     // this is an "anonymous" bind, typically
                       // read-only access
    echo "Bind result is " . $r . "<br />";

    echo "Searching for (sn=S*) ...";
    // Search surname entry
    $sr=ldap_search($ds, "ou=people,o=server.ca,o=server", "uid=username*");  
    echo "Search result is " . $sr . "<br />";

    echo "Number of entires returned is " . ldap_count_entries($ds, $sr) . "<br />";

    echo "Getting entries ...<p>";
    $info = ldap_get_entries($ds, $sr);
    echo "Data for " . $info["count"] . " items returned:<p>";

    print_r($info);
    //    for ($i=0; $i<$info["count"]; $i++) {
    //        echo "dn is: " . $info[$i]["dn"] . "<br />";
    //        echo "first cn entry is: " . $info[$i]["cn"][0] . "<br />";
    //        echo "first email entry is: " . $info[$i]["mail"][0] . "<br /><hr />";
    //    }

    echo "Closing connection";
    ldap_close($ds);

} 
else 
{
    echo "<h4>Unable to connect to LDAP server</h4>";
}


Answer 5:

在UNIX上 “人的ldap.conf”= ...概要/usr/local/etc/openldap/ldap.conf ...

TLS_REQCERT从未 /usr/local/etc/openldap/ldap.conf并设置ldap_set_option($ DS,LDAP_OPT_PROTOCOL_VERSION,3)

这项工作在我的项目上的Nginx + PHP-FPM:nginx的/ 1.6.0 php55-5.5.15 php55-LDAP-5.5.15 OpenLDAP的客户端,2.4.39_1



Answer 6:

尽量使你的LDAP服务器上的“匿名绑定”或使用正确的绑定(用户名/密码)。

cn=ldapauthuser,ou=accounts,dc=example,dc=com



文章来源: LDAP and PHP connection failure
标签: php ldap