PHP无法连接到LDAP Oracle Directory Server企业版
一直在玩这个好几天,无法让PHP绑定到Oracle的DSEE上的ldap。PHP无法连接到LDAP Oracle Directory Server企业版
function test(){
// LDAP variables
$ldaphost = "xxx.xxxxx.com";
$ldapport = 636;
$ldaprdn = 'cn=xyxyxyxy,ou=Accounts,dc=xxx,dc=xxxxx,dc=com';
$ldappass = 'vcvcvcvcvc';
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7); // isn't helping
// Connecting to LDAP
$ldapconn = ldap_connect($ldaphost, $ldapport)
or die("Could not connect to $ldaphost");
if ($ldapconn) {
// binding to ldap server
$ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);
// verify binding
if ($ldapbind) {
echo "LDAP bind successful...";
} else {
echo "LDAP bind failed...";
}
}
}
我得到的错误:
消息:的ldap_bind()[function.ldap绑定]:无法绑定到服务器:无法联系LDAP服务器
撕裂我的头发在这一个。我只是不能把事情绑定。
已经尝试了直接telnet到端口636上的主机,并没有被任何防火墙阻止。特别是我没有从屏幕上或日志中的'LDAP_OPT_DEBUG_LEVEL'获得任何额外的调试信息。
start_tls()
和ldaps
是相互排斥的,这意味着你不能在SSL端口(标准636)上发出start_tls()
,或unecrypted端口(标准389)上发起ldaps
。在连接启动后,start_tls()
命令会在未加密的端口上启动安全连接,因此您会在绑定发生之前发出此命令以使其加密。另一组公共端口是3268(未加密)和3269(ssl),可能在您的服务器中启用。
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
被记录到Web服务器错误日志,这取决于你的日志级别,或粗壮(从PHP CLI)。要在这里获得更多信息,请检查您的Web服务器日志级别设置,或者直接从命令行运行php脚本。
要成功使用ssl端口,您需要指定ldaps://
前缀,而在未加密的端口上,这不是必需的(前缀为ldap://
)。
看你的代码,这可能是一个协议版本问题,因为PHP默认使用第2版。为了解决这个问题,你可以发出:
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION,3);
ldap_set_option($conn, LDAP_OPT_REFERRALS,0);
您尝试绑定之前。
您也可以看看中的代码,我在CentOS 5中成功使用该代码,但在Ubuntu中遇到问题。如果您的服务器有一个开放的未加密端口,最好对其进行未加密的测试绑定,以排除任何连接问题。
要检查该端口是开放的,你可以检查的telnet连接它,E.G:
telnet my.server.com 3268
如果端口是开放的,那么你应该能够用它来绑定。
*编辑:如果SSL证书被认为无效,连接将失败,如果是这种情况,将调试级别设置为7将宣布这一点。为了解决这个特定的问题,你需要忽略的有效性:
您可以通过在你的PHP代码发行
putenv('LDAPTLS_REQCERT=never');
忽略Windows中的有效性。在*您需要编辑/etc/ldap.conf中用尼克斯包含
TLS_REQCERT never
我试图设置LDAP_OPT_PROTOCOL_VERSION和LDAP_OPT_REFERRALS没有运气。过去也尝试过你的每一个建议,并且仍然有问题。 – phirschybar 2011-05-13 08:50:47
你的telnet测试结果如何?你在做什么操作系统? debuglevel 7的输出是什么? – 2011-05-13 14:05:15
该ssl建议钉住了它。谢谢。 – phirschybar 2011-05-16 02:32:28
端口636是支持SSL的端口,需要启用SSL的连接。 您应该尝试连接端口389,或更改您的代码以包含安全层(更复杂)。
亲切的问候,
朱利
要使用SSL连接,你应该尝试
$ldapconn = ldap_connect('ldaps://'.$ldaphost);
这将在端口636是默认ldaps
-port自动连接。根据您的服务器安装和配置,可能只允许在端口389上进行连接(不使用加密或使用TLS),或者仅在使用SSL加密的端口636上进行连接。尽管您的服务器可能会公开其他端口。因此,一般来说,您需要知道要连接到哪个端口以及服务器需要哪种加密方法(无加密,SSL或TLS)。
根据LDAP管理员,我们必须使用SSL和端口636.我尝试使用你建议的前缀无济于事。 – phirschybar 2011-05-05 20:49:40
用一个有效的CA签署的LDAP服务器的证书?也许你的客户拒绝证书!
我想象的问题是与dn,确保它是正确的(它可能会尝试联系不同的服务比你的期望)。 – Resorath 2011-05-04 19:54:52
嗯。这就是服务器管理员给我使用的dn。 – phirschybar 2011-05-05 01:14:55
通过telnet连接时,它与php脚本运行在同一台服务器上吗?另外,使用'$ ldaphost ='ldaps://xxx.xxx.com'; $ ldapconn = ldap_connect($ ldaphost);'(当使用主机名的URL标识符时''port'参数不在'ldap_connect()'中使用),正如Stefan Gehrig所说。如果你成功建立连接,也许你需要在'ldap_connect()'后面调用ldap_start_tls()' – 2011-05-09 13:58:23