PHP Conference Japan 2024

ldap_connect

(PHP 4、PHP 5、PHP 7、PHP 8)

ldap_connect連線至 LDAP 伺服器

描述

ldap_connect(?string $uri = null): LDAP\Connection|false
警告

從 PHP 8.3.0 開始,以下簽名已棄用。

ldap_connect(?string $host = null, int $port = 389): LDAP\Connection|false

建立 LDAP\Connection 連線,並檢查給定的 uri 是否合理。

注意此函式不會開啟連線。它會檢查給定的參數是否合理,並可在需要時用於開啟連線。

參數

uri

完整 LDAP URI,格式為 ldap://hostname:portldaps://hostname:port,用於 SSL 加密。

您也可以提供多個以空格分隔的 LDAP-URI 作為一個字串

請注意,由於缺少 schema,hostname:port 不是支援的 LDAP URI。

host

要連線的主機名稱。

port

要連線的埠。

傳回值

當提供的 LDAP URI 似乎合理時,傳回 LDAP\Connection 實例。這是對提供參數的語法檢查,但不會接觸到伺服器!如果語法檢查失敗,則傳回 falseldap_connect() 否則會傳回 LDAP\Connection 實例,因為它實際上並未連線,只是初始化連線參數。實際連線發生在接下來對 ldap_* 函式的呼叫中,通常使用 ldap_bind()

如果未指定任何引數,則會傳回已開啟連線的 LDAP\Connection 實例。

變更日誌

版本 描述
8.3.0 以個別的 hostnameport 呼叫 ldap_connect() 現在已棄用。
8.1.0 現在傳回 LDAP\Connection 實例;先前傳回的是 資源

範例

範例 1:連線至 LDAP 伺服器的範例。

<?php

// LDAP 變數
$ldapuri = "ldap://ldap.example.com:389"; // 您的 ldap-uri

// 連線至 LDAP
$ldapconn = ldap_connect($ldapuri)
or die(
"該 LDAP-URI 無法解析");

?>

範例 2:安全連線至 LDAP 伺服器的範例。

<?php

// 確保您的主機是您向其發出安全憑證的正確主機
$ldaphost = "ldaps://ldap.example.com/";

// 連線至 LDAP
$ldapconn = ldap_connect($ldaphost)
or die(
"該 LDAP-URI 無法解析");

?>

另請參閱

新增註解

使用者貢獻的註解 27 則註解

47
nemanja at prolux-universal dot com
10 年前
如果您不希望您的 PHP 程式在您的公司 DC 之一發生故障的情況下等待 XXX 秒才放棄,並且由於 ldap_connect() 沒有機制在使用者指定的時間逾時,這是我的解決方案,它顯示出出色的實用結果。

===========================================================
function serviceping($host, $port=389, $timeout=1)
{
$op = fsockopen($host, $port, $errno, $errstr, $timeout);
if (!$op) return 0; //DC 無法使用
else {
fclose($opanak); //明確關閉開啟的 socket 連線
return 1; //DC 已啟動並執行,我們可以安全地使用 ldap_connect 連線
}
}

// ##### STATIC DC LIST,如果您的 DNS 循環配置不是設定好的
//$dclist = array('10.111.222.111', '10.111.222.100', '10.111.222.200');

// ##### DYNAMIC DC LIST,反向 DNS 查閱按循環配置結果排序
$dclist = gethostbynamel('domain.name');

foreach ($dclist as $k => $dc) if (serviceping($dc) == true) break; else $dc = 0;
//在此迴圈之後,現在至少會有一個可用的 DC,否則 $dc 會傳回布林值 false,而下一行會停止程式進一步執行

if (!$dc) exit("目前沒有可用的網域控制器,請稍後再試!"); //通知使用者

//現在,ldap_connect 一定會成功連線到先前測試過的 DC,並且不會發生逾時
$ldapconn = ldap_connect($dc) or die("DC 無法使用,請稍後再試。");
===========================================================

此外,透過這種方法,您可以獲得非常好的容錯移轉功能,例如,一家公司在遙遠的地方分佈著十幾個 DC,如果目前至少有一個 DC 處於活動狀態,您的 PHP 程式將始終具有高可用性。
26
Andrew (a.whyte at cqu.edu.au)
21 年前
為了能夠透過 LDAP 連接器對 Active Directory 進行修改,您必須透過 SSL 繫結到 LDAP 服務。否則,Active Directory 會提供大部分唯讀的連線。您無法新增物件或修改某些屬性,而沒有 LDAPS,例如,密碼只能使用與 Active Directory 的 LDAPS 連線來變更。

因此,對於那些希望從使用 PHP+OpenLDAP+OpenSSL 的 Unix 主機安全連線到 Active Directory 的人,我花了一些時間使其運作,並遇到了一些陷阱。希望這對於像我一樣找不到答案的人來說是有幫助的。

確保使用 OpenSSL 支援來編譯 OpenLDAP,並使用 OpenLDAP 和 OpenSSL 來編譯 PHP。

這為 PHP 提供了使用 ldaps:// 連線所需的一切。

設定 OpenSSL

從 Active Directory 中提取您的根 CA 憑證,這是透過使用憑證服務來完成的,憑證服務是 Windows 2000 Server 的標準元件,但預設可能未安裝(通常的「新增/移除軟體」方法在此處有效)。我以 Base64 而非 DER 格式提取了它。

將提取的 CAcert 放置到 openssl 的 certs 資料夾中。(例如,/usr/local/ssl/certs),並設定雜湊符號連結。這可以透過簡單地執行

/usr/local/ssl/bin/c_rehash

來輕鬆完成

完成後,您可以透過執行

/usr/local/ssl/bin/openssl verify -verbose -CApath /usr/local/ssl/certs /tmp/exported_cacert.pem

來測試是否已運作。(應傳回:OK)。

設定 OpenLDAP
將以下內容新增到您的 ldap.conf 檔案中。

(位於 /usr/local/openldap/etc/openldap/ldap.conf)

#--開始--
#
# 指示用戶端不要請求伺服器的憑證。
# 警告:這會讓伺服器容易遭受中間人
# 攻擊,*不應*在生產系統上或在
#
# 測試案例之外使用!
# 如果您使用此設定,則無需任何其他設定,因為
#
# 不會請求任何憑證,因此也不會進行驗證
# 如需正確的解決方案,請查看 https://andreas.heigl.org/2020/01/31/handle-self-signed-certificates-with-phps-ldap-extension/

TLS_REQCERT never
# 定義 CA 憑證的位置
TLS_CACERT /usr/local/ssl/certs/AD_CA_CERT.pem

TLS_CACERTDIR /usr/local/ssl/certs

您也需要在 Apache Web 使用者家目錄中,建立一個名為 .ldaprc 的檔案,並將相同的設定放入其中。

例如:

cp /usr/local/openldap/etc/openldap/ldap.conf ~www/.ldaprc

接著,您可以從 OpenLDAP 命令列工具測試是否能建立與 Active Directory 的 LDAPS 連線。

/usr/local/openldap/bin/ldapsearch -H "ldaps://adserver.ad.com"

這應該會以擴展 LDIF 格式傳回一些輸出,並指出沒有符合的物件,但這證明連線是可行的。

您連線的伺服器名稱很重要。如果您在 "ldaps://" URI 中指定的伺服器名稱與其憑證中的伺服器名稱不符,則會出現如下的錯誤訊息:

ldap_bind: Can't contact LDAP server (81)
additional info: TLS: hostname does not match CN in peer certificate

一旦您讓 ldapsearch 工具正常運作後,PHP 也應該可以正常運作。

然而,一個重要的陷阱是,Web 使用者必須能夠找到其 HOME 資料夾。您必須檢查 Apache 是否提供一個設定為 Web 使用者家目錄的 HOME 變數,以便 php 可以找到 .ldaprc 檔案及其內含的設定。這在不同的 Unix 版本之間可能會有差異,但如果您忽略了這簡單又愚蠢的問題,它會給您帶來麻煩。只需在 Apache 的 httpd.conf 中使用 SetEnv 指令即可。

SetEnv HOME /usr/local/www

完成以上所有步驟後,您現在可以編寫一個簡單的連線函數。

function connect_AD()
{
$ldap_server = "ldaps://adserver.ad.com" ;
$ldap_user = "CN=web service account,OU=Service Accounts,DC=ad,DC=com" ;
$ldap_pass = "password" ;

$ad = ldap_connect($ldap_server) ;
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3) ;
$bound = ldap_bind($ad, $ldap_user, $ldap_pass);

return $ad ;
}

或者,您可以避免使用 URI 樣式的伺服器字串,而使用類似 ldap_connect("adserver.ad.com", 636) 的方式;但使用 Active Directory 伺服器時效果良好。

希望這對您有所幫助。
3
lee at lareck70 dot net
9 年前
若要在 Windows 上使用 LDAPS 而不使用 "c:\openldap\sysconf\ldap.conf"
請建立一個類似 ldap.conf 的檔案,並將其命名為 "ldaprc"。
對於在命令列上執行的 PHP 腳本,請將此檔案放在腳本所在的目錄中。
對於在網頁伺服器上執行的 PHP 腳本,請將此檔案放在 PHP 的家目錄中。
7
harrison at glsan dot com
9 年前
若要覆寫 ssl ca 檔案,可以在 php 中設定一個環境變數。

我發現將 ca 憑證(以及中間 ca)儲存到名為 ca.pem 的檔案中,然後加入

putenv('LDAPTLS_CACERT=./ca.pem');

在 ldap_connect 之前運作良好。
程式碼範例
<?php
putenv
('LDAPTLS_CACERT=./ca.pem');
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
$l = ldap_connect("ldaps://ldap/");
ldap_set_option($l, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_bind($l, "cn=apache,dc=example", "xxxxxxx");
echo(
ldap_error($l)."\n");
$s = ldap_search($l, "dc=example", "uid=test");
echo(
ldap_count_entries($l, $s)."\n");
?>
在同一個目錄下的 ca.pem 檔案中,我們有 ca 憑證
-----BEGIN CERTIFICATE-----
<cert here>
-----END CERTIFICATE-----
2
peter dot burden at gmail dot com
15 年前
主機名稱參數可以是空格分隔的主機名稱列表。這表示如果主伺服器無法運作,LDAP 程式碼將會與備份伺服器通訊。在程式碼嘗試與主伺服器通訊時會出現逾時的延遲,但事情仍然會正常運作。這在使用典型的 Microsoft Active Directory 主網域控制站和備份網域控制站設定時特別有用。
<?php
$ldaphost
= "192.168.0.100 192.168.0.101";
$ldapconn = ldap_connect($ldaphost);
?>
3
mwilmes at avc dot edu
9 年前
我支援在 CentOS 7 上使用 PHP-FPM 的 LAMP 堆疊,此堆疊需要透過 SSL 連接到 Active Directory。我們有網域的根憑證。我能夠透過五個步驟完成設定。

1. 取得網域的 base64 格式根 SSL 憑證。(必須是企業管理員 - 如果您不是,請與您的管理員聯繫。)
執行 mmc.exe
檔案 -> 新增/移除嵌入式管理單元
選取「憑證授權單位」,然後選取為您的網域產生憑證的伺服器。
展開樹狀目錄,直到找到根憑證的項目,然後按一下滑鼠右鍵 -> 內容。
按一下「檢視憑證」按鈕、「詳細資料」標籤,然後按一下「複製到檔案...」按鈕。
使用精靈將根憑證匯出到您的電腦。確保您使用 Base-64 格式。

2. 將根憑證複製到 Linux 伺服器。您可以在記事本中開啟憑證,然後複製並貼上內容。

3. 將憑證轉換為 pem 格式。根據需要替換檔案名稱。
openssl x509 -in <複製的憑證檔案> -out /etc/openldap/certs/<cert>.pem

4. 在 ldap.conf 中新增一行以使用新的根憑證。
vi /etc/openldap/ldap.conf
TLS_CACERT /etc/openldap/certs/<cert>.pem

5. 重新啟動 PHP 服務。
systemctl restart php-fpm.service
1
blizzards at libero dot it
20 年前
若要完成有關如何使用 SASL 在連接埠 636 連接到 LDAP ACTIVE DIRECTORY 2000/2003 伺服器的問題,您可以參考先前的注意事項和下列指示。

A) 從 AD 建立 CA 憑證;
B) 以 .pem (DER) 格式匯出;
C) 安裝 OPENSSL、CYRUS SASL、OPENLDAP、KERBEROS 5;
D) 將匯出的 AD ca 憑證複製到您的 unix 系統上的 openssl 憑證目錄中;
E) 使用 c_reash 命令重新整理;
F) 從 AD 取得您的使用者的 Kerberos 票證;
G) 使用 SSL 和 LDAP 支援編譯 PHP;
H) 使用 ldapsearch -D <binddn> -W -H ldaps://ad.secure.com:636 -x 進行測試

如果一切正常,請建立您的 php 腳本。

注意:若要將參數寫入 AD,您需要每 10 小時或更短時間更新票證(AD 預設票證存留時間),若要讀取,您可以保留過期的票證。
在查詢 Windows 2000/2003 AD 時,您必須只使用 SASL 而不能使用 TLS(不支援)。
1
nateshull at gmail dot com
4 年前
在 WISP 堆疊(Win、IIS、SQL、PHP)上實作 LDAPS
PHP 7.0.19

我遇到一些指示的問題,而且我需要 LDAPS 來應對即將到來的 Active Directory 更新,該更新會移除不安全的 LDAP 連線。

在 php.ini 中啟用 ldap 和 openssl 模組

同時確保擴充功能在 ext 資料夾中

驗證模組已載入:phpinfo()

注意事項
如果環境變數已在程式碼中設定,則不需要 ldap 或 openssl 設定檔。此外,ca 路徑不允許在路徑周圍使用雙引號。

*** 程式碼範例

<?php
$ldapuser
= "domain\\user";
$ldappass = "Passsword";
$ldapserver = "ldaps://server.domain.com";

//選項為 require、never、allow
//require 最安全,其他可能會允許中間人攻擊
putenv('LDAPTLS_REQCERT=require');

//告知 ldap 根 ca 憑證的位置
//請注意,路徑中允許使用空格,而無需跳脫或引號
//我尚未測試權限,但我會假設服務應該具有讀取權限。
putenv('LDAPTLS_CACERT=C:\\Program Files\\php\\certs\\rootca.pem');

//測試以確保可以讀取憑證且路徑正確。
echo file_get_contents("LDAPTLS_CACERT=C:\\Program Files\\php\\certs\\rootca.pem");

// 設定偵錯
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

// 連線到 ldap 伺服器
$ldapconn = ldap_connect($ldapserver) or die ("Couldn't connect");

// 繫結到 ldap 伺服器
$ldapbind = false;
$ldapbind = ldap_bind($ldapconn, $ldapuser, $ldappass);

//輕鬆檢視成功或失敗
if ($ldapbind) {
print(
"\n logged in! \n\n");
} else {
print(
"\n log on failure \n\n");
}
?>
2
Nixahnung
9 年前
我花了很多時間來建立與 MS AD 全域編錄連接埠 3269 的 LDAPS 連線

我的一點看法

ldap_connect("ldaps://example.com", 3269)
=> 連接到 636.... :(,僅 DC

ldap_connect("ldaps://example.com:3269")
=> 連接到 3269.... :),如預期為 GC

希望這有幫助...
2
avel at noc uoa gr
22 年前
請注意,主機名稱可以是空格分隔的 LDAP 主機名稱列表。這對於容錯移轉非常有用;如果第一個 ldap 主機關閉,ldap_connect 將會詢問第二個 LDAP 主機。當然,您在執行此操作之前必須具有 LDAP 複本。:) 請閱讀 LDAP API 文件以取得更多資訊。

除了容錯移轉之外,這也可用於 LDAP 負載平衡。只需使用一個隨機產生器函數,每次都會傳回不同的空格分隔列表。這是因為列表中的第一個主機始終會先嘗試。

在執行 LDAP 寫入時請小心;務必在您即將修改資料庫時,始終連線到您的主伺服器,以便複本會如預期取得變更。

Alexandros Vellis
1
allie at lsu dot edu
17 年前
我真的希望有辦法將關於繫結和搜尋 MS AD 的資訊傳達給全世界的程式設計師。這已經是我第二次被「我需要搜尋整個樹狀結構」的問題困擾了。

對於 php(和 apache auth_ldap),當您想要搜尋整個樹狀結構時,您需要指定連接埠 3268。否則它會吐出部分結果錯誤。

ldap_connect($server,3268);

我很幸運之前在 apache 搜尋整個目錄時贏過這場戰役。當我注意到我們的 php 應用程式的用戶驗證失敗時,我立即能夠透過加入這個連接埠規範(和 ldap_set_option($ldapserver, LDAP_OPT_REFERRALS, 0) 選項)來修正問題。

我真的希望這能幫助其他人,讓他們在把頭髮都拔光之前解決問題。我知道我很想念我的頭髮。
0
heiglandreas at php dot net
9 個月前
如果您在使用 ldap-conjnect 的 TLS 時遇到問題:儘管很多人都這麼說:TLS_REQCERT=never 永遠不是正確的答案。

請查看 https://andreas.heigl.org/2020/01/31/handle-self-signed-certificates-with-phps-ldap-extension/,以了解如何使用正確的憑證檢查來解決問題!
0
titanrat at bk dot ru
7 年前
我發現 php7.0 和 php5.5 在此函數上有一些差異

Php5 ldap_connect ('host', 0) 嘗試連接預設連接埠 - host:389
Php7 ldap_connect ('host', 0) 嘗試連接 host:0 並崩潰。
0
antoine dot php dot net at bonnefoy dot eu
9 年前
哈囉,

針對 nemanja 的文章做一些小修正。
- 如果連線被防火牆拒絕,會出現警告(在 fsockopen 前面加入 @)
- fclose 參數不正確。

使用這種方法,您可以獲得非常好的故障轉移功能,例如一家公司在遙遠的地方分佈了十幾個 DC,這樣一來,如果目前至少有一個 DC 處於活動狀態,您的 PHP 程式將始終具有高可用性。
<?php
function serviceping($_host, $_port = 389, $_timeout = 1) {
$op = @fsockopen($_host, $_port, $errno, $errstr, $_timeout);
if (!
$op) {
echo
"KO!";
return
0;

}
//DC 無法使用
else {
fclose($op); //明確關閉開啟的 socket 連線
return 1; //DC 已啟動並執行,我們可以安全地使用 ldap_connect 連線
}
}

function
ldap_connect_failover($_domain) {
// ##### 靜態 DC 清單,如果您的 DNS 循環配置未設定
//$dclist = array('10.111.222.111', '10.111.222.100', '10.111.222.200');
// ##### 動態 DC 清單,透過循環配置結果排序的反向 DNS 查詢
$dclist = gethostbynamel($_domain);

foreach (
$dclist as $dc) {
if (
serviceping($dc) == true) {
break;
} else {
$dc = 0;
}
}
//在這個迴圈之後,要嘛至少有一個目前可用的 DC,要嘛 $dc 會傳回布林值 false,而下一行會停止程式繼續執行

if (!$dc) {
return
false;
}
//通知用戶

return ldap_connect($dc);
}
?>
0
TheThinkingMan
9 年前
我花了數小時試圖建立與我的本地 AD LDS 實例(在 Windows 8.1 64 位元上執行)的 LDAPS 連線。

我嘗試了一個又一個的憑證。OpenSSL、Thawte 和自我簽署 - 全都失敗了。

最後我刪除了所有的憑證,並使用 IIS 7(在 Windows 8.1 上執行)建立了一個自我簽署憑證。

然後我下載了 Softerra LDAP 瀏覽器,它能夠毫無問題地透過 SSL 連線到我的 AD LDS 實例。

當然,如果 PHP 可以就好了。

我使用以下程式碼進行連線
<?php
$ldap_server
= "ldaps://delllappy:636";
$ldap_conn = ldap_connect($ldap_server) or die("無法連線到 LDAP 伺服器。");
?>
我在 ldap_connect 上面加入了以下程式碼
<?php
putenv
('LDAPTLS_REQCERT=allow');
putenv("LDAPCONF=C:\OpenLDAP\sysconf\ldap.conf");
?>

這沒有任何作用。

我使用的 ldap_bind 命令是
<?php
if (!ldap_bind($ldap_conn, $ldap_user, $ldap_pass)) {
echo
"錯誤";
}else{
echo
"成功";
}
?>
順便說一下:我還在程式碼中加入了一堆偵錯 - 這在其他地方被引用 - 所以我沒有在這裡加入。

我一直收到的錯誤是
Error Binding to LDAP: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

然後我執行了 ProcMon(來自 Microsoft 的 Process Monitor)。

我監控了我重新啟動 Web 伺服器(Z-WAMP)的時間。在那時,沒有嘗試讀取 ldap.conf。

然後我載入了我的網頁和我的 test.php 檔案。

在那時我注意到正在讀取的是 ldap.conf,而不是 openldap.conf。

當然,因為我的檔案名為 ldap.conf,所以 openldap.conf 失敗了。我將我的 ldap.conf 重新命名為 openldap.conf,一切就都正常了。

在 Z-WAMP 上執行的 OpenLDAP 不使用 ldap.conf,而是使用 openldap.conf。

openldap.conf 檔案放置在 C:\openldap\sysconf\ 中。

由於 PUTENV 值沒有任何作用,我將它們移除。
0
ac dot russell at live dot com
12 年前
為了透過 ssl 連線到 ldap 伺服器,我需要使用憑證。為了使它能正常運作,ldap 管理員寄給我一個 .der 檔案,我將其放入 /etc/openldap/cacerts 中。
cp ldap-server.der /etc/openldap/cacerts
該目錄必須使用 chmod 755。然後,/etc/openldap/ldap.conf 中必須包含以下項目

# 使連線容易受到 MITM 攻擊
# 因為不檢查任何憑證
# 如需更好的解決方案,請參閱 https://andreas.heigl.org/2020/01/31/handle-self-signed-certificates-with-phps-ldap-extension/
# 如需正確的解決方案,請查看 https://andreas.heigl.org/2020/01/31/handle-self-signed-certificates-with-phps-ldap-extension/
TLS_CACERTDIR /etc/openldap/cacerts
只有在憑證鏈中有自我簽署憑證時,才需要 "TLS_REQCERT never"。
0
csnyder at fcny dot org
15 年前
值得重複(並且範例可能應該更新)的是,ldap_connect() 並不會實際測試與指定 ldap 伺服器的連線。如果您嘗試在基於 ldap 的驗證常式中建立容錯移轉,這很重要。

測試連線的唯一方法是實際呼叫 ldap_bind( $ds, $username, $password )。但是如果失敗了,是因為您的使用者名稱/密碼錯誤,還是因為連線已中斷?據我所知,沒有任何方法可以判斷。

似乎如果 ldap_bind() 對您的主要伺服器失敗,您別無選擇,只能嘗試使用相同的憑證對備份伺服器執行 ldap_bind()。然而,如果您的組織限制失敗的登入嘗試,則單個錯誤的密碼將計為兩次失敗的登入嘗試。這不太好。

一種可能的解決方法是先嘗試匿名繫結

<?php
// 連線到主要伺服器
$ds = ldap_connect( 'ldap://10.0.0.7/' );
// 注意:即使主要伺服器已關閉,$ds 也始終是一個資源

// 嘗試匿名登入以測試連線
$anon = @ldap_bind( $ds );
if ( !
$anon ) {
// 測試失敗,連線到容錯移轉主機
$ds = ldap_connect( 'ldap://10.0.0.8/' );
}
else {
// 測試通過,取消繫結匿名連線並重新連線到主要伺服器
ldap_unbind( $ds );
$ds = ldap_connect( 'ldap://10.0.0.7/' );
}

// 現在嘗試真實登入
$login = @ldap_bind( $ds, $username, $password );
?>

請注意,此變通方法依賴於已啟用的匿名登入,但情況並非總是如此。很遺憾沒有其他方法可以測試連線。希望在未來 ldap_connect() 的實作中可以解決這個問題。
0
geigers at binghamton dot edu
16 年前
如果您有 oci8 並嘗試使用 openldap 作為 LDAP,*可能*會遇到問題。我有一個從 Apache 連線的 Oracle 資料庫。Oracle 也有 LDAP 函式庫,它們會優先於 openldap 函式庫。這會在呼叫帶有 URI 樣式連線字串的 ldap_connect 時導致區段錯誤(seg fault);例如:ldap_connect("ldaps://myldapserver.host");

在使用 gdb 除錯核心傾印(core dump)並大量搜尋後,我發現解決方案是將一個環境變數新增到 apachectl 啟動中。

我正在使用 RHEL 上的 Apache 2.2.8 和 PHP 5.2.5。我新增了

LD_PRELOAD=/path/to/libldap.so
export LD_PRELOAD

到 /usr/sbin/envvars 中,這個檔案會在 apachectl 啟動時讀取。您可以在這裡閱讀更多相關資訊:http://www.mail-archive.com/php-bugs@lists.php.net/msg02201.html

Scott Geiger
0
bleathem at gmail dot com
16 年前
大家都在發文討論如何在 WAMP/AD 架構中讓 ldaps:// 正常運作,我花了很多時間才找到在 RHEL 5.1(使用所有預設的 RPM)中如何實現。好用的 strace 解決了問題,並幫助我找到了問題所在...

結果發現 PHP 在 /etc/pki/CA 中尋找 CA 檔案,而我對該資料夾沒有正確的權限。將其 chmod 為 755 就解決了我的「無法聯絡 LDAP 伺服器」訊息。
0
andreas dot a dot sandberg at gmail dot com
17 年前
使用 Solaris 隨附的 Sun 用戶端函式庫使用 ldap_connect 時請小心。當使用 LDAP 協定指定主機時,我的連線失敗了,我花了一整天才排除故障。例如:ldap_connect("ldap://somwhere.com"); 只要移除 'ldap://' 並指定主機即可。這是在 Solaris 10 sparc 上發生的。
0
elsint at yahoo dot com
18 年前
如果您使用的是 Windows,請小心憑證的權限。

將憑證的權限設定為「讀取」和「讀取和執行」,否則可能會因此而發生繫結錯誤。
0
Srivathsa M
19 年前
在 NetWare 上使用 LDAP over SSL

1. 將伺服器憑證複製到 sys:/php5/cert 目錄。此位置可在 php.ini 檔案中設定。

2. 在 ldap_connect 呼叫中使用主機名稱引數的 "ldaps://" 前綴或連接埠號碼引數的值 636。

如需更多詳細資訊,請參閱 NetWare 特有的 PHP 文件:http://developer.novell.com/ndk/doc/php/index.html
0
nigelf at esp dot co dot uk
19 年前
如上所述,即使伺服器名稱無效,openLDAP 也總是會傳回資源。

如果您然後使用抑制錯誤 (@ldap_bind) 進行繫結,而且失敗了,則導致失敗的原因(例如:連線或憑證)並不明顯。由於繫結不會傳回資源,您也無法從 ldap_error 等取得最後的錯誤。

如果您只向使用者顯示有關登入失敗的訊息,當錯誤實際上是連線問題時,他們可能會因為重複輸入有效的用戶名/密碼而感到沮喪。
-1
vandervoord at planet dot nl
17 年前
先前關於搜尋整個 AD 樹狀結構的註解完全有效。不過,您必須確保您正在驗證/搜尋的伺服器是全域類別目錄伺服器。否則,連線和繫結將會失敗。通常您的網域中至少有一個全域類別目錄伺服器,因此如果連線失敗,請嘗試另一台伺服器,它將會正常運作。之所以會這樣運作的原因是,全域類別目錄伺服器會搜尋整個網域,而網域類別目錄只會搜尋給定的 OU,當然這也構成了一個安全威脅:)。。。
-1
匿名
22 年前
當使用 URL 作為主機參數時,總是會傳回資源 ID
即使主機不存在也是如此。

「當使用 URI 來描述連線時,(open)ldap 函式庫
只會解析 URL 並檢查其是否有效,_在這種情況下不會建立任何連線_。」
mfischer@php.net
-mfischer@php.net
http://bugs.php.net/bug.php?id=15637
-2
mharting at micahtek dot com
15 年前
這是為了補充關於嘗試設定容錯移轉的內容。在執行 ldap_connect 之後,請執行 ldap_bind。如果 ldap_bind 失敗,請使用命令 ldap_errno 來取得錯誤號碼。如果錯誤號碼是 81,則表示伺服器已關閉。只有在這種情況下,我們才會容錯移轉到我們的備份 LDAP 伺服器。

另一個要考慮的事情是,錯誤可能是 49,然後執行
ldap_get_option($this->ds,LDAP_OPT_ERROR_NUMBER,$optErrorNumber);。這將會傳回擴充資料,如果其中的資料代碼是 532 或 773,則繫結失敗將是因為密碼已過期,需要更新密碼才能成功繫結。
-4
verikono
13 年前
PHP:LDAP 不支援持續性連線。
To Top