Django LDAPS TLS начал давать сбой с ошибкой SERVER_DOWN
Сегодня мы имели удовольствие наблюдать, как LDAPS не работает в приложении Django.
Наши требования к Пип включают:
python-ldap==3.3.1
django-auth-ldap==3.0.0
Наш файл настроек Django включает:
AUTH_LDAP_SERVER_URI = "ldaps://ldaps.server.net.au:636"
AUTH_LDAP_CONNECTION_OPTIONS = {
ldap.OPT_DEBUG_LEVEL: 1,
ldap.OPT_REFERRALS: 0,
ldap.OPT_NETWORK_TIMEOUT: 5.0,
ldap.OPT_TIMEOUT: 5.0,
}
Неясная ошибка, которую мы видим:
Caught LDAPError while authenticating sighmon: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'errno': 115, 'ctrls': [], 'info': '(unknown error code)'},)
Он прекрасно работал в течение ~2 лет до сегодняшнего дня.
Мы пытались прикрепить django-auth-ldap
к различным более старым версиям, но все они потерпели неудачу одинаково.
Решением было сначала получить отладочный вывод, установив опции с помощью AUTH_LDAP_GLOBAL_OPTIONS
вместо AUTH_LDAP_CONNECTION_OPTIONS
.
Затем это дало более полезную ошибку: TLS: peer cert untrusted or revoked (0x42).
Мы подтвердили, что LDAP
без S аутентифицируется нормально, поэтому продолжили копаться в проблемах TLS.
Мы проверили подключение к серверу LDAPS с помощью: telnet ldaps.server.net.au:636
и это счастливо соединилось. Таким образом, казалось, что наш LDAPS-сервер был счастлив.
Мы проверили сертификаты с помощью: openssl s_client -showcerts -verify 5 -connect ldaps.server.net.au:636 < /dev/null
Все казалось в порядке, поэтому мы продолжили изучать варианты LDAP...
Этот вариант исправил ситуацию для нас: ldap.OPT_X_TLS_REQUIRE_CERT: ldap.OPT_X_TLS_ALLOW
Таким образом, наши полные опции оказались следующими:
AUTH_LDAP_GLOBAL_OPTIONS = {
ldap.OPT_DEBUG_LEVEL: 1,
ldap.OPT_REFERRALS: 0,
ldap.OPT_NETWORK_TIMEOUT: 5.0,
ldap.OPT_TIMEOUT: 5.0,
ldap.OPT_X_TLS_REQUIRE_CERT: ldap.OPT_X_TLS_ALLOW,
}
Смотрите открытый вопрос с этим и другими решениями: https://github.com/django-auth-ldap/django-auth-ldap/issues/198
Следующий шаг: выяснить, что не так с нашим пучком сертификатов