Сбой подключения к 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>"; } ?> 

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

Проблема не связана с фактическим процессом привязки (недопустимыми учетными данными), поскольку предупреждение будет другим, если LDAP-сервер не смог аутентифицировать ваши учетные данные. Но, как ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3) Пол Диксон, использование 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 (путь должен быть точным, так как он жестко закодирован в расширение).

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

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

 ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7); 

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

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

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

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

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

 php -m 

Или

 echo phpinfo(INFO_MODULES); 

Из браузера.

Кроме того, было много проблем с поддержкой SSL для LDAP при использовании OCI8 / Oracle LDAP libs в моем профессиональном опыте. На платформах 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 

Я думаю, вам просто нужно установить версию протокола 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>"; } 

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

например cn=ldapauthuser,ou=accounts,dc=example,dc=com

В 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-ldap-5.5.15 openldap-client-2.4.39_1