Назад | Перейти на главную страницу

Аутентификация Apache на основе LDAP (mod_ldap + mod_authnz_ldap) с использованием собственного CA для SSL / TLS

РЕШЕНО: Выяснилось, что проблема связана с забытым наследием. LDAPTrustedGlobalCert директивы в различных файлах конфигурации, используя старый сертификат для того же полного доменного имени

tl; dr: Мы используем самоподписанный ЦС, и нам никогда не приходилось использовать директивы, отключающие проверку сертификатов: как заставить Apache доверять нашему самозаверяющему ЦС для mod_ldap?

Я пытаюсь настроить свой веб-сервер Apache для HTTP-аутентификации, используя каталог LDAP в качестве базы пользователей.

Все работает нормально в незашифрованном режиме, но не работает с кодом ошибки HTTP 500 с SSL или STARTTLS.

Вот моя конфигурация Apache:

AuthType Basic
AuthName "WebServer"
AuthBasicProvider ldap
AuthzLDAPAuthoritative on

# Plain:
AuthLDAPURL "ldap://ldap.example.com/dc=example,dc=local?uid?sub?(objectClass=person)"

# SSL:
LDAPTrustedGlobalCert CA_BASE64 /etc/ssl/certs/ca-certificates.crt
AuthLDAPURL "ldaps://ldap.example.com:636/dc=example,dc=local?uid?sub?(objectClass=person)" SSL

# StartTLS
LDAPTrustedGlobalCert CA_BASE64 /etc/ssl/certs/ca-certificates.crt
LDAPTrustedMode TLS
AuthLDAPURL "ldap://ldap.example.com/dc=example,dc=local?uid?sub?(objectClass=person)"

AuthLDAPBindDN "cn=webserver.example.com,ou=Apps,dc=example,dc=local"
AuthLDAPBindPassword "secret"

/etc/ssl/certs/ca-certificates.crt представляет собой объединение нескольких сертификатов CA (сгенерированных CA-сертификаты Пакет Debian). Я пробовал указывать LDAPTrustedGlobalCert либо для rootCA, либо для дочернего CA, подписавшего сертификаты ldap.example.com: та же проблема.

журнал ошибок говорит:

# TLS:
auth_ldap authenticate: user john-doe authentication failed; URI / [LDAP: ldap_start_tls_s() failed][Connect error]

# SSL:
auth_ldap authenticate: user john-doe authentication failed; URI / [LDAP: ldap_simple_bind_s() failed][Can't contact LDAP server]

Мы используем PKI с самоуправляемым корневым ЦС (самозаверяющим) и несколькими подчиненными ЦС, которые подписывают сертификаты для веб-серверов и серверов LDAP. Добавив файл PEM суб-CA на наши серверы и настроив CA-сертификаты Пакет Debian и ldap.conf (для TLS_CACERT), к LDAP можно успешно получить доступ через простой незашифрованный (порт 389), StartTLS (порт 389) и SSL (порт 636) для Linux PAM (libnss-ldapd Пакет Debian) и программное обеспечение браузера LDAP.

Как я могу сказать Apache, чтобы он проверял полученные сертификаты и доверял моему rootCA?

Редактировать ответы @ shane-madden ideas

Что ж, сначала давайте подтвердим, что на самом деле проблема заключается в доверии сертификатов. Это работает с LDAPVerifyServerCert Off?

Также давайте подтвердим, что служба LDAP использует сертификат, который будет работать; подключиться к нему:

openssl s_client -connect ldap.example.com:636 -showcerts

Если он просто отправляет свой сертификат хоста, а не промежуточные или корневые сертификаты, которые его подписали, вам нужно явно доверять промежуточному сертификату с помощью Apache.

Возьмите сертификат хоста, который был выведен во время этого s_client подключения и запишите его в файл, затем проверьте правильность подписи:

openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt received-cert.crt