mercredi 12 novembre 2008
Dernière mise à jour :samedi 19 octobre 2013
Objectif
Ce document a pour objectif de présenter une manière "simple" de mettre en oeuvre le protocole TLS/SSL pour un serveur LDAP.
TLS 1.1 = Transport Layer Security. RFC 4346, avril 2006.
✓
SSL 3.0 = Secure Sockets Layer. Netscape Corporation. 1996. Internet Draft.
✓
TLS 1.1 est souvent considéré comme étant SSL 3.0, mais ce n'est pas exactement interchangeable.
✓
Préambule
Tout comme Michel Cardie, tout a commencé un jour où nous avons, enfin, voulu mettre en œuvre une connexion sécurisée, c'est-à-dire utilisant TLS/SSL, pour service de messagerie sous «Postfix» avec une authentification LDAP et c’était l’occasion ou jamais. Ce n'est pas simple. Surtout quand on débute. Et il est vrai qu’on n’en fini pas de débuteravec cette affaire!!! N'hésitez pas à me dire si il y a une grosse erreur, ça fait toujours avancer.
Cette documentation est directement inspirée de celle de Michel Cardie. À tout seigneur, tout honneur, c’est lui donc qu’il faut remercier, surtout pour l’approche très didactique, partant de l’exemple, dont il a sut faire preuve. C’est tellement rare qu’il faut absolument l’en remercier.
Tout ce système est basé sur OpenSSL1.
Quand on croit avoir compris…
Un client LDAP (Cli) souhaite établir une connexion TLS/SSL avec un serveur LDAP (Srv). Ici, seul le serveur (Srv) doit prouver son identité. Le client (Cli) n'est donc pas contraint de fournir un certificat au serveur. Ce cas est prodigieusement intéressant car de nombreux clients simples sont incapables de fournir un quelconque certificat.
Le client (Cli) se connecte au serveur serveur (Srv).
✓
Leserveur (Srv) communique au client (Cli) un certificat (Crt).
✓
Le client (Cli) teste la validité du certificat (Crt).
✓
Une fois établie l'identité du serveur (Srv), le client (Cli) peut généralement poursuivre.
Là où ce n'est pas évident, c'est qu'il faut:
1.créer plusieurs certificats,
✓
les gérer (c'est-à-dire les placer correctement aux bons endroits avec de "bons" noms),
2.
les tester (d'abord à l'aide des outils ayant servis à les créer, puis, et c'est le plus important, avec les clients LDAP).
Lorsque le serveur (Srv) envoie généralement un certificat dit «auto-signé», c’est à dire certifié par lui-même, ce n’est pas très sûr. D’ailleurs, en général, les applications recevant un tel certificat ouvrent une fenêtre signalant le problème et demandent une confirmation d’exception2 avant de poursuivre. Ce n’est pas très «professionnel» et perturbe souvent les utilisateurs. En outre, ça invalide, dans une certaine mesure, l’utilité de cette procédure d'authentification car les utilisateurs prennent l’habitude de confirmer les exceptions sans même lire les données affichées et peuvent donc être trompés facilement.
Le moyen de ne pas se trouver dans cette situation, c’est que le serveur fournisse un certificat signé par une «autorité» déjà validée et connue. C’est en fait un autre certificat, identique à celui fourni pour l’application mais pas dédié à un usage particulier autre que celui de certifier un certificat. C’est ce qu’on appelle un «Certificat d’autorité».
Dans le cas des connexions sécurisées des serveurs privés (banques, assurances, FAI, …), ces entreprises s’appuient sur des certificats d’autorité connus et payant (Camerfirma SA, America online, AOL Time Warmer Inc., VeriSing Inc., Thawte Consulting cc, …). Outre le coût d’un tel système, se pose le problème que ce genre de certification donne à ces entreprises un pouvoir : celui d’accepter ou non de vous servir. Heureusement, le nombre d’organismes atténue ce danger, il n’en reste pas moins qu’étant très majoritairement des USA, des intérêts croisés existent. Heureusement, il existe également un projet «Open Source», donc ouvert, international et libre de contraintes tant financières que politique : le «CA Cert».
Mais, en fin de compte, certificat d’autorité ou non, il faudrait bien, à un moment ou à un autre, que vous ayez accepté au moins les certificats d’autorités. Que vous les ayez en quelque sorte, signés. C’est là que se trouve «l’entourloupe». En fait, tous vos logiciels considèrent que les certificats d’autorité privés ont bons. En fait, on considère, sans vous le demander, que vous les avez «signés». Ce qui est absolument inacceptable. Effectivement, en validant la pointe de la pyramide, on valide, de fait, tous les «fils» de ces certificats. Ça répond à une certaine logique mais comment se fait-il alors que le seul organisme véritablement libre et indépendant (CA Cert) ne le soit pas ?
Ici, nous avons choisi que créer nos propres certificats d’autorité, correspondant à notre organisme, qui servirons donc à signer tous les certificats nécessaires à nos connexions sécurisées. Il suffit de nous faire connaître, de nous faire accepter par nos utilisateurs pour qu’ils signalent à leurs logiciels que notre certificat d’autorité est valide. C’est, en fait, bien plus moral que ce que fait Verisign en payant pour avoir son certificat d’autorité inclus automatiquement à toutes les applications. Lorsque nous aurons tout bien mis en place nous nous appuierons sur le certificat d’autorité du CA Cert.
Préparation de l’organisation des certificats.
On utilise OpenSSL. C’est en ligne de commande, ça a plein d’options tellement ça fait de chose. Objectivement, on lit la documentation uniquement quand on en a absolument besoin. On se fait sa tambouille en fonction de ce dont on a besoin. On retient bien plus l’endroit où on a noté certaines options et la syntaxe lors d’un usage que de mémoriser la chose. En un mot, cette documentation, c’est aussi ma tambouille personnelle.
On va créer ici trois certificats. On aurait pu en faire seulement deux, c'est certain, mais c’est histoire de bien montrer comment ça marche.
En fait, il faut voir cette histoire de certificats comme un arbre. La feuille est la seule à avoir une fonction déterminée : la respiration. C’est la dernière extrémité, tous les autres objets sont rattachés à un autre objet mais servent également d’attache pour un suivant. En gros, si on oublie les racines, le «certificat d’autorité racine», c’est le tronc. Les branches, ce sont des «certificats d’autorité spécialisés» pour un groupe. Le «certificat» final, il correspond à une et une seule entité, c’est la feuille. On peut parfaitement imaginer n’avoir qu’un tronc («certificat d’autorité racine») pour une multitudes de feuilles («certificats» simples).
3.
Les certificats
Le premier certificat correspondra au certificat d'une autorité racine de certification (root CA). Il en faut une obligatoirement. Son certificat sera donc nécessairement auto-signé. Le nom du fichier contenant le certificat sera ici, classiquement, ca.pem.
Le deuxième certificat correspondra à une autre autorité de certification (cette autorité sera par exemple l'autorité chargée de valider les certificats de serveurs LDAP); toutefois, cette autorité (ldap CA) ne sera pas racine. Son certificat sera donc signé par l'autorité racine root CA. Le nom du fichier contenant le certificat sera ldapca.pem.
Un troisième certificat identifiera le serveur LDAP; nous appellerons ce certificat mesange.pem. Il sera signé par l'autorité ldap CA.
L'organisation
Ensuite, il va falloir organiser les différents certificats de façon à ce que les clients et serveurs puissent les trouver et les tester. On utilise l'organisation proposée dans le fichier de configuration de openssl. Autrement dit, dans le fichier openssl.conf.
La variable d'environnement OPENSSL_CNF permet de spécifier quel fichier de configuration utiliser. Ceci peut être particulièrement utile dans le cas de l'existence de multiples versions de ce type de fichier.
On a donc l'organisation suivante:
$dir = le répertoire de base (ex: /usr/local/ssl ou /usr/share/ssl)
✓
$dir/certs = le répertoire où sont conservés les certificats (plus exactement, des noms de la forme hash.0)
✓
$dir/crl = le répertoire où sont conservées les listes de révocation.
✓
$dir/newcerts = le répertoire où sont stockés les certificats nouvellement créés.
✓
$dir/private = le répertoire où sont stockées les clés privées
✓
$dir/index.txt = le fichier d'index de la base de données
✓
$dir/serial = le fichier qui contient le prochain numéro de série pour tout nouveau certificat qui sera créé.
Le certificat racine est placé directement dans $dir.
La clé privée du certificat racine est dans $dir/private.
✓
Ensuite va se poser le problème suivant: pour tester la validité d'un certificat, il faut tester la validité de la chaîne complète des certificats jusqu'au certificat racine. Ce qui signifie par exemple qu'un client qui voudra valider le certificat du serveur devra avoir accès aux certificats ldapca.pem et ca.pem.
Il faut donc posséder localement les certificats permettant de tester la chaîne de certificats.
Fichiers de configuration
Bien qu'il soit théoriquement possible de créer et gérer des certificats en utilisant le fichier de configuration principal de openssl (soit, openssl.cnf), il peut être beaucoup plus judicieux d'utiliser divers fichiers de configuration pour les différents cas de figures que l'on va rencontrer. Voici une liste de différents fichiers de configuration. Je ne les ai pas inventés; je les ai simplement extraits du livre «LDAP system administration, Gerald Carter, O'Reilly®».
root-ca-cert.cnf pour la requête et l'auto-signature du certificat racine Root CA
✓
req-subca-cert.cnf pour générer la requête du certificat LDAP CA
✓
req-server-cert.cnf pour une requête de certificat concernant un serveur
✓
req-user-cert.cnf pour une requête de certificat concernant un client
✓
ca-subca-cert.cnf pour signer le certificat LDAP CA par le certificat racine Root CA
✓
ca-server.cert.cnf pour signer le certificat serveur par le certificat LDAP CA
✓
ca-user-cert.cnf pour signer le certificat client par le certificat racine Root CA
✓
Création des fichiers et répertoires initiaux
Il convient, si ce n'est déjà fait, de créer les répertoires fondamentaux: $dir, $dir/certs, $dir/private et $dir/newcerts.
Puis, lors de la toute première création de certificats, il faut initialiser le fichiers index.txt et serial. Pour cela il suffit de taper les commandes suivantes:
# touch index.txt
ce qui créera un fichier index.txt vide, et
# echo 01 > serial
qui créera un fichier serial avec 1 comme valeur initiale de numéro de certificat.
Création des «certificats d’autorité».
Création du certificat de l'autorité de certification root CA
Le paramètre x509 de la requête ci-dessous permet d'avoir un certificat auto-signé:
root@machine:/racine# openssl req -x509 -config root-ca-cert.cnf -newkey rsa:4096 -out ca.pem -keyout private/ca.key -days 1826
Generating a 4096 bit RSA private key
...............................................................................++
..........................++
writing new private key to 'private/ca.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase: passe-rootCA
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Pays [FR]:
Etat, province ou departement [Herault]:
Ville [Montpellier]:
Organisation [Maison de la Teledetection]:
Unite organisationnelle [TETIS]:
Nom commun [MTD Root CA]:
Adresse mail []:mail_admin@mondomaine.net
Le certificat est créé pour une durée de 5 ans (soit 1826 jours). N'oubliez pas de spécifier une durée de validité pour ce certificat en particulier. Sinon, on obtiendrait une durée de validité de 0 seconde. Ce qui est assez peu. Ce dernier point permet de tester involontairement le comportement de certains outils lorsqu'ils recevaient un certificat périmé (ou bien dont une autorité de certification était périmée).
La requête demande une phrase de passe (exemple de phrase: the lion sleeps tonight) pour la clé privée, et un DN pour l'identification du certificat. Ici, on prend, pour l’exemple «passe-rootCA».
Le DN choisi est par exemple: cn=MTDrootCA, ou=TETIS, o=Maison de la Teledetection, l=Montpellier, st=Herault, c=FR
Vous pouvez vérifier le contenu de votre certificat en le lisant: lire un certificat.
Création d'un fichier hash.0
Il est important ensuite de créer un fichier (symbolique) dont le nom est de la forme hash.0, dans laquelle hash est la valeur de hachage du DN.
Pour obtenir la valeur de hachage du fichier ca.pem par exemple, il suffit de taper la commande suivante:
root@machine:/racine# openssl x509 -hash -in ca.pem -noout
156152a2
Le fichier hash.0 est à placer dans le répertoire certs et doit pointer vers le vrai fichier ca.pem. Exemple:
root@machine:/racine# cd certs
root@machine:/racine/certs# ln -s ../ca.pem 156152a2.0
Ou bien, si on veut se la jouer:
root@machine:/racine# cd certs
root@machine:/racine/certs# ln -s ../ca.pem `openssl x509 -hash -in ../ca.pem -noout`.0
Si ceci n'était pas fait, il serait difficile de vérifier une chaîne de certificats.
Création d'un certificat pour l'autorité ldap CA
Tout d'abord, on crée un certificat temporaire et une clé privée normale:
root@machine:/racine# openssl req -config req-subca-cert.cnf -newkey rsa:4096 -out templdapcacert.pem -keyout private/ldapca.key
Generating a 4096 bit RSA private key
..........................................................................................................................................................................++
..............................................................................................++
writing new private key to 'private/ldapca.key'
Enter PEM pass phrase: passe-ldapCA
Verifying - Enter PEM pass phrase: passe-ldapCA
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Pays [FR]:
Etat, province ou departement [Herault]:
Ville [Montpellier]:
Organisation [Maison de la Teledetection]:
Unite organisationnelle [TETIS]:
Nom commun [MTD LDAP CA]:
Adresse mail []: mail_admin@mondomaine.net
Il faut également une phrase de passe et un DN spécifique à ce certificat. Ici, pour l’exemple, on prend «passe-ldapCA».
Le DN est: cn=MTDLDAPCA, ou=TETIS, o=Maison de la Teledetection, l=Montpellier, st=Herault, c=FR
Signature du certificat de ldap CA par l'autorité racine root CA
A ce moment le certificat signé n'est plus temporaire et il est donc automatiquement placé (grâce à la commande ci-dessous) dans le répertoire certs sous le nom serial.pem dans lequel serial est la valeur contenue dans le fichier serial (par exemple, le fichier créé sera 01.pem):
root@machine:/racine# openssl ca -config ca-subca-cert.cnf -cert ca.pem -in templdapcacert.pem -notext -out certs/ldapca.pem
Using configuration from ca-subca-cert.cnf
Enter pass phrase for /data-mail/srv-ldap/etc/ssl/teledetection/private/ca.key: passe-rootCA
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'FR'
stateOrProvinceName :PRINTABLE:'Herault'
localityName :PRINTABLE:'Montpellier'
organizationName :PRINTABLE:'Maison de la Teledetection'
organizationalUnitName:PRINTABLE:'TETIS'
commonName :PRINTABLE:'MTD LDAP CA'
emailAddress :IA5STRING:'mail_admin@mondomaine.net'
Certificate is to be certified until Oct 30 13:15:25 2020 GMT (4383 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n] y
Write out database with 1 new entries
Data Base Updated
Cette commande affiche un résumé du certificat, confirmez si cela est correct. Il faut, bien sûr, donner le mot de passe du certificat d’autorité racine pour signer ce sous-certificat d’autorité.
La commande ci-dessus crée également un fichier ldapca.pem dans le répertoire certs. Pourquoi? Eh bien, si le fichier 01.pem est peut-être gentiment créé par openssl, son nom n'est pas très parlant à l'esprit. Il vaut mieux que le nom du fichier soit représentatif du certificat qu'il contient. Cela aide. Plus tard.
L'argument notext permet de ne pas ajouter la description textuelle du certificat dans le fichier final.
Il est important de rajouter les extensions de type ca si l'on veut que le certificat soit celui d'un CA; voir le fichier de configuration utilisé (ca-subca-cert.cnf)
L’option “-cert ca.pem” est obligatoire lorsque les certificats ne sont pas dans le répertoire normal décrit dans le fichier “openssl.cnf”.
La requête demande la phrase de passe du certificat de root CA. Puis, la base de données des certificats sera mise à jour (modification des fichiers serial et index.txt)
Le fichier templdapcacert.pem peut alors être détruit.
Même chose pour le fichier symbolique de la forme hash.0 que dans le cas du certificat ca.pem. Par exemple:
root@machine:/racine# cd certs
root@machine:/racine/certs# ln -s ldapca.pem c9ce0d54.0
ou bien:
root@machine:/racine# cd certs
root@machine:/racine/certs# ln -s ldapca.pem `openssl x509 -hash -inldapca.pem -noout`.0
Création du «certificats» du serveur ldap.
Création d'une requête de certificat pour le serveur
Le serveur LDAP tournera sur la machine nommée «srv-ldap». La clé privée du futur certificat sera appelée srv-ldap.key. C’est le même mécanisme que pour les certificats d’autorité. La commande à saisir est de la forme suivante:
root@machine:/racine# openssl req -config req-server-cert.cnf -out tempservercert.pem -keyout private/srv-ldap.key -newkey rsa:4096
Generating a 4096 bit RSA private key
...................................++
......++
writing new private key to 'private/srv-ldap.key'
Enter PEM pass phrase: passe-srv-ldap
Verifying - Enter PEM pass phrase: passe-srv-ldap
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Pays [FR]:
Etat, province ou departement [Herault]:
Ville [Montpellier]:
Organisation [Maison de la Teledetection]:
Unite organisationnelle [TETIS]:
Nom commun (ex: nom de la root CA) []: srv-ldap.domaine.net
Adresse mail []:mail_admin@mondomaine.net
Là aussi, une phrase de passe sera demandée (passe-srv-ldap).
Le DN est cn=srv-ldap.teledetection.fr, ou=TETIS, o=Maison de la Teledetection, l=Montpellier, st=Herault, c=FR
On notera que le cn n'est pas n'importe quoi, mais doit être le nom de la machine sur laquelle tournera le serveur ldap.
Signature du certificat du serveur par l'autorité de certification ldap CA
root@machine:/racine# openssl ca -config ca-server.cert.cnf -cert certs/ldapca.pem -keyfile private/ldapca.key -in tempservercert.pem -notext -out certs/srv-ldap.pem
Using configuration from ca-server.cert.cnf
Enter pass phrase for private/ldapca.key:passe-ldapCA
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'FR'
stateOrProvinceName :PRINTABLE:'Herault'
localityName :PRINTABLE:'Montpellier'
organizationName :PRINTABLE:'Maison de la Teledetection'
organizationalUnitName:PRINTABLE:'TETIS'
commonName :PRINTABLE:'srv-ldap.teledetection.fr'
emailAddress :IA5STRING:'mail_admin@mondomaine.net'
Certificate is to be certified until Oct 30 13:27:10 2010 GMT (730 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n] y
Write out database with 1 new entries
Data Base Updated
On notera ici qu'il faut préciser quelle CA doit servir à signer le certificat. D'où la présence des deux arguments supplémentaire -cert et -keyfile. La signature exigera de donner la phrase de passe du certificat LDAP CA.
Ne pas oublier de créer un fichier hash.0 selon la méthode habituelle.
root@machine:/racine# cd certs
root@machine:/racine/certs# ln -s srv-ldap.pem `openssl x509 -hash -in srv-ldap.pem -noout`.0
Suppression de la phrase de passe du certificat serveur
Il peut être souhaitable de retirer la phrase de passe de la clé privée du certificat serveur. Par exemple, supposons que nous souhaitions supprimer la phrase de passe de la clé privée stockée dans le fichier «srv-ldap-free.key». Pour ce faire, nous tapons la commande suivante:
root@machine:/racine# openssl rsa -in private/srv-ldap.key -out private/srv-ldap-free.key
Enter pass phrase for private/srv-ldap.key:passe-srv-ldap
writing RSA key
La commande nous demande de saisir la phrase de passe initiale, et génère un nouveau fichier (srv-ldap-free.key) contenant la clé privée, mais cette fois-ci sans phrase de passe.
AND SO ON.....
(imap, ssl, egroupware, webmail, courriel, listes, intranet, servicewebpayant, …)
Lecture d'un certificat
Pour afficher simplement au format texte un certificat contenu dans un fichier certificat.pem, il suffit de taper la commande:
# openssl x509 -text -noout -incertificat.pem
dans laquelle:
-text permet l'affichage complet du certificat au format texte
✓
-noout évite l'affichage du format binaire du certificat,
✓
-in permet de spécifier le nom du fichier contenant le certificat.
✓
Phrase de passe (Passphrase): qu'est-ce que c'est?
Un simple mot de passe n'étant plus forcément suffisant pour assurer la sécurité d'un système (et dans notre cas d'un certificat), on demande à l'utilisateur de donner une phrase entière pour assurer une meilleure authentification.
Exemples de phrases:
homo homini lupus
✓
mignonne allons voir si la rose
✓
Ho combien de capitaines, combien de marins
Il est tout à fait envisageable d'avoir une phrase de passe limitée à un seul mot. C'est vrai que cela ressemble à un mot de passe. Mais techniquement c'est différent, ne l'oublions pas!
Si vous voulez supprimer une phrase de passe, allez lire «Suppression d’un certificat».
Test des certificats
✓
# openssl verify certs/mesange.pem
ou bien :
# openssl verify -CApathcerts certs/mesange.pem
permet de vérifier la chaîne de certification du certificat du serveur.
La deuxième version de la commande permet d'aider openssl à trouver où sont situés les fichiers de la forme hash.0.
Mais le mieux consiste à tester réellement les certificats.
Configuration du fichier slapd.conf
Trois clauses sont nécessaires pour un bon fonctionnement du serveur. Voici un exemple de définition. Vous devrez adapter ces définitions à votre cas dans le fichier /etc/ldap/slapd.conf.
TLSCACertificatePath/usr/share/ssl/certs
TLSCertificateFile /usr/share/ssl/certs/mesange.pem
TLSCertificateKeyFile/usr/share/ssl/private/mesange.key
La première clause permet de spécifier où sont situés les différents certificats, et en particulier les certificats des CA. Nécessaire si le serveur doit valider le certificat du client.
Les deux autres clauses (TLSCertificateFile et TLSCertificateKeyFile) permettent de spécifier le certificat du serveur et sa clé privée.
Une fois le fichier de configuration du serveur mis à jour, il convient de lancer correctement le serveur. Celui-ci doit pouvoir accepter aussi bien des demandes de connexions non sécurisées que mettant en oeuvre la couche TLS. Ceci signifie que le serveur doit généralement écouter 2 ports différents. Un port supportera les connexions normales, et l'autre les connexions de type TLS. La commande slapd permet ceci. Par exemple:
# slapd -d 5 -h "ldap://:9009/ ldaps://:9008" -f slapd.conf
Cette commande ordonne au serveur d'écouter les connexion normales sur le port 9009 et les connexions TLS sur le port 9008. Le paramètre «-d5» permet au serveur d'afficher ce qu'il fait, ce qui est très utile lors des tests.
Dans le cas d’une installation sur une Debian Etch, il faut modifier le fichier “/etc/default/slapd” avec cette option :
SLAPD_SERVICES="ldap:/// ldaps:///"
Notons que lors du démarrage du serveur, il vous sera demandé la phrase de passe du certificat serveur.
Il est également possible de tester TLS directement au dessus d'un seul port. Pour cela, il suffit de taper la commande suivante:
# slapd -d 5 -h ldap://:9009/ -f slapd.conf
Par contre, il faut que le client puisse utiliser l'extension "StartTLS".
Par exemple, avec le client ldapsearch:
# ldapsearch -Z -H ldap://machine:9009/ "(filtre)"
L'extension "StartTLS" est demandée par l'utilisation de l'argument supplémentaire «-Z».
Configuration du client ldapsearch
Le client ldapsearch doit pouvoir accéder aux certificats de CA pour être en mesure de valider le certificat du serveur.
Ceci se fait grâce à un fichier (ldaprc ou bien ldap.conf) dans lequel 2 clauses sont importantes:
TLS_CACERT/usr/local/ssl/ca.pem
TLS_CACERTDIR/usr/local/ssl/certs
La première clause indique quel est le fichier contenant le root CA. La deuxième clause donne le répertoire où sont stockés les différents certificats nécessaires à la validation.
Note: La première clause n'est pas fondamentalement nécessaire si dans le répertoire des certificats existe un lien symbolique vers le certificat du root CA.
Si vous utilisez un fichier ldaprc, et si dans ce fichier sont définies les deux clauses supplémentaires suivantes:
TLS_CERT/usr/local/ssl/certs/client.pem
TLS_KEY/usr/local/ssl/private/client.key
alors, lorsque vous lancerez une commande ldapsearch, la passphrase du certificat client sera demandée, si celle-ci existe bien entendu.
Création d'un certificat client
L'idée de principe est identique à la création d'un certificat serveur. Il faudra simplement choisir le bon fichier de configuration pour générer la requête de certificat, puis il faudra signer le certificat par une autorité de certification.
Je vous laisse faire vous-même vos propres essais. J'y suis arrivé; et comme vous ne pouvez pas être plus bête que moi (à moins d'être un idiot congénital), vous devriez y arriver vous aussi.
Fichiers de configuration utilisés
# pour generer un certificat root CA
[ req ]
default_bits= 1024
default_keyfile= private/ca.key
default_md= md5
distinguished_name= req_distinguished_name
x509_extensions= rootca_cert
[ req_distinguished_name ]
countryName= Pays
countryName_default= FR
countryName_min= 2
countryName_max= 2
stateOrProvinceName= Etat, province ou departement
stateOrProvinceName_default= Herault
localityName= Ville
localityName_default= Montpellier
organizationName= Organisation
organizationName_default= Maison de la Teledetection
organizationalUnitName= Unite organisationnelle
organizationalUnitName_default= TETIS
commonName= Nom commun
commonName_default= MTD Root CA
commonName_max= 64
emailAddress= Adresse mail
emailAddress_default= mail_admin@mondomaine.net
emailAddress_max= 64
[ rootca_cert ]
# la section ci-dessous decrit les extensions a inclure dans un certificat rootCA
basicConstraints= critical, CA:true
subjectKeyIdentifier= hash
keyUsage= critical, keyCertSign, cRLSign
authorityKeyIdentifier= keyid:always,issuer:always
nsCertType= sslCA, emailCA, objCA
nsComment= "Certificat Racine. Genere par OpenSSL"
# subjectAltName= email:copy
Remplacez les textes en gras par vos coordonnées.
# pour generer une requete de certificat CA intermediaire
[ req ]
default_bits= 1024
default_keyfile= private/subca.key
default_md= md5
distinguished_name= req_distinguished_name
x509_extensions= subca_req
string_mask= nombstr
[ req_distinguished_name ]
countryName= Pays
countryName_default= FR
countryName_min= 2
countryName_max= 2
stateOrProvinceName= Etat, province ou departement
stateOrProvinceName_default= Herault
localityName= Ville
localityName_default= Montpellier
organizationName= Organisation
organizationName_default= Maison de la Teledetection
organizationalUnitName= Unite organisationnelle
organizationalUnitName_default= TETIS
commonName= Nom commun
commonName_default= MTD ldap CA
commonName_max= 64
emailAddress= Adresse mail
emailAddress_default= mail_admin@mondomaine.net
emailAddress_max= 64
[ subca_req ]
basicConstraints= critical, CA:true
subjectKeyIdentifier= hash
authorityKeyIdentifier= keyid, issuer:always
keyUsage= critical, keyCertSign, cRLSign
# nsCertType= sslCA, emailCA, objCA
# nsComment= "Requete de signature de certificat"
# subjectAltName= email:copy
Remplacez les textes en gras par vos coordonnées.
# pour generer une requete de certificat serveur
[ req ]
default_bits= 1024
default_keyfile= private/server.key
default_md= md5
distinguished_name= req_distinguished_name
x509_extension= server_req
string_mask= nombstr
[ req_distinguished_name ]
countryName= Pays
countryName_default= FR
countryName_min= 2
countryName_max= 2
stateOrProvinceName= Etat, province ou departement
stateOrProvinceName_default= Essonne
localityName= Ville
localityName_default= Montpellier
organizationName= Organisation
organizationName_default= Maison de la Teledetection
organizationalUnitName= Unite organisationnelle
organizationalUnitName_default= TETIS
commonName= Nom commun (ex: nom de la root CA)
commonName_max= 64
emailAddress= Adresse mail
emailAddress_default= mail_admin@mondomaine.net
emailAddress_max= 64
[ server_req ]
basicConstraints= critical, CA:false
subjectKeyIdentifier= hash
keyUsage= digitalSignature, keyEncipherment
extendedKeyUsage= serverAuth, clientAuth
nsCertType= server
# nsComment= "Requete de signature de certificat"
# subjectAltName= email:copy
Remplacez les textes en gras par vos coordonnées.
# poour generer une requete de certificat utilisateur
[ req ]
default_bits= 1024
default_keyfile= private/user.key
default_md= md5
distinguished_name= req_distinguished_name
x509_extensions= user_req
string_mask= nombstr
[ req_distinguished_name ]
countryName= Pays
countryName_min = 2
countryName_max = 2
stateOrProvinceName= Etat, province ou departement
localityName= Ville
organizationName= Organisation
organizationalUnitName= Unite organisationnelle
commonName= Nom commun
commonName_max= 64
emailAddress= Adresse mail
emailAddress_max= 64
[ user_req ]
basicConstraints= critical, CA:false
subjectKeyIdentifier= hash
keyUsage= digitalSignature, nonRepudiation, keyEncipherment
extendedKeyUsage= clientAuth, emailProtection
nsCertType= client, email
# nsComment= "Requete de signature de certificat"
subjectAltName= email:copy
#issuerAltName=issuer:copy
#nsCaRevocationUrl= http://www.domain.dom/ca-crl.pem
#nsBaseUrl
nsRevocationUrl= ldap://mesange.int-evry.fr:9009/ou=PKI,o=INT,c=FR?certificateRevocationList?sub?(cn=CRL)
#nsRenewalUrl
#nsCaPolicyUrl
#nsSslServerName
Remplacez les textes en gras par vos coordonnées.
# pour signer un certificat CA intermediaire
[ ca ]
default_ca= CA_default# The default ca section
[ CA_default ]
dir= /usr/local/ssl# Where everything is kept
certs= $dir/certs# Where the issued certs are kept
crl_dir= $dir/crl# Where the issued crl are kept
database= $dir/index.txt# database index file.
new_certs_dir= $dir/newcerts# default place for new certs.
Certificate= $dir/ca.pem# The CA certificate
serial= $dir/serial# The current serial number
crl= $dir/ca.crl# The current CRL
private_key= $dir/private/ca.key# The private key
RANDFILE= $dir/private/.rand# private random number file
default_days= 4383# how long to certify for
default_crl_days= 30# how long before next CRL
default_md= md5# which md to use.
Preserve= no# keep passed DN ordering
x509_extensions= subca_cert
copy_extensions= none
policy= policy_match
[ subca_cert ]
basicConstraints= critical, CA:true
authorityKeyIdentifier= keyid:always, issuer:always
subjectKeyIdentifier= hash
keyUsage= critical, keyCertSign, cRLSign
# nsCertType= sslCA, emailCA, objCA
nsComment= "Genere par OpenSSL"
# subjectAltName= email:copy
[ policy_match ]
countryName= match
stateOrProvinceName= optional
localityName= optional
organizationName= supplied
organizationalUnitName= optional
commonName= supplied
emailAddress= optional
# pour signer un certificat serveur
[ ca ]
default_ca= CA_default# The default ca section
[ CA_default ]
dir= /usr/local/ssl# Where everything is kept
certs= $dir/certs# Where the issued certs are kept
crl_dir= $dir/crl# Where the issued crl are kept
database= $dir/index.txt# database index file.
new_certs_dir= $dir/newcerts# default place for new certs.
Certificate= $dir/ca.pem# The CA certificate
serial= $dir/serial# The current serial number
crl= $dir/ca.crl# The current CRL
private_key= $dir/private/ca.key# The private key
RANDFILE= $dir/private/.rand# private random number file
default_days= 730# how long to certify for
default_crl_days= 30# how long before next CRL
default_md= md5# which md to use.
Preserve= no# keep passed DN ordering
x509_extensions= server_cert
copy_extensions= none
policy= policy_anything
[ server_cert ]
basicConstraints= critical, CA:false
authorityKeyIdentifier= keyid:always
subjectKeyIdentifier= hash
keyUsage= digitalSignature, nonRepudiation, keyEncipherment
extendedKeyUsage= serverAuth, clientAuth
nsCertType= server, objsign
nsComment= "Certificat serveur genere par OpenSSL pour INT/LOR"
#subjectAltName = email:copy
#issuerAltName = issuer:copy
#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem
#nsBaseUrl
#nsRevocationUrl
#nsRenewalUrl
#nsCaPolicyUrl
#nsSslServerName
[ policy_anything ]
countryName= supplied
stateOrProvinceName= optional
localityName= optional
organizationName= supplied
organizationalUnitName= optional
commonName= supplied
emailAddress= optional
# pour signer un certificat utilsateur
[ ca ]
default_ca= CA_default# The default ca section
[ CA_default ]
dir= /usr/local/ssl# Where everything is kept
certs= $dir/certs# Where the issued certs are kept
crl_dir= $dir/crl# Where the issued crl are kept
database= $dir/index.txt# database index file.
new_certs_dir= $dir/newcerts# default place for new certs.
Certificate= $dir/ca.pem# The CA certificate
serial= $dir/serial# The current serial number
crl= $dir/ca.crl# The current CRL
private_key= $dir/private/ca.key# The private key
RANDFILE= $dir/private/.rand# private random number file
default_days= 365# how long to certify for
default_crl_days= 30# how long before next CRL
default_md= md5# which md to use.
Preserve= no# keep passed DN ordering
x509_extensions= user_cert
copy_extensions= none
policy= policy_anything
[ user_cert ]
basicConstraints= critical, CA:false
authorityKeyIdentifier= keyid:always
subjectKeyIdentifier= hash
keyUsage= digitalSignature, nonRepudiation, keyEncipherment
extendedKeyUsage= clientAuth, emailProtection
nsCertType= client, email, objsign
nsComment= "Certificat utilisateur genere par OpenSSL pour INT/LOR"
subjectAltName = email:copy
#issuerAltName = issuer:copy
#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem
#nsBaseUrl
nsRevocationUrl = ldap://mesange.int-evry.fr:9009/ou=PKI,o=INT,c=FR?certificateRevocationList?sub?(cn=CRL)
#nsRenewalUrl
#nsCaPolicyUrl
#nsSslServerName
[ policy_anything ]
countryName= optional
stateOrProvinceName= optional
localityName= optional
organizationName= optional
organizationalUnitName= optional
commonName= supplied
emailAddress= supplied
That’s all falks !!!
Cette documentation est tirée du document TLS/SSL de Michel Gardie.
Accès à la page d'accueil authentification dans LDAP.