apache — PHP ldap_connect, использующий ldaps для подключения к Active Directory, получая неизвестную ошибку CA

Я пытаюсь подключиться к MS Active Directory с помощью PHP 7 на сервере Windows 2012 (работает Apache 2.4, но это не должно иметь отношения к моей проблеме).

Следует также отметить, что я могу подключаться к AD из PHP, используя незащищенный LDAP из командной строки и сервер apache.

Когда я выполняю следующий тестовый файл PHP, источник: http://muzso.hu/2012/04/02/php-ldap-ssl-ldaps-authentication-in-windows-running-apache, из командной строки на веб-сервере:


$AD_search_bind_DN = 'CN=someuser,OU=Users,DC=example,DC=com';
$AD_search_bind_PW = 'secret123';
ini_set('display_errors', 1);
error_reporting(E_ALL);
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
$conn = ldap_connect('ldaps://SomeDC.example.com/') or die("Failed to connect to ldap server.");
ldap_set_option(NULL, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_bind($conn, $AD_search_bind_DN, $AD_search_bind_PW) or die("Failed to bind to ldap server: " + ldap_error($conn));
echo "Successful LDAP bind.";

Я получаю следующий вывод (я выделил ошибку):


ldap_url_parse_ext (LDAP: // локальный /)
ldap_init: пытается% SYSCONFDIR% \ ldap.conf
ldap_init: HOME env — NULL
ldap_init: пытается ldaprc
ldap_init: LDAPCONF env НЕДЕЙСТВИТЕЛЕН
ldap_init: LDAPRC env НЕДЕЙСТВИТЕЛЕН
ldap_create
ldap_url_parse_ext (LDAPS: //SomeDC.example.com/)
ldap_sasl_bind_s
ldap_sasl_bind
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP SomeDC.example.com:636
ldap_new_socket: 244
ldap_prepare_socket: 244
ldap_connect_to_host: попытка {IP-адрес SomeDC удален}: 636
ldap_pvt_connect: fd: 244 tm: -1 async: 0
пытается подключиться:
подключить успех
Трассировка TLS: SSL_connect: до / подключить инициализации
Трассировка TLS: SSL_connect: клиент записи SSLv2 / v3 привет A
Трассировка TLS: SSL_connect: сервер чтения SSLv3 привет A
Проверка сертификата TLS: глубина: 1, ошибка: 20, тема: / DC = com / DC = пример / C
N = Self_Named-SHA256-SubCA, эмитент: / CN = ITSS-Ent-SHA256-Root
Проверка сертификата TLS: ошибка, невозможно получить сертификат локального эмитента
Трассировка TLS: запись предупреждения SSL3: фатально: неизвестно CA
Трассировка TLS: SSL_connect: ошибка в ошибке
Трассировка TLS: SSL_connect: ошибка в ошибке
TLS: не удается подключиться: ошибка: 14090086: SSL
подпрограммы: ssl3_get_server_certificate: сбой проверки сертификата (невозможно получить сертификат локального эмитента).
ldap_err2string
Предупреждение PHP: ldap_bind (): невозможно привязать к серверу: не удается связаться с сервером LDAP в C: \ test_bind.php в строке 10


У меня есть оба расширения php_ldap и php_openssl без комментариев в моем файле php.ini.

У меня есть копии сертификата AD CA в форматах DER и PEM, но я не уверен, где разместить эти файлы на моем веб-сервере. Есть много сообщений, связанных с ОС Linux, в которых просто говорится, что нужно поместить «TLS_CACERT C: \ openldap \ sysconf \ cacert.pem» в мой файл ldap.conf. Я не запускаю openLDAP и у меня нет файла ldap.conf.

У меня установлен openSSL, но я не совсем уверен, что конфигурация верна:

  • Файл openssl.cfg не изменяется: http://pastebin.com/KxnWThXh
  • Я добавил переменную среды OpenSSL, которая указывает на файл openssl.cfg
  • Когда я выполняю ‘openssl version -a’ из строки cmd, он показывает: OPENSSLDIR: / usr / local / ssl что явно не имеет смысла для окон.
    Полный вывод можно увидеть здесь: http://pastebin.com/h3ei3Pwp

== РЕДАКТИРОВАТЬ 1: ==============================================

Габриэль, спасибо за предложения / Ссылка.

Я теперь также попробовал эти вещи без успеха:

  • Создал файл ldap.conf и файл openldap.conf (Используя много разных форматов, основанных на различных предложениях статей, посмотрите варианты, которые я пробовал здесь: http://pastebin.com/aP94Nh4Y) в C: \ и C: \ openldap \ sysconf
  • Эта статья (https://www.reddit.com/r/PHPhelp/comments/3tykpc/php_7_and_ldap/) говорит, что нужно создать переменную среды LDAPCONF, которая указывает на файл ldap.conf (C: \ openldap \ sysconf \ ldap.conf). Я сделал. Без изменений.
  • Я заметил это в выводе при выполнении моего тестового сценария php (строка 2 вывода): ldap_init: пытается% SYSCONFDIR% \ ldap.conf. Переменная окружения SYSCONFDIR еще не существовала, поэтому я добавил ее со значением ‘C: \ openldap \ sysconf \’. — без изменений.
  • Введена очевидная синтаксическая ошибка во всех местах моих файлов ldap.conf / openldap.conf, чтобы посмотреть, смогу ли я изменить вывод тестового скрипта, чтобы он знал, что он хотя бы просматривал один из этих файлов — ничего не изменилось.

== РЕДАКТИРОВАТЬ 2: ==============================================

Габриэль, спасибо за совет монитора процесса. Теперь я могу хотя бы подтвердить, что PHP 7 использует путь значения среды ‘LDAPCONF’, чтобы найти и прочитать файл ldap.conf, на который указывает эта переменная ENV.

Также кажется, что PHP 7 не обрабатывает переменную среды ‘SYSCONFDIR’ правильно, потому что сначала пытается открыть файл по этому буквальному пути: E: \ httpd \ www \% SYSCONFDIR% \ ldap.conf

Это все еще не работает, но теперь я могу сосредоточиться на настройке только одного файла, который, как я знаю, читает.

Если у кого-то есть какие-либо другие советы по настройке или они могут поделиться своим файлом ldap.conf из работающей установки Windows, я был бы признателен.


я сейчас еще застрял и не знаю, что еще делать. Пожалуйста помоги!

1

Решение

Ответ здесь должен помочь: https://stackoverflow.com/a/6047293/1202807

Под XAMPP в Windows ldap.conf должен находиться либо в корне
система (c: \ ldap.conf, PHP 5.3.3, если я правильно помню) или в
C: \ openldap \ sysconf \ в зависимости от версии PHP. Кажется путь
не настраивается, поскольку жестко запрограммирован в DLL-библиотеках Windows PHP. Увидеть
комментарии в http://se2.php.net/manual/en/ref.ldap.php

Поэтому создайте файл ldap.conf в каталоге c: \ или C: \ openldap \ sysconf \, если он еще не существует, и вставьте в него строку TLS_CACERT.

1

Другие решения

У меня похожая проблема, я потратил некоторое время на ее решение. Такое поведение было ошибкой OpenLDAP в PHP. Я сообщил об этом, и это было исправлено и будет выпущено в ближайшее время. Смотрите: PHP BUG # 73243 (https://bugs.php.net/bug.php?id=73243)

Если вам нужно немедленное исправление, которое немного взломать, попробуйте это (на свой страх и риск):

  • используйте некоторый бинарный редактор (например, HexEdit) для редактирования php_ldap.dll
  • найдите выражение «% SYSCONFDIR% \ ldap.conf» и
  • замените его на «c: \ ldap_conf \ ldap.conf», новая константа должна иметь ту же длину, что и замененная константа
  • скопировать конфигурацию ldap в новое место

Надеюсь, поможет 🙂

1

По вопросам рекламы [email protected]