Problemas de confiança do certificado openDSAP do CentOS

12
# LDAPTLS_CACERTDIR=/etc/ssl/certs/ ldapwhoami -x -ZZ -H ldaps://ldap.domain.tld
ldap_start_tls: Can't contact LDAP server (-1)
      additional info: TLS error -8172:Peer's certificate issuer has been marked as not trusted by the user.

# openssl s_client -connect ldap.domain.tld:636 -CApath /etc/ssl/certs
<... successful tls negotiation stuff ...>
    Compression: 1 (zlib compression)
    Start Time: 1349994779
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

openssl parece achar que o certificado é bom, mas as bibliotecas de openldap ( pam_ldap exibe comportamento semelhante, que é como eu cheguei nessa bagunça) discordam.
O que estou fazendo errado?

    
por 84104 12.10.2012 / 00:51

5 respostas

17

O RHEL não fornece de fato nada que possa ser usado como um 'diretório de certificado' para fins de confiança da CA. Para o OpenSSL, um diretório de certificado - um 'CApath' - é um diretório contendo arquivos de certificado individuais (no formato PEM ou no formato 'certificado confiável' estendido do OpenSSL), com nomes em um formato específico baseado em um hash do nome do sujeito do certificado. Geralmente isso é obtido colocando arquivos com nomes legíveis por humanos e .pem extensions em um diretório e executando c_rehash (consulte man c_rehash ). Para o GnuTLS desde 3.3.6 (antes que o GnuTLS não tivesse suporte a diretório), é apenas um diretório com arquivos PEM nele; O GnuTLS irá tentar carregar todos os arquivos no diretório e ter sucesso em qualquer coisa PEM-ish (ele não pode lidar com o formato 'certificado confiável' do OpenSSL). Eu não tenho certeza se o NSS pode realmente usar um diretório cheio de arquivos de certificados individuais como uma raiz confiável de alguma forma, mas a documentação do OpenLDAP parece sugerir que pode (mas se o diretório também contiver um banco de dados NSS, ele dará essa prioridade). Independentemente disso, o RHEL não tem nada como um diretório cheio de arquivos de certificado de CA individuais.

Debian e derivados fornecem /etc/ssl/certs neste formato; /etc/ssl/certs é a localização do repositório de confiança canônico no Debian, e qualquer coisa que a IMO forneça deve basicamente ser descrita como a do Debian, já que o Debian tinha esse diretório apresentado mais ou menos da mesma forma desde 1999. O RHEL tem um /etc/ssl/certs diretório, mas não está neste formato - ele não contém nenhum arquivo de certificado individual. Você não pode usá-lo como um caminho de caminho. Honestamente, no RHEL (e no Fedora e derivados) esse diretório é basicamente uma armadilha. Não use isso. (Veja link e link para alguma informação sobre o porquê existe em primeiro lugar, e como eu estou tentando consertá-lo). Então eu acho que você está certo sobre o que está acontecendo, mas errado sobre o motivo. O OpenLDAP não está fazendo nada errado, e não está falhando porque "o ca-bundle.trust.crt ... é um banco de dados de certificados / chaves NSS do Mozilla" (esses são chamados cert8/9.db e key3/4.db , e o sistema inteiro no RHEL ao vivo em /etc/pki/nssdb ), ele está falhando porque /etc/ssl/certs não é utilizável como um 'diretório de certificados'.

O RHEL também não fornece nada que possa ser usado como um armazenamento confiável no estilo CApath em nenhum outro lugar. O armazenamento confiável do sistema do RHEL é fornecido como um único arquivo de pacote configurável PEM (um 'CAfile' em termos OpenSSL), que pode ser encontrado em /etc/pki/tls/certs/ca-bundle.crt e /etc/pki/tls/cert.pem . Ele também pode ser encontrado em /etc/ssl/certs/ca-bundle.crt as /etc/ssl/certs é na verdade apenas um link simbólico para /etc/pki/tls/certs , mas esse local não é canônico e realmente não deve ser usado por nada nunca. O RHEL também fornece um pacote no formato 'certificado confiável' do OpenSSL como /etc/pki/tls/certs/ca-bundle.trust.crt .

A coisa correta a fazer, como você descobriu, é usar o arquivo de pacote que o sistema fornece. Sua resposta funcionará, mas pelas razões mencionadas acima, recomendo vivamente TLS_CACERT=/etc/pki/tls/certs/ca-bundle.crt ou TLS_CACERT=/etc/pki/tls/cert.pem over TLS_CACERT=/etc/ssl/certs/ca-bundle.crt .

(Não há nada remotamente novo em nada disso, a propósito, mas a confusão nas interwebs é generalizada. A RH e os derivados nunca forneceram um diretório repleto de certificados. Eles forneceram um arquivo em pacote desde o ano 2000 Ele foi movido de / usr / share / ssl para / etc / pki / tls em 2005. O Debian teve tanto /etc/ssl/certs como um diretório no estilo CApath quanto /etc/ssl/certs/ca-certificates.crt como um arquivo de pacote mais ou menos desde a idade da pedra. )

    
por 15.01.2015 / 04:28
10

/etc/ssl/certs/ contém /etc/ssl/certs/ca-bundle.trust.crt como parte de ca-certificates-2010.63-3.el6_1.5.noarch , que é um banco de dados de certificados / chaves do Mozilla NSS. A inclusão deste arquivo em TLS_CACERTDIR faz com que todos os outros arquivos sejam ignorados.

TLS_CACERTDIR
Specifies the path of a directory that contains Certificate Authority certificates in separate individual files. The TLS_CACERT is always used before TLS_CACERTDIR.' This parameter is ignored with GnuTLS.

When using Mozilla NSS, may contain a Mozilla NSS cert/key database. If contains a Mozilla NSS cert/key database and CA cert files, OpenLDAP will use the cert/key database and will ignore the CA cert files.'

No entanto, openldap-2.4.23-26.el6_3.2.i686 não parece lidar com isso corretamente.

Resposta curta
Use LDAPTLS_CACERT=/etc/ssl/certs/ca-bundle.crt
(arquivo de configuração TLS_CACERT=/etc/ssl/certs/ca-bundle.crt )
Este arquivo também está incluído fornecido por ca-certificates-2010.63-3.el6_1.5.noarch .

    
por 15.10.2012 / 18:15
1

Alguém mais se depara com isso; isto é o que funcionou para mim em centos 6 openldap e sssd:

notas: uma. Algum "cara inteligente" decidiu fazer sssd exigir TLS / SSL; mudança de comportamento de centos5; isso é ótimo para sistemas externos; mas quando você tem 300 nós no dispositivo interno com uma rede interna inacessível ao cluster da máquina; este é um recurso de segurança extremamente inútil.

b. Além disso, os certificados auto-alados parecem não funcionar mais; continuará tentando

c. Evite NSLCD a todo custo; foi atormentado com problemas non-stop quando eu definir o sinalizador legado e usado em vez de sssd (netgroups, syslog deadlocking, etc.).

Para começar a usar o sssd;

  1. sssd.conf

    [domain/default]
    ldap_id_use_start_tls = True
    id_provider = ldap
    auth_provider = ldap
    chpass_provider = ldap
    cache_credentials = True
    ldap_search_base = dc=local
    enumerate = True
    ldap_uri = ldap://192.168.1.2/
    ldap_tls_cacertdir = /etc/openldap/cacerts
    ldap_tls_reqcert = allow
    ldap_schema = rfc2307bis
    
  2. slapd.conf

    TLSCACertificateFile   /etc/openldap/cacerts/ca-bundle.crt
    TLSCertificateFile      /etc/openldap/cacerts/slapd.pem
    TLSCertificateKeyFile   /etc/openldap/cacerts/slapd.pem
    TLSCipherSuite HIGH:MEDIUM:-SSLv2
    
  3. ldap.conf

    URI ldap://192.168.1.2/
    BASE dc=local
    
    TLS_CACERTDIR /etc/openldap/cacerts
    
por 16.09.2015 / 19:31
0

Este é um problema muito comum, não se preocupe, eu tenho uma resposta para você.

Os primeiros clones do RHEL têm dois arquivos ldap.conf , /etc/ldap.conf ou no RHEL6 está obsoleto, mas você pode usar /etc/nslcd.conf para autenticação agora /etc/openldap/ldap.conf é somente para consultas , então ldapsearch , ldapmodify , ldapremove , é realmente o seu perfil, então você não precisa ter uma longa string desagradável toda vez que quiser executar um comando ldap.

Agora com isso fora do caminho, você tem dois parâmetros,

  • tls_cacertfile - defina explicitamente o ca cert e você deve estar pronto para ir
  • tls_cacertdir - insira o ca cert no diretório, mas ele não funcionará, porque ele precisa ser dividido em hash ...

use openssl x509 -hash -noout -in $file , ln -s $file $file.0 , então seu certificado de autoridade de certificação funcionará.

Também note se o arquivo de configuração estiver no CAPS, você está trabalhando em /etc/openldap/ldap.conf, eles são arquivos muito diferentes.

Espero que isso resolva as coisas.

    
por 14.10.2012 / 09:21
-1

De acordo com a página "every man" que vi (mas não sou usuário do CentOS), não existe LDAPTLS_CACERTDIR . A variável correta a ser definida é TLS_CACERTDIR . Você deve defini-lo permanentemente em /etc/openldap/ldap.conf ou sempre que o CentOS mantiver o arquivo de configuração da biblioteca LDAP. Além disso, você pode precisar configurar o próprio pam-ldap para procurar os certificados de CA. No CentOS isso é /etc/pam_ldap.conf , eu acho, e a variável a ser definida é tls_cacertdir .

    
por 12.10.2012 / 01:36