Сбой подключения к LDAP и PHP

Я пытаюсь подключиться к безопасному 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>";
}
?>

Ответы

Ответ 1

Проблема не связана с фактическим процессом привязки (недопустимыми учетными данными), поскольку предупреждение будет другим, если сервер 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 on * nix) или для машин Windows создайте ldap.conf с указанным выше содержимым в C:\OpenLDAP\sysconf\ldap.conf (путь должен быть точным совпадением жестко закодирован в расширение).

Ответ 2

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

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

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

перед вашим ldap_connect. Это приведет к печати более правильного сообщения об ошибке для журнала (обычно ssl cert недействителен, ссылка Stefan Gehrig)

Ответ 3

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

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

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

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

php -m 

Или

echo phpinfo(INFO_MODULES);

В браузере.

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

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

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

/etc/pki/CA

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

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

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

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

Ответ 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>";
}

Ответ 5

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

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

Ответ 6

В 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