2011-10-10 7 views
11

शुभ दिन।पायथन + एलडीएपी + एसएसएल

अग्रिम में मेरी अंग्रेजी के लिए माफ़ी मांगने के लिए, मेरे राष्ट्रीय मंच और संसाधनों ने मदद नहीं की।

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

मुद्दे का अध्ययन करने के बाद, यह स्पष्ट है कि बन गया

  1. पासवर्ड आवंटित करने के लिए या परिवर्तन केवल सर्वर
  2. पासवर्ड भेजने के लिए एक एन्क्रिप्टेड संबंध स्थापित कर सकते एनकोडिंग utf-16-le में केवल आवश्यक है

सामान्य तौर पर दूसरे के साथ कोई समस्या नहीं है, लेकिन पहले से एक समस्या है

$ python ldap-test-starttls.py 
Traceback (most recent call last): 
    File "ldap-test-starttls.py", line 9, in <module> 
    l.simple_bind_s("cn=admin,ou=users,dc=test,dc=ru", "password") 
    File "/usr/lib/python2.7/dist-packages/ldap/ldapobject.py", line 206, in simple_bind_s 
    msgid = self.simple_bind(who,cred,serverctrls,clientctrls) 
    File "/usr/lib/python2.7/dist-packages/ldap/ldapobject.py", line 200, in simple_bind 
    return self._ldap_call(self._l.simple_bind,who,cred,EncodeControlTuples(serverctrls),EncodeControlTuples(clientctrls)) 
    File "/usr/lib/python2.7/dist-packages/ldap/ldapobject.py", line 96, in _ldap_call 
    result = func(*args,**kwargs) 
ldap.SERVER_DOWN: {'info': 'A TLS packet with unexpected length was received.', 'desc': "Can't contact LDAP server"} 

स्क्रिप्ट कोड

import ldap 
host = 'ldaps://ldap:636' 
l = ldap.initialize(host) 
l.set_option(ldap.OPT_X_TLS_DEMAND, True) 
l.set_option(ldap.OPT_DEBUG_LEVEL, 255) 
username = 'someUser' 
new_pass = 'ne$wP4assw0rd3!' 
new_password = ('"%s"' % new_pass).encode("utf-16-le") 
l.simple_bind_s("cn=admin,ou=users,dc=test,dc=ru", "password") 
mod_attrs = [(ldap.MOD_REPLACE, 'unicodePwd', new_password)],[(ldap.MOD_REPLACE, 'unicodePwd', new_password)] 
l.modify_s('CN=%s,dc=users,dc=test,dc=ru' % username, mod_attrs) 
l.unbind_s() 
print "Successfully changed password." 

संभावना है किसी को पहले से ही एक ऐसी ही समस्या हल हो गई है। हां, स्क्रिप्ट Centos पर चल रही है और संभव नहीं py32win का उपयोग करें।

अग्रिम धन्यवाद।

उत्तर

28

इस तरह अध्ययन करने के बाद, मैं इस सवाल का जवाब में अपने स्वयं के

ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) 
l = ldap.initialize("ldaps://ldap:636") 
l.set_option(ldap.OPT_REFERRALS, 0) 
l.set_option(ldap.OPT_PROTOCOL_VERSION, 3) 
l.set_option(ldap.OPT_X_TLS,ldap.OPT_X_TLS_DEMAND) 
l.set_option(ldap.OPT_X_TLS_DEMAND, True) 
l.set_option(ldap.OPT_DEBUG_LEVEL, 255) 
l.simple_bind_s("[email protected]","password") 
+2

पहली पंक्ति पर एक समाधान पाया है कि यह मेरे लिए किया था। मुझे नहीं पता कि दूसरों के लिए बाकी कितना जरूरी है। ऐसा लगता है कि ** ** टीएलएस को असंगत करना आवश्यक है ताकि आप वास्तव में एसएसएल का उपयोग कर सकें। (यदि वह वही है जो आप चाहते थे) – SpiRail

+0

हाय मैंने आपके उत्तर के साथ प्रयास किया लेकिन कोई भाग्य नहीं। मैंने अपना प्रश्न पोस्ट किया है http://stackoverflow.com/questions/38603236/update-active-directory-password-using-ldap-python अगर आप मदद कर सकते हैं –