Autenticação Apache baseada em LDAP (mod_ldap + mod_authnz_ldap) usando a própria CA para SSL / TLS

2

RESOLVIDO: O problema encontrado foi causado por legado LDAPTrustedGlobalCert de diretivas herdadas em vários arquivos de configuração, usando o certificado antigo para o mesmo FQDN

tl: dr: Usamos uma CA autoassinada e nunca tivemos que usar diretivas que desabilitam a verificação de certificados: como fazer com que o Apache confie em nossa AC autoassinada por mod_ldap ?

Estou tentando configurar meu servidor da Web Apache para uma autenticação HTTP usando um diretório LDAP como base de usuários.

Tudo funciona bem no modo não criptografado, mas falha com um código de erro HTTP 500 com SSL ou STARTTLS.

Aqui está minha configuração do 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 é uma concatenação de vários certificados de CA (gerados pelo pacote Debian ca-certificates ). Eu tentei apontar LDAPTrustedGlobalCert para o rootCA ou para o subCA tendo assinado os certificados ldap.example.com: mesmo problema.

error.log diz:

# 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]

Estamos usando uma PKI com uma CA raiz autogerenciada (autoassinada) e várias sub-autoridades de certificação que assinam certificados para servidores web e LDAP. Adicionando o arquivo sub-CA PEM em nossos servidores e configurando o pacote Debian ca-certificates e ldap.conf (para TLS_CACERT ), o LDAP pode ser acessado com sucesso via simples não-criptografada (porta 389), StartTLS (porta 389) e SSL (porta 636) para Linux PAM (pacote Debian libnss-ldapd ) e softwares de navegador LDAP.

Como posso dizer ao Apache para verificar os certificados recebidos e confiar no meu rootCA?

Edite para respostas @ shane-madden ideas

  • Funciona se usar LDAPVerifyServerCert Off .
  • openssl s_client -connect ldap.example.com:636 -showcerts retorna o seguinte:

    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)
    
  • Executar openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt CN=ldap.example.com_O=Example_C=FR.crt diz que o certificado está OK
por CDuv 06.02.2014 / 02:42

1 resposta

4

Bem, primeiro vamos confirmar se a confiança do certificado é realmente o problema. Funciona com LDAPVerifyServerCert Off ?

Além disso, vamos confirmar que o serviço LDAP está falando com um certificado que funcionará; conecte-se a ele:

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

Se estiver apenas enviando seu certificado de host e não os certificados intermediários ou raiz que o assinaram, você precisará confiar no certificado intermediário explicitamente com o Apache.

Capture o certificado do host que foi gerado durante essa s_client connection e grave-o em um arquivo, depois verifique se a assinatura é boa:

openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt received-cert.crt
    
por 06.02.2014 / 03:52