PHP не может подключиться к LDAP Oracle Directory Server Enterprise Edition - PullRequest
2 голосов
/ 04 мая 2011

Играю с этим уже несколько дней и не могу заставить php связываться с ldap на Oracle DSEE.

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

Разрываю мои волосы на этом.Я просто не могу заставить эту вещь связываться.

Попытался подключиться напрямую к хосту через порт 636 и не блокируется никаким брандмауэром.Как правило, я не получаю никакой дополнительной отладочной информации из 'LDAP_OPT_DEBUG_LEVEL' на экране или в моих журналах.

Ответы [ 4 ]

3 голосов
/ 11 мая 2011

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, E.G:

telnet my.server.com 3268

Если порт открыт, то вы сможете связываться с ним.

* Редактировать : Если сертификат ssl считается недействительным, соединение не будет установлено; в этом случае установка уровня отладки на 7 сообщит об этом. Чтобы обойти эту конкретную проблему, вам нужно игнорировать действительность:

Вы можете игнорировать действительность в Windows, введя

putenv('LDAPTLS_REQCERT=never');

в вашем php-коде. В * nix вам нужно отредактировать ваш /etc/ldap.conf так, чтобы он содержал

TLS_REQCERT never
0 голосов
/ 13 мая 2011

Сертификат сервера LDAP подписан действительным центром сертификации?Может быть, ваш клиент просто отклоняет сертификат!

0 голосов
/ 05 мая 2011

Чтобы подключиться с использованием SSL, попробуйте

$ldapconn = ldap_connect('ldaps://'.$ldaphost);

Это автоматически подключится к порту 636, который является ldaps -портом по умолчанию. В зависимости от установки и конфигурации вашего сервера, возможно, что подключения разрешены только через порт 389 (без шифрования или с использованием TLS) или только через порт 636 с использованием SSL-шифрования. Хотя возможно, что ваш сервер предоставляет другие порты. В общем, вам нужно знать, к какому порту вы собираетесь подключиться и какой метод шифрования требует сервер (без шифрования, SSL или TLS).

0 голосов
/ 05 мая 2011

Порт 636 является портом с поддержкой SSL и требует подключения с поддержкой SSL.Вы должны попытаться подключиться к порту 389 или изменить свой код, чтобы включить защищенный уровень (гораздо более сложный).

С уважением,

Ludovic

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...