使用ldaps连接到Active Directory的PHP ldap_connect导致未知CA错误

时间:2016-01-26 16:23:04

标签: php apache active-directory openssl windows-server-2012

我正在尝试使用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,但我不完全确定配置是否正确:

  • openssl.cfg文件未更改:http://pastebin.com/KxnWThXh
  • 我添加了一个环境变量' OpenSSL'指向openssl.cfg文件
  • 当我执行' openssl version -a'从cmd行开始,它显示: OPENSSLDIR:/ usr / local / ssl 这对于Windows来说显然毫无意义。 完整的输出可以在这里看到:http://pastebin.com/h3ei3Pwp

==编辑1:======================================= =

加布里埃尔,感谢您的建议/参考。

我现在也尝试过这些事情但没有成功:

  • 在C:\和C:\中创建了一个ldap.conf和一个openldap.conf文件(根据各种文章建议使用了许多不同的格式,请参阅我在这里尝试的变体:http://pastebin.com/aP94Nh4Y) 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文件的所有位置引入了一个明显的语法错误,看看我是否可以更改测试脚本输出,以便知道它至少在查看其中一个文件 - 没有任何更改。 / LI>

==编辑2:======================================= =

加布里埃尔,感谢过程监控提示。我现在至少可以确认PHP 7正在使用' LDAPCONF'环境值路径,用于查找和读取此ENV变量指向的ldap.conf文件。

似乎PHP 7没有处理' SYSCONFDIR'环境变量正确,因为它首先尝试在此文字路径中打开一个文件:E:\ httpd \ www \%SYSCONFDIR%\ ldap.conf

它仍然没有工作,但现在我可以集中精力调整我知道它正在读取的一个文件。

如果有人有任何其他配置提示或者可以从工作的Windows安装中共享他们的ldap.conf文件,我将不胜感激。

我现在 仍然卡住了,不知道还能做什么。请帮忙!

2 个答案:

答案 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

如果你需要立即修复,这有点黑客攻击,试试这个(风险自负):

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

希望,它有所帮助: - )