PHP Conference Japan 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 年前
將 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) 從網頁瀏覽器下載 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="user@myDomain.com";
$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。
andreas at heigl dot org
9 個月前
如需關於如何支援使用非官方憑證的 TLS 的完整逐步說明,請查看 https://andreas.heigl.org/2020/01/31/handle-self-signed-certificates-with-phps-ldap-extension/
krunoslav at yottabyte dot hr
3 年前
剛將 CA 憑證 (b64 編碼) 從
/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 中測試

將 Active Directory 與 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="user@myDomain.com";
$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
可能需要重新啟動網頁伺服器才能套用變更
這可能不是最佳解決方案,但它有效...

另一件需要注意的是,它需要版本 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 伺服器掛載為掛載點之類的東西... 對我來說聽起來很奇怪,但您可以自己玩玩看。

這些都是使用從 5.2 到 5.3 的各種 PHP 版本。無法保證其他版本。

6)
ldapsearch -VV 顯示它是 2.3.43
不知道它是 openldap 自帶的還是我單獨下載的。很久以前了。這是一個非常方便的 CLI 工具,可以在沒有 PHP 的情況下進行操作,因此您可以交叉檢查它是否是 PHP 的問題。
schmunk at usrbin dot de
13 年前
PHP 警告:ldap_start_tls():無法啟動 TLS:在 /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():無法啟動 TLS:操作錯誤」,而 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("設定 LDAP 協定版本為 3 失敗,不支援 TLS。");
}
if (!ldap_start_tls($ds)) {
fatal_error("Ldap_start_tls 失敗");
}
// 現在我們需要匿名繫結到 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("設定 LDAP 協定版本為 3 失敗,不支援 TLS。");
}
/*** 不需要 ***
* 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 的使用者和管理員,並且他們收到
「警告:ldap_bind():無法繫結到伺服器:無法連線到 LDAP 伺服器」
這是我的解決方案
--------------------------------
升級到 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 網頁伺服器,並重新整理您的頁面,然後告訴我 (allah yar7am lwalidin) 阿拉伯語

如需更多資訊,請寄信到我的信箱:med.ezzairi@gmail.com
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