Играл с этим в течение нескольких дней и не мог заставить php связываться с ldap на DSEE Oracle.
function test(){ // LDAP variables $ldaphost = "xxx.xxxxx.com"; $ldapport = 636; $ldaprdn = 'cn=xyxyxyxy,ou=Accounts,dc=xxx,dc=xxxxx,dc=com'; $ldappass = 'vcvcvcvcvc'; ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7); // isn't helping // Connecting to LDAP $ldapconn = ldap_connect($ldaphost, $ldapport) or die("Could not connect to $ldaphost"); if ($ldapconn) { // binding to ldap server $ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass); // verify binding if ($ldapbind) { echo "LDAP bind successful..."; } else { echo "LDAP bind failed..."; } } }
Я получаю сообщение об ошибке:
Сообщение: ldap_bind () [function.ldap-bind]: невозможно связать с сервером: не удается связаться с сервером LDAP
Разрывая мои волосы на этом. Я просто не могу связать вещь.
Попробовал прямое telnet для хоста на порту 636 и не заблокирован каким-либо брандмауэром. В частности, я не получаю дополнительной информации об отладке из «LDAP_OPT_DEBUG_LEVEL» на экране или в моих журналах.
start_tls()
и ldaps
являются взаимоисключающими, то есть вы не можете выпустить start_tls()
на ssl-порт (стандарт 636) или инициировать ldaps
на незашифрованном порту (стандарт 389). Команда start_tls()
инициирует безопасное соединение по незашифрованному порту после того, как инициировано соединение, поэтому вы должны выдать это до того, как произойдет связывание, чтобы сделать его зашифрованным. Другой набор общих портов – 3268 (незашифрованный) и 3269 (ssl), который может быть включен на вашем сервере.
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
регистрируется в журнале ошибок ваших веб-серверов в зависимости от уровня вашего журнала или от толстого (из PHP CLI). Чтобы получить дополнительную информацию здесь, проверьте настройки уровня журнала вашего веб-сервера или просто запустите php-скрипт из командной строки.
Чтобы успешно использовать порт ssl, вам нужно указать ldaps://
, в то время как на незашифрованном порту это необязательно (с префиксом ldap://
).
Глядя на ваш код, это может быть проблемой протокола, поскольку PHP по умолчанию использует версию 2. Чтобы решить эту проблему, вы можете указать:
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION,3); ldap_set_option($conn, LDAP_OPT_REFERRALS,0);
перед попыткой привязки.
Вы также можете просмотреть код в разделе « Проблемы с безопасным связыванием с Active Directory с помощью PHP, который я успешно использую в CentOS 5, но у вас проблемы с Ubuntu. Если ваш сервер имеет открытый незашифрованный порт, рекомендуется использовать незашифрованное тестовое связывание с ним, чтобы исключить любые проблемы с подключением.
Чтобы проверить, открыт ли порт, вы можете проверить, подключен ли к нему telnet, EG:
telnet my.server.com 3268
Если порт открыт, вы можете связать его.
* Изменить : если сертификат ssl считается недопустимым, соединение завершится неудачно, если это так, установив уровень отладки на 7, вы объявите об этом. Чтобы обойти эту конкретную проблему, вам нужно игнорировать ее действительность:
Вы можете игнорировать действительность в окнах, выдавая
putenv('LDAPTLS_REQCERT=never');
в вашем php-коде. В файле * nix вам необходимо отредактировать файл /etc/ldap.conf, чтобы он содержал
TLS_REQCERT never
Порт 636 является портом с поддержкой SSL и требует подключения с поддержкой SSL. Вы должны попытаться подключиться к порту 389 или изменить свой код, чтобы включить безопасный уровень (гораздо более сложный).
С уважением,
Лодовико
Чтобы подключиться с помощью SSL, вы должны попробовать
$ldapconn = ldap_connect('ldaps://'.$ldaphost);
Это автоматически подключится к порту 636, который является стандартным ldaps
. В зависимости от установки и конфигурации вашего сервера может быть возможно, что подключения разрешены только на порту 389 (без шифрования или использования TLS) или только на порту 636 с использованием SSL-шифрования. Хотя возможно, что ваш сервер предоставляет другие порты. Таким образом, в общем, вам нужно знать, к какому порту подключаться и какой метод шифрования требуется серверу (без шифрования, SSL или TLS).
Является ли сертификат сервера LDAP подписанным действительным ЦС? Возможно, ваш клиент просто отвергает сертификат!