не удается получить доступ к серверу LDAP организации через python-ldap

Фактическое требование состоит в том, что я должен выполнить аутентификацию LDAP для внутреннего веб-приложения моей организации, которое создается на Django, но пока не может этого сделать.

Поэтому я решил проверить, смогу ли я установить соединение с помощью модуля python-ldap.

детали сервера ldap, который у меня есть:

server1 = dc3.something-software.com

server2 = dc5.something-software.com

и код python:

def main(server="ldap://dc5.something-software.com", who='', cred=""):
    try:
        l = ldap.initialize(server)
        l.simple_bind_s(who, cred)
        if l:
            print("Successfully connected")
            l.search_s("[email protected],dc=something-software,dc=com",
                       ldap.SCOPE_SUBTREE)
    except Exception as e:
        print(e)
    return True

и это дает мне следующий вывод

Successfully connected
{'msgtype': 101, 'msgid': 2, 'result': 1, 'desc': 'Operations error', 'ctrls': [], 'info': '000004DC: LdapErr: DSID-0C0907C2, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v2580'}

имеется в виду, что я на самом деле могу подключиться к своему ldap, но не могу делать ничего другого?

Я работаю над операционной системой Windows, и я попробовал ответы, предложенные для других подобных вопросов, хотя они в основном были адресованы для операционных систем * NIX.

Спасибо.


person Gautham Kolluru    schedule 01.12.2020    source источник
comment
Вы проверили подключение? Открытый текст LDAP обычно представляет собой TCP-порт 389, SSL обычно представляет собой TCP-порт 636. Существует сборка nmap для win32 (например, nmap -P0 -p389 something.dc5.example.com) или используйте telnet (например, telnet something.dc5.example. com 389), чтобы убедиться, что вы действительно можете туда попасть.   -  person LisaJ    schedule 01.12.2020
comment
он говорит, что ни telnet, ни nmap не распознаны / не установлены   -  person Gautham Kolluru    schedule 01.12.2020
comment
Тогда вам нужно установить один из них. Или, если вы хотите пойти по пути Python, используйте что-то вроде telnetlib. Если вы не можете подключиться к хосту на сетевом уровне, с точки зрения разработчика не так уж много проблем для устранения неполадок. Если порт открыт, то можно выяснить, почему приложение сообщает, что не может подключиться.   -  person LisaJ    schedule 01.12.2020
comment
socket.gaierror: [Errno 11001] getaddrinfo failed это ошибка, которую я получаю   -  person Gautham Kolluru    schedule 02.12.2020
comment
Ошибка поиска имени хоста — вы можете использовать nslookup в Windows (nslookup something.dc5.something-software.com), чтобы проверить эту ошибку. Можете попробовать использовать IP напрямую, если вы его знаете.   -  person LisaJ    schedule 02.12.2020
comment
я могу выполнить пинг по телнету, и это сработало, и поэтому я попробовал следующие части, python >>> import ldap >>> con = ldap.initialize("ldap://dc5.issi-software.com") >>> con.simple_bind_s("", "") (97, [], 1, []) , но когда я выполнил python >>>con.start_tls_s() # I've been getting the below error ldap.CONNECT_ERROR: {'result': -11, 'desc': 'Connect error', 'ctrls': [], 'info': 'error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed (unable to get local issuer certificate)'}   -  person Gautham Kolluru    schedule 02.12.2020


Ответы (1)


Основываясь на ошибке сертификата в вашем последнем комментарии выше, SSL-сертификат сервера каталогов не является доверенным. Два решения: одно — игнорировать проблемы с сертификатами, второе — установить доверие. Игнорировать ошибки сертификата легко, но менее безопасно (т.е. я могу сделать себе сертификат, который говорит, что я yourhost.example.com... и если вы не проверяете действительность сертификата, вы с радостью будете общаться с моим поддельным yourhost.example. ком). Установление доверия требует немного больше усилий и может потребовать постоянного обслуживания. Проверьте дату истечения срока действия на сервере подписи ... вам может потребоваться время от времени обновлять открытый ключ CA (некоторые организации просто делают сертификаты CA со сроком действия 100 лет, чтобы избежать этого, но некоторые обновляют свой ключ CA каждые год или пять). В любом случае вы хотите добавить строку перед началом согласования tls (con.start_tls_s).

Чтобы игнорировать ошибки сертификата, добавьте:

con.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_ALLOW)

Чтобы установить доверительные отношения с ЦС, используемым для подписи ключа сервера каталогов, вам потребуется получить открытый ключ, используемый для подписи сертификата. Иногда вы можете просто спросить людей, которые обслуживают сервер каталогов — у меня есть заархивированная копия на URL-адресе, который я отправляю людям. Но если у них его нет, есть другие способы получить сертификат. клиент OpenSSL — хороший вариант. Когда у вас есть открытый ключ, используемый для подписи сертификата сервера каталогов, используйте

con.set_option(ldap.OPT_X_TLS_CACERTFILE, '/path/to/CAFile.pem')

Выполнив одно из этих двух действий, вы сможете успешно запустить сеанс TLS.

person LisaJ    schedule 02.12.2020