[英]PHP ldap_connect using ldaps to connect to Active Directory getting Unknown CA error
我正在嘗試在Windows 2012服務器上使用PHP 7連接到MS Active Directory(運行apache 2.4,但這應該與我遇到的問題無關)。
我還應該注意,我能夠從命令行和apache服務器使用非安全LDAP從PHP連接到AD。
當我執行以下PHP測試文件時,從Web上的命令行獲取源: http : //muzso.hu/2012/04/02/php-ldap-ssl-ldaps-authentication-in-windows-running-apache服務器:
$AD_search_bind_DN = 'CN=someuser,OU=Users,DC=example,DC=com';
$AD_search_bind_PW = 'secret123';
ini_set('display_errors', 1);
error_reporting(E_ALL);
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
$conn = ldap_connect('ldaps://SomeDC.example.com/') or die("Failed to connect to ldap server.");
ldap_set_option(NULL, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_bind($conn, $AD_search_bind_DN, $AD_search_bind_PW) or die("Failed to bind to ldap server: " + ldap_error($conn));
echo "Successful LDAP bind.";
我得到以下輸出(我突出顯示了錯誤):
ldap_url_parse_ext(ldap:// localhost /)
ldap_init:嘗試%SYSCONFDIR%\\ ldap.conf
ldap_init:HOME環境為NULL
ldap_init:嘗試ldaprc
ldap_init:LDAPCONF環境為NULL
ldap_init:LDAPRC環境為NULL
ldap_create
ldap_url_parse_ext(ldaps://SomeDC.example.com/)
ldap_sasl_bind_s
ldap_sasl_bind
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host:TCP SomeDC.example.com:636
ldap_new_socket:244
ldap_prepare_socket:244
ldap_connect_to_host:嘗試{已刪除SomeDC的IP地址}:636
ldap_pvt_connect:fd:244 tm:-1異步:0
嘗試連接:
連接成功
TLS跟蹤:SSL_connect:之前/連接初始化
TLS跟蹤:SSL_connect:SSLv2 / v3寫入客戶端問候A
TLS跟蹤:SSL_connect:SSLv3讀取服務器問候A
TLS證書驗證:深度:1,錯誤:20,主題:/ DC = com / DC = example / C
N =自定義名稱SHA256-SubCA,頒發者:/ CN = ITSS-Ent-SHA256-Root
TLS證書驗證:錯誤,無法獲取本地發行者證書
TLS跟蹤:SSL3警報寫入:致命:未知CA
TLS跟蹤:SSL_connect:錯誤錯誤
TLS跟蹤:SSL_connect:錯誤錯誤
TLS:無法連接:錯誤:14090086:SSL
例程:ssl3_get_server_certificate:證書驗證失敗(無法獲取本地發行者證書)。
ldap_err2字符串
PHP警告:ldap_bind():無法綁定到服務器:在第10行的C:\\ test_bind.php中無法聯系LDAP服務器
我在php.ini文件中同時注釋了php_ldap和php_openssl擴展名。
我有DER和PEM格式的AD CA證書的副本,但是我不確定將這些文件放在Web服務器上的位置。 有很多與Linux OS相關的帖子,只是說要在我的ldap.conf文件中放置“ TLS_CACERT C:\\ openldap \\ sysconf \\ cacert.pem”。 我沒有運行openLDAP,也沒有ldap.conf文件。
我已經安裝了openSSL,但是我不能完全確定配置是否正確:
==編輯1:========================================
加百利,感謝您的建議/參考。
我現在也嘗試了這些事情,但沒有成功:
==編輯2:=======================================
Gabriel,感謝您的過程監控技巧。 現在,我至少可以確認PHP 7正在使用“ LDAPCONF”環境值路徑來查找和讀取此ENV變量指向的ldap.conf文件。
還似乎PHP 7沒有正確處理'SYSCONFDIR'環境變量,因為它首先嘗試在以下文字路徑中打開文件:E:\\ httpd \\ www \\%SYSCONFDIR%\\ ldap.conf
它仍然沒有工作,但是現在我可以集中精力調整我知道正在讀取的一個文件。
如果有人有其他配置建議,或者可以從正在運行的Windows安裝中共享ldap.conf文件,我將不勝感激。
我現在 仍然陷於困境,不知道該怎么辦。 請幫忙!
此處的答案應該有所幫助: https : //stackoverflow.com/a/6047293/1202807
在Windows上的XAMPP下,ldap.conf必須位於系統根目錄(c:\\ ldap.conf,如果我沒有記錯的話,則為PHP 5.3.3),或者位於C:\\ openldap \\ sysconf \\中,具體取決於PHP版本。 似乎該路徑不可配置,因為在Windows PHP DLL中進行了硬編碼。 參見http://se2.php.net/manual/en/ref.ldap.php上的評論
因此,如果尚不存在,請在c:\\或C:\\ openldap \\ sysconf \\中創建ldap.conf文件,然后將TLS_CACERT行放入其中。
我有類似的問題,我花了一些時間解決它。 此行為是PHP中的OpenLDAP錯誤。 我已經報告了它,它已經修復,將很快發布。 請參閱:PHP BUG#73243( https://bugs.php.net/bug.php?id=73243 )
如果您需要立即修復(有點hacking),請嘗試此操作(后果自負):
希望能幫助到你 :-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.