PHP ldap_connect使用ldaps连接到Active Directory获取未知CA错误

uinbv5nw  于 2023-08-02  发布在  PHP
关注(0)|答案(3)|浏览(146)

我试图在Windows 2012服务器上使用PHP 7连接到MS Active Directory(运行apache 2.4,但这应该与我遇到的问题无关)。
我还应该注意的是,我可以通过命令行和apache服务器使用非安全LDAP从PHP连接到AD。
当我执行以下PHP测试文件时,源代码:http://muzso.hu/2012/04/02/php-ldap-ssl-ldaps-authentication-in-windows-running-apache,从Web服务器的命令行:

$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://localhost/)
ldap_init:正在尝试%SYSCONFDIR%\ldap.conf
ldap_init:HOME env为NULL
ldap_init:尝试ldaprc
ldap_init:LDAPCONF环境为NULL
ldap_init:LDAPRC环境为空
ldap_create
ldap_url_parse_ext(ldaps://SomeDC.example.com/)
ldap_sasl_bind_s
ldap_sasl_绑定
ldap发送初始请求
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:尝试{删除SomeDC的IP地址}:636
ldap_pvt_connect:fd:244 tm:-1异步:0
尝试连接:
连接成功
TLS跟踪:SSL_connect:在/connect初始化之前
TLS跟踪:SSL_connect:SSLv 2/v3写客户端hello A
TLS跟踪:SSL_connect:SSLv 3读取服务器hello A
TLS证书验证:深度:1,错误:20、主题:/DC=com/DC=示例/C

N=Self_Named-SHA 256-SubCA,发行方:/CN=ITSS-Ent-SHA256-Root
TLS证书验证:错误,无法获取本地颁发者证书
TLS跟踪:SSL 3警报写入:致命:未知CA

TLS跟踪:SSL_connect:error in error
TLS跟踪:SSL_connect:error in error
TLS:无法连接:错误:14090086:SSL
例程:ssl3_get_server_certificate:证书验证失败(无法获取本地颁发者证书)。
ldap_err2string
PHP警告:ldap_bind():无法绑定到服务器:无法联系LDAP服务器在C:\test_bind.php第10行
我在php.ini文件中对php_ldap和php_openssl扩展都未注解。
我有DER和PEM格式的AD CA证书的副本,但我不确定在哪里放置这些文件在我的Web服务器上。有很多与linux操作系统相关的帖子只是说在我的ldap.conf文件中放置“TLS_CACERT C:\openldap\sysconf\cacert.pem”。我没有运行openLDAP,也没有ldap.conf文件。
我已经安装了openSSL,但我不完全确定配置是否正确:

  • openssl.cfg文件不变:http://pastebin.com/KxnWThXh
  • 我添加了一个指向openssl.cfg文件的环境变量“OpenSSL”
  • 当我从cmd行执行'openssl version -a'时,它显示:* 酒店:/usr/local/ssl**,这对windows来说毫无意义。完整的输出可以在这里看到:http://pastebin.com/h3ei3Pwp
    ==编辑1:========================================

Gabriel,谢谢你的建议/参考。
现在我也尝试了这些事情,但没有成功:

  • 创建了一个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:========================================

加布里埃尔,谢谢你的过程监控提示。我现在至少可以确认PHP7正在使用'LDAPCONF'环境值路径来定位和读取这个ENV变量所指向的ldap.conf文件。
PHP 7似乎没有正确处理'SYSCONFDIR'环境变量,因为它首先尝试打开以下文字路径中的文件:E:\httpd\www%SYSCONFDIR%\ldap.conf
它仍然不能工作,但现在我可以集中精力调整我知道它正在阅读的一个文件。
如果有人有任何其他的配置技巧,或者可以分享他们的ldap.conf文件从一个工作windows安装,我将不胜感激。
我现在还是被困住了,不知道还能做什么。救命啊!

avwztpqn

avwztpqn1#

这里的答案应该有所帮助:https://stackoverflow.com/a/6047293/1202807
在Windows上的XAMPP下,ldap.conf必须位于系统的根目录(如果我没记错的话,是c:\ldap.conf,PHP 5.3.3)或C:\openldap\sysconf\,具体取决于PHP版本。似乎路径是不可配置的,因为硬编码在Windows PHP DLL中。请参阅http://se2.php.net/manual/en/ref.ldap.php上的评论
因此,在c:\或C:\openldap\sysconf\中创建ldap.conf文件(如果它还不存在),并将TLS_CACERT行放入其中。

bqujaahr

bqujaahr2#

我有类似的问题,我花了一些时间来解决它。这是PHP中的OpenLDAP bug。我已经报告了,它被修复,并将很快发布。参见:PHP BUG #73243(https://bugs.php.net/bug.php?id=73243
如果您需要立即修复,这是一个有点黑客攻击,尝试这个(您自己承担风险):

  • 使用一些二进制编辑器(例如HexEdit)来编辑php_ldap. dll
  • 找到表达式“%SYSCONFDIR%\ldap.conf”并
  • 将其替换为“c:\ldap_conf\ldap.conf”,则新常量必须与替换常量具有相同的长度
  • 复制ldap配置到新位置

希望有帮助:-)

2cmtqfgy

2cmtqfgy3#

我知道我有点晚了,但对我来说,下面的代码行修复了发行者证书的问题:

ldap_set_option(null, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_ALLOW);

字符串
如果您使用ldaprecord包,则需要将LDAP_DEFAULT_OPT_X_TLS_REQUIRE_CERT=LDAP_OPT_X_TLS_ALLOW添加到. env文件中。

相关问题