2013-06-06 5 views
6

के माध्यम से एलडीएपी सर्वर पर नमूना कार्यक्रम को बाध्य करने में असमर्थ मेरे पास एक नमूना प्रोग्राम है जो सुरक्षित पोर्ट (एलडीएपी: //) पर एलडीएपी सर्वर से कनेक्ट करने का प्रयास कर रहा है हालांकि, नमूना कार्यक्रम नहीं है सर्वर से बांधने में सक्षम।एसएसएल (ldaps: //)

#define LDAP_DEPRECATED 1 
#include <stdio.h> 
#include <ldap.h> 

#define BIND_DN "dc=example,dc=com" 
#define BIND_PW "secret" 

int main() { 
    LDAP *ld; 
    int rc; 
    int reqcert = LDAP_OPT_X_TLS_NEVER; 
    int version = LDAP_VERSION3; 
    int ret(0); 

    if (ldap_initialize (&ld, "ldaps://192.168.1.51:10636")) { 
     perror("ldap_init"); /* no error here */ 
     return(1); 
    } 

    ldap_set_option (ld, LDAP_OPT_PROTOCOL_VERSION, &version); 
    ldap_set_option (ld, LDAP_OPT_X_TLS_REQUIRE_CERT, &reqcert); 

    rc = ldap_bind_s(ld, BIND_DN, BIND_PW, LDAP_AUTH_SIMPLE); 

    if(rc != LDAP_SUCCESS) 
    { 
     fprintf(stderr, "ldap_simple_bind_s: %s\n", ldap_err2string(rc)); 
     return(1); 
    } 
    printf("Initial Authentication successful\n"); 
    ldap_unbind(ld); 
} 

हालांकि, START_TLS के साथ नमूना कार्यक्रम को सफलतापूर्वक LDAP सर्वर पोर्ट 10389. ldapsearch ग्राहक पर चल रहा है के लिए बांधता है सर्वर से कनेक्ट ans उपयोगकर्ता आधार पेड़ खोज करने के लिए सक्षम है। लेकिन उपरोक्त नमूना कार्यक्रम नहीं है।

यह START_TLS के साथ काम करने के लिए:

ldap_set_option (ld, LDAP_OPT_X_TLS_REQUIRE_CERT, &reqcert);  
rc = ldap_start_tls_s(ld, NULL, NULL); 
    if (rc != LDAP_SUCCESS) { 
     printf("ldap_start_tls() %s",ldap_err2string(ret)); 
    } 

किसी का कहना है सकते हैं कि मैं यहाँ ldaps के माध्यम से LDAP सर्वर के लिए बाध्य के लिए याद आ रही है: // ?? यहाँ मैं क्या जोड़ लिया है है

+0

मैं सी ++ से बहुत परिचित नहीं हूं, लेकिन मैंने सीडी में एलडीएपीएस से निपटने से पहले यह वही त्रुटि देखी है। जिस तरह से हमने इसे तय किया था, वह 'सत्यापन प्रमाणक प्रमाणपत्र' सत्र विकल्प पर हमेशा 'प्रतिनिधि {वापसी सत्य}' वापस कर रहा था: 'ldapConnection.SessionOptions.VerifyServerCertificate + = प्रतिनिधि {वापसी सत्य; }; 'क्या आप सी ++ में कुछ ऐसा कर सकते हैं? – X3074861X

उत्तर

0

संपादित /etc/openldap/ldap.conf, पंक्ति जोड़ें।

+0

क्या यह ldap संरचना विकल्प "LDAP_OPT_X_TLS_REQUIRE_CERT" को "LDAP_OPT_X_TLS_NEVER" पर सेट करने जैसा नहीं है ?? –

+0

ldap_initialize कॉन्फ़िगरेशन फ़ाइल को पढ़ेगा। सिद्धांत रूप में, विकल्प को काम करना चाहिए, जांच की वजह है, ... –

+0

मैंने इसे कभी भी कहीं भी दस्तावेज नहीं देखा। धन्यवाद। Ldap_init() के बारे में कैसे (हालांकि बहिष्कृत, यह मेरे लिए ठीक है) ?? क्या वह कॉन्फ़िगरेशन फ़ाइल पढ़ेगा ?? या ldap_set_option() प्राथमिकता लेता है? –

0

ऐसा लगता है कि आप एसएसएल पोर्ट पर एक टीएलएस कनेक्शन स्थापित करने की कोशिश कर रहे हैं, जो संभव नहीं है। यहां wiki page on LDAP:

एक समान गैर-मानक ldaps है: एसएसएल पर एलडीएपी के लिए यूआरएल योजना है। इसे टीएलएस के साथ एलडीएपी के साथ भ्रमित नहीं किया जाना चाहिए, जिसे मानक एलडीएपी: स्कीम का उपयोग कर स्टार्ट टीएलएस ऑपरेशन का उपयोग करके हासिल किया जाता है।

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

हालांकि अगर आपको एक एसएसएल कनेक्शन बनाने की आवश्यकता है तो मेरा मानना ​​है कि this thread on openldap site मदद करेगा। संक्षेप में मुझे लगता है (क्षमा करें मेरे पास यह जांचने के लिए कोई वातावरण नहीं है) आपको LDAP_OPT_X_TLS_REQUIRE_CERT के बजाय LDAP_OPT_X_TLS_CACERTFILE का उपयोग करने की आवश्यकता है। इसके अलावा आपको ldap_start_tls_s को कॉल नहीं करना चाहिए, क्योंकि यह टीएलएस कनेक्शन स्थापित करने का प्रयास करेगा (जिसे आप नहीं चाहते हैं)।

TLS_REQCERT कभी नहीं

दोबारा प्रयास करें:

+0

मैं एसएसएल पोर्ट पर टीएलएस स्थापित करने की कोशिश नहीं कर रहा हूं। मैं एसएसएल (पोर्ट 10636) को समर्पित पोर्ट एसएसएल सेट करने की कोशिश कर रहा हूं। इसके अलावा, मेरे पास सर्वर सत्यापित करने के लिए प्रमाणपत्र नहीं है। इसलिए, मैं "LDAP_OPT_X_TLS_REQUIRE_CERT" को "LDAP_OPT_X_TLS_NEVER" पर सेट कर रहा हूं .. ldap.dQ फ़ाइल में कभी भी TLS_REQCERT स्थापित करने के बराबर नहीं है। –