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