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

Решено: выяснилось, что проблема вызвана забытым наследием LDAPTrustedGlobalCert директивы в различных конфигурационных файлах, используя старый сертификат для того же FQDN

tl; dr: Мы используем самозаверяющий CA, и нам никогда не приходилось использовать директивы, которые отключают проверку сертификатов: как заставить Apache доверять нашему самозаверяющему CA для 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 (генерируемых пакетом Debian CA-Certificates). Я пробовал указывать LDAPTrustedGlobalCert для rootCA или subCA, подписавших сертификаты ldap.example.com: та же проблема.

error.log говорит:

# 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 sub-CA на наших серверах и настройки пакета Debian CA-Certificates и ldap.conf (для TLS_CACERT), к LDAP можно успешно получить доступ через обычное незашифрованное (порт 389), StartTLS (порт 389) и SSL (порт 636) для Linux PAM (пакет Debian libnss-ldapd) и программное обеспечение браузера LDAP.

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

Изменить на ответы @ Shane-Madden идей

  • Работает при использовании 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 говорит, что сертификат в порядке

1 ответ

Что ж, сначала давайте подтвердим, что доверие к сертификату на самом деле является проблемой. Работает ли с 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
Другие вопросы по тегам