RESOLVIDO: O problema acabou sendo causado por LDAPTrustedGlobalCert
diretivas herdadas esquecidas em vários arquivos de configuração, usando certificado antigo para o mesmo FQDN
tl; dr: Usamos uma CA autoassinada e nunca tivemos que usar diretivas que desativam a verificação de certificados: como fazer o Apache confiar em nossa CA autoassinada mod_ldap
?
Estou tentando configurar meu servidor 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 CA (gerados pelo pacote Debian ca-certificates ). Tentei apontar LDAPTrustedGlobalCert
para o rootCA ou o subCA assinando 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 auto-gerenciada (autoassinada) e várias sub-CAs 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 o ldap.conf (for TLS_CACERT
), o LDAP pode ser acessado com êxito por meio de criptografia 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?
Editar às respostas @ shane-madden ideas
- Funciona se estiver usando
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)
- A execução
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt CN=ldap.example.com_O=Example_C=FR.crt
diz que o certificado está OK
LDAPTrustedGlobalCert
diretivas em vários arquivos do VirtualHost (/etc/apache2/sites-available/
), mas fora dele<VirtualHost>
. Teses em que aponta para um antigo certificado autoassinado para o mesmo FQDN (testes herdados). Depois de limpar toda a configuração do Apache, SSL e autenticação LDAP TLS funcionou muito bem (não há necessidade de qualquerLDAPTrustedGlobalCert
lugar ...)Respostas:
Bem, primeiro vamos confirmar que a confiança do certificado é realmente o problema. Isso funciona
LDAPVerifyServerCert Off
?Além disso, vamos confirmar que o serviço LDAP está falando com um certificado que funcionará; conectar a ele:
Se estiver enviando apenas o certificado do host e não os certificados intermediários ou raiz que o assinaram, será necessário confiar explicitamente no certificado intermediário com o Apache.
Pegue o
s_client
certificado do host que foi produzido durante essa conexão e grave-o em um arquivo e verifique se a assinatura está correta:fonte
LDAPVerifyServerCert Off
.openssl s_client ... -showcerts
envie todos os certificados primeiro ao servidor LDAP, depois a CA intermediária e a CA raiz.openssl verify -CAfile
diz que o certificado do servidor LDAP (o primeiro recebido) está OK (postagem original editada para adicionar informações sobre teses).