Eu tenho um servidor LDAP (controlador de domínio do Active Directory) com um certificado assinado por uma CA intermediária interna e, obviamente, assinado por uma CA raiz interna. Sinto que estou negligenciando algo fundamental sobre PKI aqui porque pensei que precisava dos arquivos CA intermediários e CA raiz no lado do cliente para estabelecer confiança com o certificado que o servidor LDAP apresenta, então não entendo por que ambos os comandos foram bem-sucedidos. Eles são idênticos, exceto que o primeiro confia na CA raiz e na CA intermediária, enquanto o segundo confia SOMENTE no certificado raiz. Eu esperava que o primeiro comando funcionasse, mas não o segundo. (Verifiquei novamente se a saída é idêntica mesmo quando não estou em uso grep
e se o conteúdo dos arquivos .crt está correto.)
O que estou entendendo mal?
export LDAPTLS_CACERT=./chained.crt; ldapsearch -x -W -h ldap.example.com -p 389 -ZZ -D "[email protected]" -b "OU=users,OU=example,DC=com" "(cn=testuser)" | grep result
Enter LDAP Password:
result: 0 Success
export LDAPTLS_CACERT=./root_cert_only.crt; ldapsearch -x -W -h ldap.example.com -p 389 -ZZ -D "[email protected]" -b "OU=users,OU=example,DC=com" "(cn=testuser)" | grep result
Enter LDAP Password:
result: 0 Success
# and just for fun, let's try it without trusting any CAs. it fails as expected.
export LDAPTLS_CACERT=''; ldapsearch -x -W -h ldap.example.com -p 389 -ZZ -D "[email protected]" -b "OU=users,OU=example,DC=com" "(cn=testuser)"
ldap_start_tls: Connect error (-11)
additional info: TLS error -8179:Peer's Certificate issuer is not recognized.
Observação: aprendi da maneira mais difícil que ldapsearch
no macOS não há suporte para certificados confiáveis por meio de um caminho definido em uma variável de ambiente. A saída acima é do Linux ( ldapsearch
versão 2.4.40)
Responder1
O primeiro comando (com CAs raiz e subordinadas) funciona porque seu cliente confia explicitamente no certificado raiz - está no armazenamento âncora confiável - e essa raiz assinou o certificado de CA subordinado, portanto, seu cliente confia implicitamente nele também.
O segundo comando funciona porque a especificação TLSestadosque servidoresdeveenvie todos os certificados necessários para validar o certificado do servidor. Portanto, o seu servidor LDAP envia seu certificado, seguido pelo certificado CA subordinado.
Efetivamente, ambos os comandos são iguais. No primeiro exemplo, o cliente recebe o certificado de CA subordinado tanto da linha de comando quanto do servidor.
Observe que o servidor não precisa enviar o certificado raiz, pois ele já deve estar instalado em seu cliente e ser confiável.