2016-01-26 244 views
1

我想連接到Windows 2012服務器上使用PHP 7的MS Active Directory(運行Apache 2.4,但應該與我有問題無關)。PHP ldap_connect使用ldaps連接到Active Directory獲取未知CA錯誤

我還應該注意到,我能夠使用來自命令行和apache服務器的非安全LDAP從PHP連接到AD。

當我執行下面的PHP的測試文件,源:http://muzso.hu/2012/04/02/php-ldap-ssl-ldaps-authentication-in-windows-running-apache,從Web服務器上的命令行:


$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."; 

我得到以下輸出(I突出了錯誤):


ldap_url_parse_ext(LDAP://本地主機/)
ldap_init:試圖%SYSCONFDIR%\的ldap.conf
ldap_init:HOME ENV是NULL
ldap_init:試圖ldaprc
ldap_init:LDAPCONF ENV是NULL
ldap_init:LDAPRC ENV是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_插座: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的寫客戶端問候一個
TLS跟蹤:所以SSL_connect:SSLv3的讀取服務器問候一個
TLS證書驗證:深度:1,錯誤:20,主題:/ DC = com/DC = example/C
N = Self_Named-SHA256-SUBCA,發行人:/ CN = ITSS-ENT-SHA256根
TLS證書驗證錯誤,無法獲取本地頒發者證書
TLS跟蹤:SSL3警報寫:致命:未知CA
TLS跟蹤:所以SSL_connect:錯誤錯誤
TLS跟蹤:所以SSL_connect:錯誤
TLS錯誤:無法連接:錯誤:14090086:SSL
套路:ssl3_get_server_certificate:證書驗證失敗(不能獲得本地發行人證書)。
ldap_err2string
PHP警告:ldap_bind():無法綁定到服務器:無法聯繫C:\ test_bind中的LDAP服務器。PHP的第10行


我已在php_ldap和php_openssl擴展都在我的php.ini文件中取消註釋。

我有DER和PEM格式的AD CA證書副本,但我不確定將這些文件放在我的Web服務器上的位置。有很多與linux操作系統相關的帖子,簡單地說,在我的ldap.conf文件中放置「TLS_CACERT C:\ openldap \ sysconf \ cacert.pem」。我沒有運行openLDAP,也沒有ldap.conf文件。

我有OpenSSL的安裝,但我不能完全肯定的是,配置是正確的:

  • 的openssl.cfg文件是不變的:http://pastebin.com/KxnWThXh
  • 我增加了一個環境變量「OpenSSL的」指向openssl.cfg文件
  • 當我從cmd行執行'openssl version -a'時,它顯示:OPENSSLDIR:/ usr/local/ssl這顯然對windows沒有意義。 完整的輸出可以在這裏看到:http://pastebin.com/h3ei3Pwp

==編輯1:============================= ===========

加布裏埃爾,感謝您的建議/參考。

我現在也嘗試過這些東西都沒有成功:

  • 創建一個ldap.conf的和openldap.conf文件(使用基於各種文章建議,許多diferent格式,見我在這裏嘗試了變化:http://pastebin.com/aP94Nh4Y)在C:\和C:\ openldap \ sysconf
  • 這篇文章(https://www.reddit.com/r/PHPhelp/comments/3tykpc/php_7_and_ldap/)說創建一個名爲'LDAPCONF'的環境變量指向ldap.conf文件(C:\ openldap \ sysconf \ ldap。 CONF)。我做到了。不用找了。
  • 我在執行我的測試php腳本(輸出的第2行)的輸出中注意到了這一點:ldap_init:正在嘗試%SYSCONFDIR%\ ldap.conf。 SYSCONFDIR環境變量尚不存在,因此我添加了一個值爲'C:\ openldap \ sysconf \'的值。 - 不用找了。
  • 在我的ldap.conf/openldap.conf文件的所有位置引入了一個明顯的語法錯誤,以查看是否可以更改測試腳本輸出以知道它至少正在查看其中一個文件 - 沒有任何更改。

==編輯2:====================================== ==

加布裏埃爾,感謝您的過程監控提示。我現在至少可以確認PHP 7正在使用'LDAPCONF'環境值路徑來查找並讀取此ENV變量指向的ldap.conf文件。

還顯示出PHP 7不正確處理「SYSCONFDIR」環境變量,因爲它第一次嘗試在這個文字路徑打開文件:E:\的httpd \ WWW \%SYSCONFDIR%\ ldap.conf的

它還沒有工作,但現在我可以集中精力調整我知道它正在閱讀的一個文件。

如果任何人有任何其他配置技巧或可以從工作的Windows安裝共享他們的ldap.conf文件,我將不勝感激。


現在仍然卡住,不知道還能做什麼。請幫忙!

回答

1

這裏的答案應該有所幫助:https://stackoverflow.com/a/6047293/1202807

Under XAMPP on Windows the ldap.conf must be either in the root of the system (c:\ldap.conf, PHP 5.3.3 if I remember correctly) or in C:\openldap\sysconf\ depending on the PHP version. It seems the path is not configurable because hardcoded in the Windows PHP DLLs. See the comments at http://se2.php.net/manual/en/ref.ldap.php

所以在C創建ldap.conf的文件:\或C:\ OpenLDAP的\的sysconf如果不存在的話,把你的TLS_CACERT線\在裏面。

+0

註釋[這裏](http://se2.php.net/manual/en/function.ldap-connect.php#116524)表明,它可能看起來爲「openldap.conf」。因此,如果「ldap.conf」不起作用,請嘗試。 –

+0

http://stackoverflow.com/users/1202807/gabriel-luci - 謝謝。我試過這些東西,還有更多,沒有成功。我已經用細節更新了我的問題。 – Drew

+1

下面是我做的事情,當我不知道什麼東西在尋找文件時:下載[Process Monitor](https://technet.microsoft.com/en-us/sysinternals/processmonitor.aspx)。運行它(以管理員身份)。當它開始時,你會得到一個對話框來添加過濾器。爲Path添加一個過濾器包含「ldap.conf」。點擊添加,確定。重啓Apache(如果你正在使用它),然後執行你的PHP文件。看看Process Monitor中是否有任何東西出現。如果是這樣,它應該顯示你正在尋找文件的路徑。 –

0

我有類似的問題,我花了一些時間來解決它。這種行爲是PHP中的OpenLDAP錯誤。我已經報道了它,它已經修復並且很快就會發布。請參閱:PHP BUG#73243(https://bugs.php.net/bug.php?id=73243

如果您需要立即修復,這是一個有點黑客,試試這個(在你自己的風險):

  • 使用一些二進制編輯器(如hexedit的)到編輯php_ldap.dll
  • 找到表達「%SYSCONFDIR%\ ldap.conf的」和
  • 替換爲「C:\ ldap_conf \的ldap.conf」,新常數必須具有相同的長度被替換的恆定
  • 將ldap配置複製到新位置

希望,它有助於:-)

相關問題