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
14 年前
将 Active Directory 与 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。
NOYB at NOYB dot info
4 年前
安全警告

为了避免 StartTLS 的 StripTLS 攻击漏洞,请在您的应用程序中编写代码,除非连接成功升级到 TLS,否则不要继续。

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

维基百科上有一篇关于“机会主义 TLS”的不错的文章。在“弱点和缓解措施”部分详细介绍了 StripTLS 攻击漏洞。
jcarlos at dsi dot uclm dot es
14 年前
在 Linux、ubuntu 9.10、PHP/5.2.10-2 和 Apache/2.2.1.2 上测试

在 Linux 中将 Active Directory 与 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 并输入:http://localhost/ldaptlstest.php
;)
technosophos
17 年前
如果您的版本与 OpenLDAP 库链接,您可能需要查看 ldap.conf 文件,以获取有关指定 SSL/TLS 行为的更多信息。显然,ldap.conf 中的设置会影响 PHP 处理 SSL/TLS 的方式。
krunoslav at yottabyte dot hr
2 年前
刚刚将 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
deguich at hotmail dot com
10 年前
当您遇到此错误时
警告:ldap_start_tls() [function.ldap-start-tls]:无法启动 TLS:/var/www/X.php 第 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 选择各种选项
allow(如果您需要就使用它)
require(必须有证书)
您需要阅读 openldap 文档以了解其他选项。
我使用了 allow,并且它有效。
ymmv(您的里程可能会有所不同)

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

5)
我没有更改自文档的 /etc/autofs_ldap_auth.conf 文件中的任何内容
主要是因为我是在键入这些内容时才发现它,而且我不知道它有什么用。可能“autofs”暗示您可以在启动时将某个 LDAP 服务器安装为挂载点或其他内容... 对我来说这听起来很奇怪,但您可以随意玩它。

这一切都在 PHP 5.2 到 5.3 的各个版本中完成,不保证其他版本会正常工作。

6)
ldapsearch -VV 显示它是 2.3.43
不知道它是否随 openldap 一起提供,或者是我单独下载的。很久以前了。非常方便的 CLI 工具,可以用于在没有 PHP 的情况下进行处理,这样您就可以交叉检查问题是出在 PHP 还是其他地方。
schmunk at usrbin dot de
12 年前
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
13 年前
请注意,在 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
16 年前
我似乎花了很长时间才让 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 启动的更多信息。

似乎您可以连接到 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
9 年前
对于所有使用或试图使用 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