2011-10-10 24 views
11

Ngày tốt lành.Python + LDAP + SSL

Trước để xin lỗi vì tiếng Anh của tôi, các diễn đàn và tài nguyên quốc gia của tôi không giúp ích gì.

Có nhu cầu trong tập lệnh thay đổi (hoặc tạo) mật khẩu người dùng trong AD.

Sau khi nghiên cứu vấn đề này, nó trở nên rõ ràng rằng

  1. Password để gán hoặc thay đổi duy nhất có thể thiết lập một kết nối được mã hóa với máy chủ
  2. Gửi mật khẩu chỉ cần thiết trong bảng mã utf-16-le

Nói chung không có vấn đề với thứ hai, nhưng lần đầu tiên có một vấn đề với

$ 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"} 
đang

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

Rất có thể ai đó đã giải quyết một vấn đề tương tự. Có, kịch bản đang chạy trên Centos và sử dụng py32win không thể.

Xin cảm ơn trước.

Trả lời

28

Sau khi nghiên cứu như thế này, tôi tìm thấy một giải pháp riêng

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

Dòng đầu tiên của họ trong câu trả lời này là một trong đó đã làm nó cho tôi. Tôi không biết phần còn lại cần thiết cho những người khác. Nó có vẻ như thế này là cần thiết để ** disalble ** TLS để bạn thực sự sẽ sử dụng SSL. (Nếu đó là những gì bạn muốn) – SpiRail

+0

Xin chào tôi đã thử với câu trả lời của bạn nhưng không có may mắn. Tôi đã đăng câu hỏi của mình http://stackoverflow.com/questions/38603236/update-active-directory-password-using-ldap-python nếu bạn có thể trợ giúp –