15 nov 2010 kl. 00.01 skrev Joel Carnat: > -----Message initial----- > @: Joel Carnat <j...@carnat.net>; > Cc: misc@openbsd.org; > De: Philip Guenther <guent...@gmail.com> > Envoyi: dim. 14-11-2010 02:25 > Sujet: Re: ldapd and self-signed certificate >> On Sat, Nov 13, 2010 at 12:02 PM, Joel Carnat <j...@carnat.net> wrote: >>> I want to use LDAP to store postfix, apache and dovecot users. >>> This sounds a quite simple need so I plan to use the native ldapd. >> ... >>> Then I created a self-signed certificate in /etc/ldap/ using directions > from >>> starttls(8). >>> The ldapd starts and listens to ldap and ldaps ports. >>> But when I run: # ldapmodify -x -H ldaps://ldapd.tumfatig.local -D >>> "cn=admin,dc=tumfatig,dc=local" -W -f /tmp/tumfatig >>> I get: "additional info: error:14090086:SSL >>> routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed" >>> The ldapd (in debug mode) says: "SSL library error: ssl_session_accept: >>> error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca" >>> >>> Can I use ldapd with self-signed certificate ? >>> Did I miss a step ? >> >> There are two aspects to verifying a cert: >> 1) does it have a valid signature? >> 2) is the CA that signed this trustable at all? >> >> The point of this is to know whether you can trust the contents of the >> cert so that you're protected from Man-in-the-Middle attacks. If you >> accepted any self-signed cert then anyone could generate a cert that >> claimed to be your server, then splice your TCP connection and snoop >> and modify all your data. >> >> So, you need some way to know which certs to trust; that's where #1 >> and #2 come in. #1 validates that this cert can be traced back to a >> particular CA, while #2 is where you decide whether that CA is okay. >> #1 is done automatically by the OpenSSL code; #2 is done by putting >> all the CAs you want to trust in location(s) that OpenSSL checks. >> >> For a self-signed cert, step #1 is basically trivial, while #2 is done >> by either putting a link to the cert in /etc/ssl/certs/ with a name >> that's derived from a hash of the cert's subject, or adding the cert >> itself to /etc/ssl/cert.pem. The latter is easy but you may find it >> cluttered. To do the former, do something like: >> cert_file=/absolute/path/to/the/cert.pem >> ln -s $cert_file /etc/ssl/certs/`openssl x509 -noout -in >> $cert_file -subject_hash`.0 >> >> Note that /etc/ssl/cert* are the default trust paths for practically >> all openssl-based apps, so a cert added there will be trusted for lots >> of things. If you don't like that idea then you'll need to look at >> how to set the CA paths for the apps you want to trust that cert. >> That's fairly specific to the involved app. starttls(8) describes the >> settings for sendmail, ldap.conf(5) describes it for the OpenLDAP >> libldap and clients, etc. >> >> >> Philip Guenther >> > > Thank you for this detailed explanation. > > For the moment, I just testing things in a "closed" environment. > This is why I used self-signed certificates. In a "real" environment, I > would go with certificates signed by publicly known CA. > > I did try creating /etc/ssl/certs and linking my self-signed certificates > as you describe. But that doesn't seem to work neither. > > I also took one of my certificates, signed by a publicly know CA but I > still got the same message... I checked the certificate and it contains > the path to the CA. > > But I still get the "tlsv1 alert unknown ca" error :(
As Philip pointed out, you can specify the trusted CA certificate (or the certificate itself in case of self-signed certs) as specified in ldap.conf(5), provided you are using OpenLDAP. Try this in you ~/ldaprc: TLS_CACERT /path/to/ldapd.crt -martin