2013-02-11 170 views
1

我想在Windows的php本地测试环境中查询安全连接中的远程LDAP服务器。我想我必须正确授予访问权限,因为我可以使用LDAP浏览器应用程序并且连接到远程服务器。另外,如果我做'telnet remoteserverurl.com 636',那么在命令提示符下出现一个空白屏幕,所以我至少要连接。但在我下面的.php代码中,我得到一个关于绑定的错误:“PHP Warning:ldap_bind():无法绑定到服务器:无法联系LDAP服务器......”php安全远程服务器上的LDAP绑定Windows失败

相同的代码在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 

任何想法?谢谢!

+0

您是否检查库文件是否已加载?尝试一个phpinfo()。 PHP需要支持LDAP和SSL,你的LDAP需要支持SSL – 2013-02-11 15:27:08

+0

在phpinfo的LDAP部分中,我看到:支持LDAP支持 RCS版本ID:ldap.c 313665 2011-07-25 11:42:53Z felipe $ Total Links 0/unlimited API版本3001 供应商名称OpenLDAP 供应商版本20319 启用SASL支持 – IrfanClemson 2013-02-11 15:32:20

回答

1

检查你的PHP libaries

<?php phpinfo() ?> 

既然你可以连接使用LDAP客户端我期待你的LDAP运行SSL

你复制你的SSL证书?

  1. 复制服务器证书SYS:/ PHP5 /证书目录。这个位置可以在php.ini文件中配置。

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

+0

远程服务器的服务器证书?如何得到?我不认为我可以直接访问该Linux服务器。谢谢。 – IrfanClemson 2013-02-11 15:33:14

+0

如果您无权插入证书,那么您可能已被拧紧。为了建立一个安全的连接,你需要这个证书。我不知道是否有方法通过代码或htaccess导入它。也许谷歌那 – 2013-02-11 15:39:19

+0

只需要添加,尝试一次不安全的连接,然后它会告诉你它是否在证书中。如果你不能连接正常的连接,那么这是另一个问题 – 2013-02-11 15:41:54

0

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

**更新:不知道上面的证书thingy是否有帮助,但这里有更具体的帮助我的东西:它看起来像php的LDAP库查找某些conf文件;硬编码为:C \ OpenLDAP \ sysconf \ ldap.conf?!所以我基本上根据这个信息创建了新的文件夹,并且把一个ldap.conf文件除了'TLS_REQCERT never'之外什么也没有,这有帮助!我已经测试过它..如果我要删除此文件,那么我的安全LDAP查询不起作用,并在“绑定”步骤中失败。请注意,我对我的conf中的'never'很满意,因为这只会在我自己的工作站上。

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

希望这可以帮助别人。

4

知道这是旧的,但使用WordPress 3.X & 4.x版在Windows 2008 & 2012(IIS 7.x的& 8.x中,PHP 5.6)我最近遇到了类似的问题。

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

两件事情:

  1. 当使用PHP LDAPS,文档指出,你只需用ldaps://前缀LDAP服务器。因此,对于LDAPS,server1.domain.com应该是ldaps://server1.domain.com/ ...注意,您根本不需要通过连接方法的端口(根据http://php.net/manual/en/function.ldap-connect.php)。这与原提出的问题非常相似。
  2. 窗口PHP库被硬编码以查找C:\openldap\sysconf\ldap.conf中的打开的ldap配置文件(ldap.conf)。
  3. 创建上面#2中提到的文本文件 - 这是指向您的证书存储区的位置。一旦你创建这个文件,你可以把TLS_REQCERT never ...但是这意味着没有证书进行验证,所有被信任的自动(基本) - 应该只用于测试...从来没有生产,因为你击败的一部分的TLS/SSL安全措施(即证明您确实与您认为您连接的主机通话)。
  4. 而不是不安全的TLS_REQCERT never选项,似乎是一个受欢迎的(也许是误导)的interwebs建议...抓住curl和类似的使用通用公共证书颁发机构列表 - http://curl.haxx.se/ca/cacert.pem。这基本上就是firefox为公共证书授权信任所附带的东西(也就是为什么你可以安装firefox并且在没有证书警告等情况下去https://amazon.com)。
  5. 删除您下载的cacert.pem文件(它只是一个带有一堆证书散列和描述的文本文件)与您的PHP安装。例如,假设我在c:\php5\cacert.pem中用我的php安装甩它。您的位置可能会有所不同,但将其放置在可以访问的位置,并且将与PHP相关的内容分组。以下是cacert.pem文件的内容的两个镜头,让您了解内部内容。 sample cacert.pem content hash example in cacert.pem
  6. 编辑C:\openldap\sysconf\ldap.conf并添加一行用于命令TLS_CACERT像描绘。 sample ldap.conf file
  7. 这应该允许您现在信任公共有效证书,就像现代Web浏览器一样,请注意,它不会修复内部颁发的证书或自签名证书信任问题。但是,通过将您自己的证书哈希添加到cacert.pem文件中,您也可以轻松地做到这一点。
  8. 要在cacert.pem文件中添加另一个证书作为受信任的证书,只需获取有问题的证书的副本(您只需将其导出为.cer,采用base64格式 - 实际上不需要私钥和扩展名没关系 - 只需要做一个散列输出)。如果您以正确的格式导出它,您可以打开证书文件并查看散列 - 它与Thawte Server CA示例的截图类似(但不完全相同)。只需将你导出的散列附加到cacert.pem文件中,它就会被信任。如果您希望变得聪明,您可以导入您的私人签发证书的签发证书 - 这样就可以信任由导入的证书签署的任何证书。如果有疑问,您可以随时导入所提供的证书。
  9. 做了这样的改变后,我发现最好重新启动web服务器(IIS管理器 - > web服务器节点 - >重启选项),所以使用PHP的一切都被重置。
  10. 要获得额外的荣誉,可以使用相同的cacert.pem文件进行卷曲实现,方法是编辑php.ini文件并将行中的cacert.pem文件的完整路径。
  11. 再次,我知道这是一个较旧的帖子,但我想分享我学到的东西,同时通过LDAPS将wordpress连接到eDirectory。