2

我正在尝试在 Windows php 本地测试环境中的安全连接中查询远程 LDAP 服务器。我认为我必须正确授予访问权限,因为我可以使用 LDAP 浏览器应用程序并且可以很好地连接到远程服务器。另外,如果我执行“telnet remoteserverurl.com 636”,那么命令提示符中会出现一个空白屏幕,所以我至少可以连接。但是在我的以下 .php 代码中,我在绑定时遇到错误:“PHP 警告:ldap_bind():无法绑定到服务器:无法在线联系 LDAP 服务器...”

相同的代码适用于 Linux 服务器。我认为在我的本地 php 环境中缺少某种用于安全 LDAP 连接的 LDAP 库?无论如何,这是代码:

$ds=ldap_connect("ldaps://serveraddress.com", "636");  // remote server
//$ds=ldap_connect("ldap://localhost", 389);  // works
//putenv('LDAPTLS_REQCERT=never');//doesn't help with secure ldap
//ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3); //works for local LDAP server (Open LDAP)
$r=ldap_bind($ds, "cn=xxx,ou=proxy,o=xxx", "passwordxxxx");//throws error for remote

任何想法?谢谢!

4

3 回答 3

7

知道这是旧的,但我最近在 windows 2008 和 2012 上使用 wordpress 3.x 和 4.x 时遇到了类似的问题(IIS 7.x 和 8.x,PHP 5.6)。

我已经为 wordpress 编写了一个用于 ldap 身份验证的插件 - 就像试图让 LDAPS 一样(通过端口 636 工作的 ldap 安全)。

几件事:

  1. 使用 PHP LDAPS 时,文档说明您只需在 LDAP 服务器前加上ldaps://. 所以server1.domain.com对于 LDAPS 应该是ldaps://server1.domain.com/......请注意,您根本不需要为连接方法传递端口(根据http://php.net/manual/en/function.ldap-connect.php)。这与原始问题在其提交中的内容非常相似。
  2. Windows PHP 库经过硬编码,可以ldap.confC:\openldap\sysconf\ldap.conf.
  3. 创建上面 #2 中提到的文本文件 - 这是您指向证书存储的位置。一旦你创建了这个文件,你就可以输入TLS_REQCERT never......但这意味着没有证书被验证并且所有证书都被自动信任(本质上) -应该只用于测试......永远不要用于生产,因为您破坏了部分 TLS/SSL 安全措施(即证明您确实在与您认为您连接的主机交谈)。
  4. TLS_REQCERT never而不是似乎是互联网上流行(并且可能被误导)建议的不安全选项......获取 curl 和类似使用的公共公共证书颁发机构列表 - http://curl.haxx.se/ca/cacert。佩姆_ 这本质上是 firefox 为公共证书颁发机构信任提供的(即,这就是为什么您可以安装 firefox 并在没有证书警告的情况下访问https://amazon.com等)。
  5. 在 PHP 安装中删除您下载的 cacert.pem 文件(它只是一个包含一堆证书哈希和描述的文本文件)。例如,假设我用我的 php install in 倾倒了它c:\php5\cacert.pem。您的位置可能不同,但将其放在可以访问的地方,并且由于它是相关的,因此将与 php 内容分组。这是cacert.pem文件内容的几张照片,让您了解里面的内容。 示例 cacert.pem 内容 cacert.pem 中的哈希示例
  6. 编辑C:\openldap\sysconf\ldap.conf并为命令添加一行,TLS_CACERT如图所示。 示例 ldap.conf 文件
  7. 这应该允许您现在像现代 Web 浏览器一样信任公共的、有效的证书等。请注意,它不会解决内部颁发或自签名证书的信任问题。但是您也可以通过将自己的证书哈希添加到 cacert.pem 文件中轻松地做到这一点。
  8. 要在 cacert.pem 文件中添加另一个证书作为受信任的证书,只需获取相关证书的副本(您只需将其导出为.cerbase64 格式 - 不需要私钥,扩展名真的没关系- 只需要是一个哈希输出)。如果您以正确的格式导出它,您可以打开证书文件并查看哈希 - 它与 Thawte Server CA 示例的屏幕截图类似(但不完全相同)。只需将您导出的哈希附加到 cacert.pem 文件,它就会被信任。如果您想变得聪明,您可以改为为您的私人颁发的证书导入颁发证书 - 这将信任由导入的证书签名的任何证书。如果有疑问,您可以随时导入提供的证书。
  9. 进行此类更改后,我发现最好重新启动 Web 服务器(iis 管理器 -> Web 服务器节点 -> 重启选项),这样使用 php 的所有内容都被重置。
  10. 对于额外的功劳,您可以通过编辑 php.ini 文件并将 cacert.pem 文件的完整路径放在行中来为 curl 实现使用相同的 cacert.pem 文件curl.cainfo =
  11. 同样,我知道这是一篇较旧的帖子,但我想分享我在通过 LDAPS 将 wordpress 连接到 eDirectory 时所学到的知识。
于 2014-11-12T03:39:59.520 回答
1

检查您的 PHP 库

<?php phpinfo() ?>

由于您可以使用 LDAP 客户端进行连接,因此我希望您的 LDAP 运行 SSL

您是否复制了 SSL 证书?

  1. 将服务器证书复制到 sys:/php5/cert 目录。此位置可在 php.ini 文件中配置。

  2. 在 ldap_connect 调用中使用“ldaps://”前缀作为主机名参数或端口号参数的值 636。

于 2013-02-11T15:30:17.537 回答
0

我得到了这个工作!@s.lenders 的“答案”(谢谢)指出了一些证书问题,确实是证书问题。删除 LDAP 服务器的证书处于过期状态——即使我使用桌面应用程序(SoftTerra LDAP 浏览器)连接时,我也会收到警告。因此,将证书导入我的 Windows 证书——SoftTerra LDAP 浏览器应用程序允许我使用该选项。而且,瞧!SSL LDAP 调用正在运行。

** 更新:不确定上述证书是否有帮助,但这里有一些更具体的东西对我有帮助:看起来 php LDAP 库正在寻找某个 conf 文件;硬编码为:C\OpenLDAP\sysconf\ldap.conf ?! 因此,我基本上根据此信息创建了新文件夹,并放置了一个 ldap.conf 文件,其中只有“TLS_REQCERT never”,这很有帮助!我已经对其进行了测试..如果我要删除此文件,那么我的安全 LDAP 查询将不起作用并且在“绑定”步骤中失败。请注意,我对 conf 中的“从不”感到满意,因为这只会在我自己的工作站上。

另请注意,我在运行 IIS 7+ 的 Windows 7 上**

希望这可以帮助某人。

于 2013-02-12T17:08:40.447 回答