I am trying to connect to a secure LDAP server (using LDAPs) via PHP, but I am having problems with it. I get the following error
Warning: ldap_bind() [function.ldap-bind]: Unable to bind to server: Can't contact LDAP server in /var/www/test.php on line 16
I works when I try to connect without LDAPs, but it is required that I use LDAPs because I am going to be dealing with sensitive information.
I am using the following code
<?php
// basic sequence with LDAP is connect, bind, search, interpret search
// result, close connection
echo "<h3>LDAP query test</h3>";
echo "Connecting ...";
$ds=ldap_connect("ldaps://server"); // must be a valid LDAP server!
print $ds;
if ($ds) {
echo "<br><br>Binding ...";
$r=ldap_bind($ds); // this is an "anonymous" bind, typically
// read-only access
echo "Bind result is " . $r . "<br />";
echo "Searching for (sn=S*) ...";
// Search surname entry
$sr=ldap_search($ds, "ou=people,o=server.ca,o=server", "uid=username*");
echo "Search result is " . $sr . "<br />";
echo "Number of entires returned is " . ldap_count_entries($ds, $sr) . "<br />";
echo "Getting entries ...<p>";
$info = ldap_get_entries($ds, $sr);
echo "Data for " . $info["count"] . " items returned:<p>";
print_r($info);
// for ($i=0; $i<$info["count"]; $i++) {
// echo "dn is: " . $info[$i]["dn"] . "<br />";
// echo "first cn entry is: " . $info[$i]["cn"][0] . "<br />";
// echo "first email entry is: " . $info[$i]["mail"][0] . "<br /><hr />";
// }
echo "Closing connection";
ldap_close($ds);
} else {
echo "<h4>Unable to connect to LDAP server</h4>";
}
?>
Try to enable "anonymous binds" on your LDAP-Server or use a correct bind (username / password).
like
cn=ldapauthuser,ou=accounts,dc=example,dc=com
Although old, I have encountered the same issue and wanted to provide some insight for future readers.
Part of the problem was out-of-date OpenSSL libraries, 0.9.6 vs 1.0.0 (which worked).
After updating OpenSSL on the server, it was noted that PHP lost support for OpenSSL.
You can check support for modules with the following from the command line:
Or
From the browser.
Also, there have been a lot of issues with SSL Support for LDAP when using the OCI8/Oracle LDAP libs in my professional experience. On Debian platforms, Libldap-2.4.2-dev packages work best.
Additionally, you should look at the connection logs on the LDAP server. I can almost guarantee that you will see an error referring to SSLv3 and missing a CA for the certificate.
By default, PHP looks for the CA file on UNIX systems in, make sure it is readable by the PHP invoker (user via cli, Apache user, etc..):
This is not necessarily a PHP issue, but a configuration issue with Secure LDAP. Please see this PHP bug report and this OpenLDAP thread.
The OpenLDAP thread above has a snippet of a working OpenLDAP config for reference.
Some other things to check is your services definitions in /etc/services. Make sure you have the following:
On UNIX "man ldap.conf" = ... SYNOPSIS /usr/local/etc/openldap/ldap.conf ...
Write TLS_REQCERT never in /usr/local/etc/openldap/ldap.conf and set ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)
This work in my project on Nginx+PHP-fpm: nginx/1.6.0 php55-5.5.15 php55-ldap-5.5.15 openldap-client-2.4.39_1
I think you just need to set the ldap protocol version to be 3
The problem is not related to the actual binding process (invalid credentials) as the warning would be a different one if the LDAP server could not authenticate your credentials. But as Paul Dixon noted the use of
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)
should be required - even though I don't think that this is the cause of your problems.ldaps://<<server>>:636
.ext/ldap
has some issues with SSL/TLS secured connections. You can try to addto the
ldap.conf
(/etc/ldap.conf
or/etc/ldap/ldap.conf
on *nix-based systems) or for Windows machines create aldap.conf
with the above content inC:\OpenLDAP\sysconf\ldap.conf
(the path must be an exact match as it's hard-coded into the extension).It appears to be a problem using SSL/TLS on some servers with recent PHP versions. Not sure why. You can refer to my post at: Problems with secure bind to Active Directory using PHP
One of the more likely causes, is the cause from Stefan. To make sure that this is really the case, you can use:
before your ldap_connect. This will print a more sane error message to log (typically ssl cert not valid, ref. Stefan Gehrig)