Ошибка соединения с LDAP и PHP - PullRequest
15 голосов
/ 26 июня 2009

Я пытаюсь подключиться к защищенному серверу LDAP (используя LDAP) через PHP, но у меня проблемы с ним. Я получаю следующую ошибку

Предупреждение: ldap_bind () [function.ldap-bind]: Невозможно привязать к серверу: Невозможно связаться с сервером 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>";
}
?>

Ответы [ 6 ]

8 голосов
/ 07 сентября 2009

Проблема не связана с фактическим процессом привязки (неверные учетные данные), поскольку предупреждение будет другим, если сервер LDAP не сможет аутентифицировать ваши учетные данные. Но, как заметил Пол Диксон , необходимо использовать ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3) - хотя я не думаю, что это является причиной ваших проблем.

  • К какому типу сервера LDAP вы подключаетесь? OpenLDAP, Active Directory или что-то еще?
  • Какая операционная система компьютера, на котором работает ваша PHP-программа?
  • Используете ли вы самозаверяющий сертификат SSL на сервере LDAP и доверяет ли центр сертификации для данного сертификата машине, на которой выполняется программа 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 (путь должен быть точно совпадающим, так как жестко запрограммирован в расширение).

2 голосов
/ 14 июня 2012

Несмотря на то, что я стар, я столкнулся с той же проблемой и хотел дать некоторое представление будущим читателям.

Часть проблемы заключалась в устаревших библиотеках OpenSSL, 0.9.6 против 1.0.0 (которые работали).

После обновления OpenSSL на сервере было отмечено, что PHP утратил поддержку OpenSSL.

Вы можете проверить поддержку модулей с помощью следующего из командной строки:

php -m 

или

echo phpinfo(INFO_MODULES);

Из браузера.

Кроме того, было много проблем с поддержкой SSL для LDAP при использовании библиотек OCI8 / Oracle LDAP в моем профессиональном опыте. На платформах Debian лучше всего работают пакеты Libldap-2.4.2-dev.

Кроме того, вы должны просмотреть журналы соединений на сервере LDAP. Я почти гарантирую, что вы увидите ошибку, ссылающуюся на SSLv3 и пропущенную CA для сертификата.

По умолчанию PHP ищет файл CA в системах UNIX в, убедитесь, что он доступен для чтения с помощью PHP invoker (пользователь через cli, пользователь Apache и т. Д.):

/etc/pki/CA

Это не обязательно проблема PHP, но проблема конфигурации с Secure LDAP. Пожалуйста, посмотрите этот отчет об ошибках PHP и эту ветку OpenLDAP .

В приведенной выше ветке OpenLDAP есть фрагмент рабочей конфигурации OpenLDAP для справки.

Некоторые другие вещи, которые нужно проверить, это определения ваших служб в / etc / services. Убедитесь, что у вас есть следующее:

ldaps           636/tcp                         # LDAP over SSL
ldaps           636/udp
2 голосов
/ 28 марта 2011

Кажется, это проблема с использованием SSL / TLS на некоторых серверах с последними версиями PHP. Не уверен почему. Вы можете обратиться к моему сообщению по адресу: Проблемы с безопасным связыванием с Active Directory с использованием PHP

Одна из наиболее вероятных причин - причина от Стефана. Чтобы убедиться, что это действительно так, вы можете использовать:

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

до вашего ldap_connect. Это напечатает более вменяемое сообщение об ошибке для регистрации (обычно ssl-сертификат недействителен, ref. Stefan Gehrig)

0 голосов
/ 12 августа 2014

В UNIX "man 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-5.5.15-LDAP OpenLDAP-клиент-2.4.39_1

0 голосов
/ 07 сентября 2009

Попробуйте включить «анонимные привязки» на вашем LDAP-сервере или использовать правильную привязку (имя пользователя / пароль).

нравится cn=ldapauthuser,ou=accounts,dc=example,dc=com

0 голосов
/ 26 июня 2009

Я думаю, вам просто нужно установить версию протокола 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>";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...