РЕШЕНО: Выяснилось, что проблема связана с забытым наследием. 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
.openssl s_client -connect ldap.example.com:636 -showcerts
возвращает следующее:
CONNECTED(00000003)
depth=3 CN = ExampleRootCa, O = Example, C = FR
verify error:num=19:self signed certificate in certificate chain
verify return:0
---
Certificate chain
0 s:/CN=ldap.example.com/O=Example/C=FR
i:/CN=ExampleSrvCa/O=Example/C=FR
-----BEGIN CERTIFICATE-----
MIIGcDCCBF
...
iyrFEYDcs=
-----END CERTIFICATE-----
1 s:/CN=ExampleSrvCa/O=Example/C=FR
i:/CN=ExampleMainCa/O=Example/C=FR
-----BEGIN CERTIFICATE-----
MIIF2DCCA8
...
GrskgqnaEg
-----END CERTIFICATE-----
2 s:/CN=ExampleMainCa/O=Example/C=FR
i:/CN=ExampleRootCa/O=Example/C=FR
-----BEGIN CERTIFICATE-----
MIIF1TCCA7
...
RozDAcZnph
-----END CERTIFICATE-----
3 s:/CN=ExampleRootCa/O=Example/C=FR
i:/CN=ExampleRootCa/O=Example/C=FR
-----BEGIN CERTIFICATE-----
MIIFWzCCA0
...
RY5xwHgA==
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=ldap.example.com/O=Example/C=FR
issuer=/CN=ExampleSrvCa/O=Example/C=FR
---
No client certificate CA names sent
---
SSL handshake has read 6410 bytes and written 934 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA256
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : AES256-SHA256
Session-ID: ABC...
Session-ID-ctx:
Master-Key: DEF...
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1391654253
Timeout : 300 (sec)
Verify return code: 19 (self signed certificate in certificate chain)
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt CN=ldap.example.com_O=Example_C=FR.crt
говорит, что сертификат в порядкеЧто ж, сначала давайте подтвердим, что на самом деле проблема заключается в доверии сертификатов. Это работает с 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