php
  • oracle
  • ldap
  • 2011-05-04 87 views 2 likes 
    2

    一直在玩這個好幾天,無法讓PHP綁定到Oracle的DSEE上的ldap。PHP無法連接到LDAP Oracle Directory Server企業版

    function test(){ 
    
    
        // LDAP variables 
        $ldaphost = "xxx.xxxxx.com";   
        $ldapport = 636; 
        $ldaprdn = 'cn=xyxyxyxy,ou=Accounts,dc=xxx,dc=xxxxx,dc=com'; 
        $ldappass = 'vcvcvcvcvc'; 
    
        ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7); // isn't helping 
    
        // Connecting to LDAP 
        $ldapconn = ldap_connect($ldaphost, $ldapport) 
           or die("Could not connect to $ldaphost"); 
    
        if ($ldapconn) { 
    
         // binding to ldap server 
         $ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass); 
    
         // verify binding 
         if ($ldapbind) { 
          echo "LDAP bind successful..."; 
         } else { 
          echo "LDAP bind failed..."; 
         } 
    
        } 
    } 
    

    我得到的錯誤:

    消息:的ldap_bind()[function.ldap綁定]:無法綁定到服務器:無法聯繫LDAP服務器

    撕裂我的頭髮在這一個。我只是不能把事情綁定。

    已經嘗試了直接telnet到端口636上的主機,並沒有被任何防火牆阻止。特別是我沒有從屏幕上或日誌中的'LDAP_OPT_DEBUG_LEVEL'獲得任何額外的調試信息。

    +0

    我想象的問題是與dn,確保它是正確的(它可能會嘗試聯繫不同的服務比你的期望)。 – Resorath 2011-05-04 19:54:52

    +0

    嗯。這就是服務器管理員給我使用的dn。 – phirschybar 2011-05-05 01:14:55

    +0

    通過telnet連接時,它與php腳本運行在同一臺服務器上嗎?另外,使用'$ ldaphost ='ldaps://xxx.xxx.com'; $ ldapconn = ldap_connect($ ldaphost);'(當使用主機名的URL標識符時''port'參數不在'ldap_connect()'中使用),正如Stefan Gehrig所說。如果你成功建立連接,也許你需要在'ldap_connect()'後面調用ldap_start_tls()' – 2011-05-09 13:58:23

    回答

    3

    start_tls()ldaps是相互排斥的,這意味着你不能在SSL端口(標準636)上發出start_tls(),或unecrypted端口(標準389)上發起ldaps。在連接啓動後,start_tls()命令會在未加密的端口上啓動安全連接,因此您會在綁定發生之前發出此命令以使其加密。另一組公共端口是3268(未加密)和3269(ssl),可能在您的服務器中啓用。

    ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

    被記錄到Web服務器錯誤日誌,這取決於你的日誌級別,或粗壯(從PHP CLI)。要在這裏獲得更多信息,請檢查您的Web服務器日誌級別設置,或者直接從命令行運行php腳本。

    要成功使用ssl端口,您需要指定ldaps://前綴,而在未加密的端口上,這不是必需的(前綴爲ldap://)。

    看你的代碼,這可能是一個協議版本問題,因爲PHP默認使用第2版。爲了解決這個問題,你可以發出:

    ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION,3); 
    ldap_set_option($conn, LDAP_OPT_REFERRALS,0); 
    

    您嘗試綁定之前。

    您也可以看看​​中的代碼,我在CentOS 5中成功使用該代碼,但在Ubuntu中遇到問題。如果您的服務器有一個開放的未加密端口,最好對其進行未加密的測試綁定,以排除任何連接問題。

    要檢查該端口是開放的,你可以檢查的telnet連接它,E.G:

    telnet my.server.com 3268 
    

    如果端口是開放的,那麼你應該能夠用它來綁定。

    *編輯:如果SSL證書被認爲無效,連接將失敗,如果是這種情況,將調試級別設置爲7將宣佈這一點。爲了解決這個特定的問題,你需要忽略的有效性:

    您可以通過在你的PHP代碼發行

    putenv('LDAPTLS_REQCERT=never'); 
    

    忽略Windows中的有效性。在*您需要編輯/etc/ldap.conf中用尼克斯包含

    TLS_REQCERT never 
    
    +0

    我試圖設置LDAP_OPT_PROTOCOL_VERSION和LDAP_OPT_REFERRALS沒有運氣。過去也嘗試過你的每一個建議,並且仍然有問題。 – phirschybar 2011-05-13 08:50:47

    +0

    你的telnet測試結果如何?你在做什麼操作系統? debuglevel 7的輸出是什麼? – 2011-05-13 14:05:15

    +0

    該ssl建議釘住了它。謝謝。 – phirschybar 2011-05-16 02:32:28

    0

    端口636是支持SSL的端口,需要啓用SSL的連接。 您應該嘗試連接端口389,或更改您的代碼以包含安全層(更復雜)。

    親切的問候,

    朱利

    0

    要使用SSL連接,你應該嘗試

    $ldapconn = ldap_connect('ldaps://'.$ldaphost); 
    

    這將在端口636是默認ldaps -port自動連接。根據您的服務器安裝和配置,可能只允許在端口389上進行連接(不使用加密或使用TLS),或者僅在使用SSL加密的端口636上進行連接。儘管您的服務器可能會公開其他端口。因此,一般來說,您需要知道要連接到哪個端口以及服務器需要哪種加密方法(無加密,SSL或TLS)。

    +0

    根據LDAP管理員,我們必須使用SSL和端口636.我嘗試使用你建議的前綴無濟於事。 – phirschybar 2011-05-05 20:49:40

    0

    用一個有效的CA簽署的LDAP服務器的證書?也許你的客戶拒絕證書!

    相關問題