PHP 大会日本 2024

ldap_start_tls

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

ldap_start_tls启动 TLS

描述

ldap_start_tls(LDAP\Connection $ldap): bool
警告

此函数目前未记录;仅提供其参数列表。

添加注释

用户贡献的注释 19 个注释

jcarlos at dsi dot uclm dot es
15 年前
将活动目录与 PHP-LDAP 和 TLS 集成
==================================================

我的配置
Apache/2.2.14 (Win32) mod_ssl/2.2.14 OpenSSL/0.9.8k PHP/5.2.11

注意 1:目前,版本 5.3.1 无法使用 tls
注意 2:此示例在 Windows 上有效,但在 Linux 上类似

1) 从 Web 浏览器下载证书 X.509(PEM 格式),我使用的是 Firefox。我将其命名为 webcert.crt
2) 创建文件夹 c:\openldap\sysconf
3) 将文件 webcert.crt 复制到 c:\openldap\sysconf
4) 使用记事本,您必须创建文件 c:\openldap\sysconf\ldap.conf。文件内容
TLS_REQCERT never
TLS_CACERT c:\openldap\sysconf\webcert.crt
5) 代码

<?php
$ldap
="ldap.myDomain.com";
$usr="[email protected]";
$pwd="mypassword";

$ds=ldap_connect($ldap);
$ldapbind=false;
if(
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3))
if(
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0))
if(
ldap_start_tls($ds))
$ldapbind = @ldap_bind($ds, $usr, $pwd);
ldap_close($ds);
if(!
$ldapbind)
echo
"ERROR";
else
echo
"OK";
?>
bill at strosberg dot com
19 年前
请注意,ldaps 和 ldap 的 start-TLS 之间存在差异。start-TLS 使用端口 389,而 ldaps 使用端口 636。ldaps 已被弃用,取而代之的是 ldap 的 start-TLS。加密的 (start-TLS ldap) 和未加密的 ldap (ldap) 同时在端口 389 上运行。

遇到的错误通常是由于误解了如何实现 TLS 加密的 ldap。
krunoslav at yottabyte dot hr
3 年前
刚刚将 CA 证书(base64 编码)从
/root/cert/ldaps.pem 移动到
/etc/openldap/certs/ldaps.pem
无需权限设置,它工作正常

cp /root/cert/ldaps.pem /etc/openldap/certs/ldaps.pem

ls -l /root/cert/ldaps.cert /etc/openldap/certs/ldaps.pem

-rw-r--r-- 1 root root 3696 Sep 3 16:12 /etc/openldap/certs/ldaps.pem
-rw-r--r-- 1 root root 3696 Sep 14 11:46 /root/cert/ldaps.pem

cat /etc/openldap/ldap.conf

#TLS_CACERT /root/cert/ldaps.pem
TLS_CACERT /etc/openldap/certs/ldaps.pem
NOYB at NOYB dot info
5 年前
安全警告

为了避免 StartTLS 的 StripTLS 攻击漏洞,请编写您的应用程序,使其在连接成功升级到 TLS 之前不继续。

有关 StripTLS 攻击漏洞解剖的详细信息,请在网络上搜索“StripTLS”。

维基百科上有一篇很好的文章,标题为“机会性 TLS”。“弱点和缓解措施”部分详细介绍了 StripTLS 攻击漏洞。
jcarlos at dsi dot uclm dot es
15 年前
在 Linux、ubuntu 9.10、PHP/5.2.10-2 和 Apache/2.2.1.2 上测试

在 Linux 中将活动目录与 PHP-LDAP 和 TLS 集成
=============================================================

我不是专家,但它有效。

1) 我已安装 ubuntu 9.10 桌面

2) 软件包
apt-get install apache2
apt-get install libapache2-mod-php5
apt-get install libldap-2.4-2
apt-get install ldap-utils
apt-get install libsasl2-modules-ldap
apt-get install openssl
apt-get install libsasl2-2
apt-get install libkrb5-3
apt-get install php5-ldap
apt-get install php5-sasl
apt-get install php5-auth-pam

3) 放置 PEM 证书。
cd /etc/ldap
mkdir certs
copy /myhome/mycert.pem /etc/ldap/certs/mycert.pem
注意:webcert.crt 重命名为 mycert.pem。它是一样的

4) 编辑文件 /etc/ldap/ldap.conf 并添加
TLS_REQCERT never
TLS_CACERT /etc/ldap/certs/mycert.pem

5) 创建文件 /var/www/ldaptlstest.php

<?php

$ldap
="ldap.myDomain.com";
$usr="[email protected]";
$pwd="mypassword";

$ds=ldap_connect($ldap);
$ldapbind=false;
if(
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3))
if(
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0))
if(
ldap_start_tls($ds))
$ldapbind = @ldap_bind($ds, $usr, $pwd);
ldap_close($ds);

if(!
$ldapbind)
echo
"ERROR";
else
echo
"OK";
?>

6) 重新启动服务器:/etc/init.d/apache2 restart

7) 打开 Firefox 并输入:https://127.0.0.1/ldaptlstest.php
;)
technosophos
17 年前
如果您的版本链接了 OpenLDAP 库,您可能需要查看 ldap.conf 文件以获取有关指定 SSL/TLS 行为的更多信息。显然,ldap.conf 中的设置会影响 PHP 处理 SSL/TLS 的方式。
deguich at hotmail dot com
10年前
当您遇到此错误时
Warning: ldap_start_tls() [function.ldap-start-tls]: Unable to start TLS: Connect error in /var/www/X.php on line Y

这可能是由于证书有效性问题导致的。您可以通过添加调试级别来检查错误
<?php
ldap_set_option
(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
?>
这可以在 ldap_connect 执行之前完成。

要解决证书有效性问题
添加
TLS_REQCERT never
在文件(如果不存在则创建)中
c:\openldap\sysconf\ldap.conf <= Windows
/etc/ldap.conf <= linux
可能需要重新启动 Web 服务器才能应用更改
这可能不是最佳解决方案,但它有效……

需要注意的另一件事是它需要版本 3(版本 2 是 php 默认版本)
<?php
$con
= ldap_connect($hostnameSSL);
ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
?>

另一个提示:如果您使用类似“ldap://…”(自动使用端口 389)或“ldaps://…”(自动使用端口 636)的 URL,则不会使用 ldap_connect 的第二个参数。
Richard Lynch
12年前
根据我的经验

1)
PHP/openldap/其他任何东西都无法读取 .pem 文件。
它们必须是 .pfx 或 .cer
(我甚至不知道哪个有效。我将 .pem 转换为这两种格式,然后就完成了。)

2)
在 /etc/openldap/ldap.conf 中,您必须
设置 TLS_CACERT /etc/openldap/cacerts/YOURCERT.pfx
或设置 TLS_CACERTDIR /etc/openldap/cacerts/
第一个限制您使用特定的证书。
后者尝试目录中的所有证书。

3)
您有各种 TLS_REQCERT 选项
允许(如果您需要,请使用它)
必需(必须有证书)
您需要阅读 openldap 文档以获取其余信息。
我使用了允许,并且它有效。
您的里程可能会有所不同

4)
我没有更改(非常长的)默认 /etc/ldap.conf 文件中的任何内容

5)
我没有更改自文档的 /etc/autofs_ldap_auth.conf 中的任何内容
主要是因为我在键入此内容时才发现它,而且我不知道它有什么作用。大概“autofs”意味着您可以在启动时将某个 LDAP 服务器安装为挂载点或类似的东西……对我来说听起来很奇怪,但您可以随意使用它。

所有这些都使用了从 5.2 到 5.3 的各种 PHP 版本,其他版本不保证。

6)
ldapsearch -VV 表示它是 2.3.43
不知道它是否与 openldap 一起提供,或者我是否单独下载了它。很久以前的事了。非常方便的 CLI 工具,可以在没有 PHP 的情况下进行操作,因此您可以交叉检查是 PHP 还是其他问题。
schmunk at usrbin dot de
13年前
PHP Warning: ldap_start_tls(): Unable to start TLS: Operations error in /path/to/script.php

如果您已通过 SSL 连接到 LDAP 服务器(例如“ldaps://hostame”),请不要使用 ldap_start_tls()。
T. Le Meur
14年前
请注意,在 Windows 上,由于 php 5.3.2 的 php_ldap 扩展中的错误,ldap.conf 的位置可能会发生变化。

在这种情况下,PHP 期望 ldap.conf 文件位于 Web 服务器文档根目录安装的根文件系统中(例如 C:\ldap.conf)。

这似乎在 PHP 5.3.3RC1 中已修复

请参阅以下错误参考
http://bugs.php.net/bug.php?id=48866
victoriano at uma dot es
14年前
ldaps://(端口 636)与在端口 389 上使用 STARTTLS 不相同。

第二种方法将普通连接的安全级别升级到加密通道,这对于普通绑定(DN/密码)强烈推荐。
pataisjsu at Yahoo.com
17 年前
我似乎花了很长时间才使 ldap_start_tls 工作。
特别缺乏文档,我感到沮丧,几乎放弃了,直到我在 php 论坛中看到了此链接。
我认为将其放在这里很有价值。

http://marc.info/?l=php-windows&m=116127873321748&w=2

它确实有效,并且为我节省了时间。
claar at no dot spam dot ksu dot edu
20年前
请注意(根据我非常有限的经验),您不能将 ldaps 协议与 tls 一起使用,否则 ldap_start_tls() 将报告“ldap_start_tls(): Unable to start TLS: Operations error”,并且 ldap_error() 将返回错误代码 1。

我发现我必须使用 ldap:// 而不是 ldaps:// 调用 ldap_connect() 才能使 ldap_start_tls() 成功。希望这对某些人有所帮助!
wirges-at-cerias.purdue.edu
22年前
应该提到,LDAP 的 TLS 连接*需要*您使用 LDAP 协议版本 3。默认情况下,PHP 使用协议 2。
因此,如果您不知道这一点,您可能会对为什么出现“TLS 不受支持”错误感到困惑。

要解决此问题,只需使用 ldap_set_option 使 LDAP 连接使用协议 3(如果支持)。

例如

$ds = ldap_connect($LDAP_SERVER,$LDAP_PORT);
if ($ds) {
if (!ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) {
fatal_error("Failed to set LDAP Protocol version to 3, TLS not supported.");
}
if (!ldap_start_tls($ds)) {
fatal_error("Ldap_start_tls failed");
}
// 现在我们需要匿名绑定到 ldap 服务器
$bth = ldap_bind($ds);
// 执行您的查询
}
on at cs dot ait dot ac dot th
18年前
更多关于 TLS 启动的信息。

似乎您可以使用 ldap_connect 连接到 ldaps://(端口 636)或使用 ldap_tls_start。

在我的情况下,使用端口 636 上的 ldaps(确保我强制使用 TLS),连接将如下所示

$LDAP_SERVER="ldaps://ldap.../";
$LDAP_PORT=636;

$ds = ldap_connect($LDAP_SERVER,$LDAP_PORT);
if ($ds) {
if (!ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) {
fatal_error("Failed to set LDAP Protocol version to 3, TLS not supported.");
}
/*** 无需 ***
* if (!ldap_start_tls($ds)) {
* exit;
* }
***/
// 现在我们需要匿名绑定到 ldap 服务器
$bth = ldap_bind($ds);
// 执行您的查询
pficheux at prologue-numerique dot fr
6年前
仅限 Windows:您必须在当前目录中添加一个 ldaprc 文件,以便 ldap 可以验证服务器证书

例如

# 这里没有验证
TLS_REQCERT never
med dot ezzairi at gmail dot com
10年前
对于所有使用或尝试使用 PHP openLDAP 扩展、Apache、OpenSSL 连接到 Microsoft Active Directory 并收到以下错误的用户和管理员
"Warning: ldap_bind(): Unable to bind to server: Can't contact LDAP server"
这是我的解决方案
--------------------------------
升级到 PHP 5.4.x
创建一个目录,例如:C:\openldap\sysconf\ldap.conf

在此文件中写入(ldap.conf)
TLS_CACERT path\to\your\CA\cert\file.crt

(例如 d:\monCA_Cert\ca.crt)

重新启动您的 Apache Web 服务器,刷新页面并告诉我(愿真主保佑父母)阿拉伯语

更多信息请查看我的邮件:[email protected]
josselin dot dulac at enscm dot fr
14年前
注意:如果您使用的是 OpenLdap 客户端 > v2 和 PHP > 4.0.4,则无需使用该函数。您只需使用以下方式指定它
<?php
ldap_connect
("ldaps://yourhostname", 636);
?>

如果您同时使用 ldaps:// uri 和 ldap_start_tls 函数,您将收到一条警告,指出 TLS/SSL 会话已打开。
To Top