我正在尝试使用PHP 7在Windows 2012服务器上连接到MS Active Directory(运行apache 2.4,但这应该与我遇到的问题无关)。
我还应该注意,我可以使用命令行和apache服务器中的非安全LDAP从PHP连接到AD。
当我从Web服务器上的命令行执行以下PHP测试文件source: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为NULL
ldap_init:LDAPRC env为NULL
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:尝试{SomeDC of SomeDC Removed}: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():无法绑定到服务器:无法联系第10行的C:\ test_bind.php中的LDAP服务器
我的php.ini文件中有两个php_ldap和php_openssl扩展名。
我有DER和PEM格式的AD CA证书的副本,但我不确定将这些文件放在我的Web服务器上的位置。有很多与linux OS相关的帖子只是说放置" TLS_CACERT C:\ openldap \ sysconf \ cacert.pem"在我的ldap.conf文件中。我没有运行openLDAP,也没有ldap.conf文件。
我安装了openSSL,但我不完全确定配置是否正确:
==编辑1:======================================= =
加布里埃尔,感谢您的建议/参考。
我现在也尝试过这些事情但没有成功:
==编辑2:======================================= =
加布里埃尔,感谢过程监控提示。我现在至少可以确认PHP 7正在使用' LDAPCONF'环境值路径,用于查找和读取此ENV变量指向的ldap.conf文件。似乎PHP 7没有处理' SYSCONFDIR'环境变量正确,因为它首先尝试在此文字路径中打开一个文件:E:\ httpd \ www \%SYSCONFDIR%\ ldap.conf
它仍然没有工作,但现在我可以集中精力调整我知道它正在读取的一个文件。
如果有人有任何其他配置提示或者可以从工作的Windows安装中共享他们的ldap.conf文件,我将不胜感激。
我现在 仍然卡住了,不知道还能做什么。请帮忙!
答案 0 :(得分:1)
这里的答案应该有所帮助:https://stackoverflow.com/a/6047293/1202807
在Windows上的XAMPP下,ldap.conf必须位于。的根目录中 system(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行放入其中。
答案 1 :(得分:1)
I have similar problem, I have spent some time to resolve it. This behaviour was OpenLDAP bug in PHP. I have reported it and it was fixed and will be released soon. See: PHP BUG #73243 ( https://bugs.php.net/bug.php?id=73243)
如果你需要立即修复,这有点黑客攻击,试试这个(风险自负):
希望,它有所帮助: - )