2009-06-26 14 views
15

मैं PHP के माध्यम से एक सुरक्षित एलडीएपी सर्वर (एलडीएपी का उपयोग करके) से कनेक्ट करने का प्रयास कर रहा हूं, लेकिन मुझे इसके साथ समस्याएं आ रही हैं। मैं निम्नलिखित त्रुटि मिलती हैएलडीएपी और PHP कनेक्शन विफलता

चेतावनी: ldap_bind() [function.ldap-बाँध]: सर्वर करने के लिए बाध्य करने में असमर्थ: लाइन पर /var/www/test.php में LDAP सर्वर संपर्क नहीं कर सकता 16

जब मैं एलडीएपी के बिना कनेक्ट करने का प्रयास करता हूं तो मैं काम करता हूं, लेकिन यह आवश्यक है कि मैं एलडीएपी का उपयोग करता हूं क्योंकि मैं संवेदनशील जानकारी से निपटने जा रहा हूं।

मैं निम्नलिखित कोड

<?php 
// basic sequence with LDAP is connect, bind, search, interpret search 
// result, close connection 

echo "<h3>LDAP query test</h3>"; 
echo "Connecting ..."; 
$ds=ldap_connect("ldaps://server"); // must be a valid LDAP server! 




print $ds; 

if ($ds) { 
    echo "<br><br>Binding ..."; 
    $r=ldap_bind($ds);  // this is an "anonymous" bind, typically 
          // read-only access 
    echo "Bind result is " . $r . "<br />"; 

    echo "Searching for (sn=S*) ..."; 
    // Search surname entry 
    $sr=ldap_search($ds, "ou=people,o=server.ca,o=server", "uid=username*"); 
    echo "Search result is " . $sr . "<br />"; 

    echo "Number of entires returned is " . ldap_count_entries($ds, $sr) . "<br />"; 

    echo "Getting entries ...<p>"; 
    $info = ldap_get_entries($ds, $sr); 
    echo "Data for " . $info["count"] . " items returned:<p>"; 

print_r($info); 
// for ($i=0; $i<$info["count"]; $i++) { 
//  echo "dn is: " . $info[$i]["dn"] . "<br />"; 
//  echo "first cn entry is: " . $info[$i]["cn"][0] . "<br />"; 
//  echo "first email entry is: " . $info[$i]["mail"][0] . "<br /><hr />"; 
// } 

    echo "Closing connection"; 
    ldap_close($ds); 

} else { 
    echo "<h4>Unable to connect to LDAP server</h4>"; 
} 
?> 
+1

मुझे स्पष्ट पूछने से नफरत है, लेकिन "ldaps: // server" एक वैध एलडीएपी सर्वर है? यह मेरे लिए वैध यूआरआई जैसा नहीं दिखता है ... –

+1

यह एक वैध सर्वर है। मैंने सुरक्षा प्रयोजनों के लिए असली servername लिखा नहीं है –

+0

क्या यह आईआईएस या अपाचे पर है? –

उत्तर

0

उपयोग कर रहा हूँ मुझे लगता है कि तुम सिर्फ होने के लिए अपनी LDAP- सर्वर पर "गुमनाम बांध" सक्षम करने के लिए 3

echo "<h3>LDAP query test</h3>"; 
echo "Connecting ..."; 

$ldap_server = 'ldaps://server'; 
$ldap_port = '636'; 

$ds = ldap_connect($ldap_server, $ldap_port); 

if ($ds) 
{ 
    //add this 
    if (!ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) 
    { 
     fatal_error("Failed to set LDAP Protocol version to 3, TLS not supported."); 
    } 
    echo "<br><br>Binding ..."; 
    $r=ldap_bind($ds);  // this is an "anonymous" bind, typically 
         // read-only access 
    echo "Bind result is " . $r . "<br />"; 

    echo "Searching for (sn=S*) ..."; 
    // Search surname entry 
    $sr=ldap_search($ds, "ou=people,o=server.ca,o=server", "uid=username*"); 
    echo "Search result is " . $sr . "<br />"; 

    echo "Number of entires returned is " . ldap_count_entries($ds, $sr) . "<br />"; 

    echo "Getting entries ...<p>"; 
    $info = ldap_get_entries($ds, $sr); 
    echo "Data for " . $info["count"] . " items returned:<p>"; 

    print_r($info); 
    // for ($i=0; $i<$info["count"]; $i++) { 
    //  echo "dn is: " . $info[$i]["dn"] . "<br />"; 
    //  echo "first cn entry is: " . $info[$i]["cn"][0] . "<br />"; 
    //  echo "first email entry is: " . $info[$i]["mail"][0] . "<br /><hr />"; 
    // } 

    echo "Closing connection"; 
    ldap_close($ds); 

} 
else 
{ 
    echo "<h4>Unable to connect to LDAP server</h4>"; 
} 
+0

क्षमा करें, यह काम नहीं किया। इसने कभी भी आपके त्रुटि संदेश को फेंक दिया, न ही यह छेड़छाड़ –

0

कोशिश ldap प्रोटोकॉल संस्करण स्थापित करने की आवश्यकता या एक सही बांध (उपयोगकर्ता नाम/पासवर्ड) का उपयोग करें।

तरह cn=ldapauthuser,ou=accounts,dc=example,dc=com

7

समस्या वास्तविक बाध्यकारी प्रक्रिया (अमान्य क्रेडेंशियल्स) से संबंधित नहीं है चेतावनी के रूप में एक अलग से एक हो सकता है अगर LDAP सर्वर आपके क्रेडेंशियल्स प्रमाणित नहीं किया जा सकता है। लेकिन Paul Dixon के अनुसार ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3) के उपयोग की आवश्यकता होनी चाहिए - भले ही मुझे नहीं लगता कि यह आपकी समस्याओं का कारण है।

  • कौन सा एलडीएपी सर्वर प्रकार आप कनेक्ट कर रहे हैं? ओपनएलडीएपी, सक्रिय निर्देशिका या कुछ और?
  • आपके PHP प्रोग्राम को चलाने वाले कंप्यूटर की ऑपरेटिंग सिस्टम क्या है?
  • क्या आप एलडीएपी सर्वर पर एक स्व-हस्ताक्षरित SSL प्रमाणपत्र का उपयोग कर रहे हैं और आपके PHP प्रोग्राम चलाने वाली मशीन द्वारा विश्वसनीय दिए गए प्रमाण पत्र के लिए प्रमाणपत्र प्राधिकरण है?
  • एलडीएपी सर्वर किस पोर्ट पर चल रहा है? 636 एलडीएपीएस के लिए "आधिकारिक" बंदरगाह होगा। शायद आप पोर्ट पते को सर्वर पते पर स्पष्ट रूप से जोड़ सकते हैं: ldaps://<<server>>:636

ext/ldap में SSL/TLS सुरक्षित कनेक्शन के साथ कुछ समस्याएं हैं। आप के रूप में यह मुश्किल है C:\OpenLDAP\sysconf\ldap.conf में उपरोक्त सामग्री के साथ ldap.conf (/etc/ldap.conf या /etc/ldap/ldap.conf * पर nix आधारित सिस्टम) के लिए या Windows मशीनों के लिए

TLS_REQCERT never 

जोड़ने बनाने के लिए एक ldap.conf कोशिश कर सकते हैं (पथ एक सटीक मिलान होना चाहिए विस्तार में कोडित)।

+0

बाध्य किया, धन्यवाद, TLS_REQCERT ने मेरे लिए चाल बनाई। –

+0

यह विकल्प एलडीएपी प्रारंभिक विकल्पों के माध्यम से भी सेट किया जा सकता है (किसी भी तरह python पर, ldap.set_option (ldap.OPT_X_TLS_REQUIRE_CERT, ldap।OPT_X_TLS_NEVER)) –

+1

आईएमओ, यह सरल डिबगिंग से परे किसी भी चीज़ के लिए बहुत बुरी सलाह है। सभी टीएलएस प्रमाणपत्र जांच को अक्षम नहीं करने के लिए TLS_REQCERT सेट करना। यह पहली जगह टीएलएस का उपयोग करने के पूरे उद्देश्य को हरा देता है। इस विकल्प सेट के साथ, कनेक्शन की सुरक्षा की कोई गारंटी नहीं है। –

2

यह हाल ही के PHP संस्करणों के साथ कुछ सर्वरों पर एसएसएल/टीएलएस का उपयोग करने में एक समस्या प्रतीत होता है। यकीन नहीं है कि क्यों। आप मेरी पोस्ट को यहां देख सकते हैं: Problems with secure bind to Active Directory using PHP

स्टीफन का कारण अधिक संभावित कारणों में से एक है। यह सुनिश्चित करने के लिए कि यह वास्तव में मामला है, आप इसका उपयोग कर सकते हैं:

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7); 

आपके ldap_connect से पहले। यह लॉग करने के लिए एक और अधिक त्रुटि संदेश मुद्रित करेगा (आमतौर पर एसएसएल प्रमाण मान्य नहीं है, रेफरी।स्टीफन गेह्रिग)

2

हालांकि पुराना, मुझे एक ही समस्या का सामना करना पड़ा और भविष्य के पाठकों के लिए कुछ अंतर्दृष्टि प्रदान करना चाहता था।

समस्या का हिस्सा ओपनएसएसएल पुस्तकालयों, 0.9.6 बनाम 1.0.0 (जो काम करता था) था।

सर्वर पर ओपनएसएसएल अपडेट करने के बाद, यह नोट किया गया कि PHP ओपनएसएसएल के लिए समर्थन खो गया है।

आप कमांड लाइन से निम्नलिखित के साथ मॉड्यूल के लिए समर्थन की जाँच कर सकते हैं:

php -m 

या

echo phpinfo(INFO_MODULES); 

ब्राउज़र से।

इसके अलावा, मेरे पेशेवर अनुभव में ओसीआई 8/ओरेकल एलडीएपी libs का उपयोग करते समय एलडीएपी के लिए एसएसएल समर्थन के साथ बहुत सारे मुद्दे रहे हैं। डेबियन प्लेटफार्मों पर, लिबल्डैप-2.4.2-देव पैकेज सबसे अच्छा काम करते हैं।

इसके अतिरिक्त, आपको एलडीएपी सर्वर पर कनेक्शन लॉग देखना चाहिए। मैं लगभग गारंटी दे सकता हूं कि आपको SSLv3 का जिक्र करने में त्रुटि दिखाई देगी और प्रमाण पत्र के लिए CA खोना होगा।

डिफ़ॉल्ट रूप से, PHP में यूनिक्स सिस्टम पर सीए फ़ाइल के लिए लग रहा है, (.. CLI, अपाचे उपयोगकर्ता, आदि के माध्यम से उपयोगकर्ता) यकीन है कि यह पीएचपी invoker द्वारा पढ़े जाने योग्य बनाने:

/etc/pki/CA 

यह नहीं है जरूरी एक PHP मुद्दा, लेकिन सुरक्षित एलडीएपी के साथ एक विन्यास मुद्दा। कृपया यह PHP bug report और यह OpenLDAP thread देखें।

उपरोक्त OpenLDAP थ्रेड में संदर्भ के लिए एक Open OpenAP कॉन्फ़िगरेशन का एक स्निपेट है।

जांच करने के लिए कुछ अन्य चीजें/etc/सेवाओं में आपकी सेवाएं परिभाषाएं हैं।

ldaps   636/tcp       # LDAP over SSL 
ldaps   636/udp 
0

यूनिक्स "आदमी ldap.conf" = ... SYNOPSIS /usr/local/etc/openldap/ldap.conf पर ...

लिखें TLS_REQCERT कभी नहीं: निम्नलिखित सुनिश्चित करें कि आपने /usr/local/etc/openldap/ldap.conf में और ldap_set_option सेट ($ डी एस, LDAP_OPT_PROTOCOL_VERSION, 3)

nginx + पीएचपी-एफ पी एम पर अपने प्रोजेक्ट में इस काम: nginx/1.6.0 php55 -5.5.15 php55-ldap-5.5.15 openldap-c lient-2.4.39_1

संबंधित मुद्दे