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