2011-10-10 21 views
11

Buen día.Python + LDAP + SSL

Antes de disculparme por mi inglés, mis foros nacionales y recursos no ayudaron.

Hubo una necesidad en el script que cambie (o cree) una contraseña de usuario en AD.

Después de estudiar el tema, se hizo evidente que

  1. contraseña para asignar o el cambio sólo puede establecer una conexión cifrada al servidor
  2. Enviar la contraseña sólo es necesaria en la codificación UTF-16-le

En general no hay ningún problema con el segundo, pero primero tiene un problema con

$ 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"} 
código de script

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

Lo más probable es que alguien ya ha resuelto un problema similar. Sí, el script se ejecuta en Centos y no se puede usar py32win.

Gracias de antemano.

Respuesta

28

Después de estudiar este tipo, he encontrado una solución por su cuenta

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

La primera línea de esta respuesta es la que lo hizo por mí. No sé qué tan necesario es el resto para los demás. Parece que esto es necesario para ** TLS disaltable para que realmente use SSL. (Si eso es lo que quería) – SpiRail

+0

Hola, lo intenté con su respuesta, pero no tuve suerte. He publicado mi pregunta http://stackoverflow.com/questions/38603236/update-active-directory-password-using-ldap-python si puedes ayudar –