PHP не может подключиться к LDAP Oracle Directory Server Enterprise Edition
Играл с этим в течение нескольких дней и не может заставить 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() [функция.ldap-привязка]: Не удается выполнить привязку к серверу: Не удается связаться с сервером LDAP
Рву на себе волосы из-за этого. Я просто не могу заставить эту штуку привязаться.
Попробовали прямой telnet к хосту на порту 636 и не блокируются никаким брандмауэром. Странно, что я не получаю никакой дополнительной отладочной информации от "LDAP_OPT_DEBUG_LEVEL" на экране или в моих журналах.
4 answers
start_tls()
и ldaps
является взаимоисключающим, что означает, что вы не можете выдавать start_tls()
на порту ssl (стандарт 636) или инициировать ldaps
на незашифрованном порту (стандарт 389). Команда start_tls()
инициирует безопасное соединение на незашифрованном порту после инициализации соединения, поэтому вы должны выполнить это до того, как произойдет привязка, чтобы сделать его зашифрованным. Другой набор распространенных портов - 3268 (незашифрованный) и 3269 (ssl), которые могут быть включены на вашем сервере.
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
Ведет журнал в журнал ошибок ваших веб-серверов, в зависимости от вашего уровня журнала, или в stout (из командной строки PHP). Чтобы получить дополнительную информацию здесь, проверьте настройки уровня журнала вашего веб-сервера или просто запустите 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, Например:
telnet my.server.com 3268
Если порт открыт, то вы должны иметь возможность выполнить привязку с его помощью.
* Редактировать: Если сертификат ssl будет признан недействительным, соединение завершится ошибкой, если это так, установка уровня отладки на 7 объявит об этом. Чтобы обойти эту конкретную проблему, вам нужно игнорировать действительность:
Вы можете игнорировать действительность в Windows, выдав
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 действительным центром сертификации? Может быть, ваш клиент просто отклоняет сертификат!