Я хочу сделать безопасное соединение ldap (ldaps) с Linux (Linux 3.2.0-4-amd64 # 1 SMP Debian 3.2.51-1 x86_64 GNU / Linux) на сервер Windows 2012, чтобы сменить пароли пользователей в активном каталог, через php. Для этого я создал самозаверяющий сертификат (с помощью диспетчера Windows Server) на сервере, но когда я пытаюсь подключиться, я получаю следующую ошибку (путем включения опции отладки на: ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
):
ldap_create ldap_url_parse_ext(ldaps://xxx.xxx.xxx.xxx) ldap_bind_s ldap_simple_bind_s 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 xxx.xxx.xxx.xxx:636 ldap_new_socket: 3 ldap_prepare_socket: 3 ldap_connect_to_host: Trying xxx.xxx.xxx.xxx:636 ldap_pvt_connect: fd: 3 tm: -1 async: 0 TLS: peer cert untrusted or revoked (0x42) TLS: can't connect: (unknown error code). ldap_err2string PHP Warning: ldap_bind(): Unable to bind to server
Кажется, клиент не может доверять сертификату, так как он сам подписал.
Какие шаги следует предпринять для безопасного подключения? Сертификаты клиентской стороны хранятся в /etc/ssl/certs/ca-certificates.crt
Вы должны явно указать клиенту LDAP игнорировать недоверенные сертификаты. Вы можете сделать это, добавив следующее в свой файл ldap.conf:
TLS_REQCERT never
Однако это решение не является предпочтительным. Вы должны добавить требуемый корень CA к своему клиенту и убедиться, что сертификат правильно сгенерирован с именем сервера в нем (и если моя память служит мне правильной полной цепочкой CA), в противном случае ничто не остановило бы кого-либо для совершения атаки MITM.
Ваш LDAP-сервер использует самозаверяющий сертификат, поэтому, чтобы доверять этому, клиенту LDAP нужен сертификат для ЦС, который создал этот сертификат.
/etc/ldap/certs/myca.pem
(вам может потребоваться mkdir
каталог certs). Добавьте новую строку с TLS_CACERT /etc/ldap/certs/myca.pem
в /etc/ldap/ldap.conf
. (Вы можете увидеть аналогичную строку с «/etc/ssl/certs/ca-certificates.crt».)
$ php -a Interactive mode enabled php > ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7); ... ldap_init: using /etc/ldap/ldap.conf ... php > $conn = ldap_connect("your_ldap_server"); php > ldap_start_tls($conn);
Без изменения конфигурации вы увидите PHP Warning: ldap_start_tls(): Unable to start TLS: Connect error in php shell code on line 1
. Комментарии к документации по функциям обеспечивают дальнейшее чтение, но все, кажется, идут прямо в настройке «TLS_REQCERT never». Рабочий! = Безопасный. demand
– это значение по умолчанию, и я оставил бы его таким образом (или явно установил это). Документация по TLS_REQCERT находится здесь . (Также кажется, что если вы установите «никогда», а следуете с более поздней строкой «TLS_CACERT», она игнорирует никогда.
Примечание. Я знаю, что вы использовали «ldaps: //» и ldap_bind (), но попробуйте использовать ldap_start_tls ().
STARTTLS – альтернативный подход, который теперь является предпочтительным методом шифрования LDAP-соединения.