OpenSSL : création et mise en place d’une PKI

[ 4 ] Commentaires
Share

ATTENTION !!! Force est de rappeler que dans ABSOLUMENT aucun cas de figure vous n’êtes amené(e) à communiquer les clés privées des entités sensibles, surtout celle du CA, qui doit être plus précieuse à vos yeux que vos yeux eux-mêmes !

Nous allons maintenant générer un certificat serveur et le signer avec notre Autorité de Certification.

L’opération se fait en 2 temps : d’abord, on génère la requête et ensuite on la valide avec le CA.

La génération se fait ainsi :

kbux@mucti:~/certs$ openssl req -newkey rsa:2048 -keyout private/server.key -out server-req.pem
Generating a 2048 bit RSA private key
............+++
............+++
writing new private key to 'private/server.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
phrase is too short, needs to be at least 4 chars
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----

kbux@mucti:~/certs$ ll
total 20
-rw-r--r-- 1 kbux kbux 1493 2009-11-17 15:01 cacert.pem
-rw-r--r-- 1 kbux kbux    0 2009-11-17 14:45 index.txt
drwxr-xr-x 2 kbux kbux 4096 2009-11-17 15:54 private
-rw-r--r-- 1 kbux kbux    3 2009-11-17 14:45 serial
drwxr-xr-x 2 kbux kbux 4096 2009-11-17 14:41 signedcerts
-rw-r--r-- 1 kbux kbux  720 2009-11-17 15:55 tmpreq.pem

Le verify nous indique bien que nous avons fait les choses à moitié.

kbux@mucti:~/certs$ openssl verify -CAfile cacert.pem server-req.pem
unable to load certificate
5083:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:647:Expecting: TRUSTED CERTIFICATE

A présent, validons-le.

kbux@mucti:~/certs$ openssl ca -in serveur-req.pem -days 365 -out signedcerts/serveur-cert.pem -cert cacert.pem -keyfile private/cacertkey.pem
Using configuration from /home/kbux/certs/openssl.cnf
Enter pass phrase for private/cacertkey.pem:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :PRINTABLE:'K-TUX CA'
stateOrProvinceName   :PRINTABLE:'FR'
countryName           :PRINTABLE:'FR'
emailAddress          :IA5STRING:'CA@k-tux.com'
organizationName      :PRINTABLE:'K-TUX'
organizationalUnitName:PRINTABLE:'K-TUX'
Certificate is to be certified until Nov 17 21:40:22 2010 GMT (365 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

Et vérifions un peu ce que nous raconte OpenSSL :

kbux@mucti:~/certs$ openssl verify -CAfile cacert.pem signedcerts/serveur-cert.pem
signedcerts/serveur-cert.pem: OK

kbux@mucti:~/certs$ openssl x509 -in signedcerts/serveur-cert.pem -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 2 (0x2)
Signature Algorithm: md5WithRSAEncryption
Issuer: C=FR, ST=SomeState, L=Somewhere, O=Internet Widgits Pty Ltd, CN=K-TUX
Validity
Not Before: Nov 17 21:40:22 2009 GMT
Not After : Nov 17 21:40:22 2010 GMT
Subject: CN=K-TUX CA, ST=FR, C=FR/emailAddress=CA@k-tux.com, O=K-TUX, OU=K-TUX
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (2048 bit)
Modulus (2048 bit):
00:[...]:63
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:k-tux.com
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Server
Signature Algorithm: md5WithRSAEncryption
04:[...]:3d

Voila une affaire qui marche ! Grâce à notre fichier de conf, OpenSSL a rempli tout seul comme un grand les champs paramétrés. Dans le cas où nous n’avions pas de fichier de configuration customisé ou que nous n’avions pas prérempli ces champs, il nous aurait inondé de questions.

Il nous reste à générer l’équivalent pour chacun de nos utilisateurs, à la différence que si ceux-ci sont sous Mac OS X ou sous Windows, il vous faudra rajouter une conversion de type de fichier de pem à pkcs12. La méthode est la même que celle utilisée pour générer le certificat serveur-cert.pem, avec un petit plus.

kbux@mucti:~/certs$ openssl req -newkey rsa:2048 -keyout private/kbux.key -out kbux-req.pem
kbux@mucti:~/certs$ openssl ca -in kbux-req.pem -days 365 -out signedcerts/kbux-cert.pem -cert cacert.pem -keyfile private/cacertkey.pem
kbux@mucti:~/certs$ openssl pkcs12 -export -inkey private/kbux.key -in signedcerts/kbux-cert.pem -name K-TUXUser -certfile cacert.pem -out signedcerts/kbux-cert.p12

Il est maintenant possible d’intégrer -ou de faire intégrer, il n’y a pas de raison !- le certificat utilisateur dans son propre navigateur. C’est d’ailleurs un important prérequis pour pouvoir faire fonctionner l’authentification x509.

Bon à savoir, avant que l’on ne s’éloigne trop de l’aspect administration de PKI, la partie révocation d’un certificat passe par la création d’une Certificate Revokation List (une liste de révocation de certificat), dont le chemin par défaut est stipulé dans le fichier de configuration d’OpenSSL -chemin que nous avons pris soin de redéfinir dans notre fichier de configuration customisé.

Cette liste contient les numéros de série des certificats révoqués pour une Autorité de Certification. Comme cette liste n’existe pas par défaut, il nous faut dans un premier temps la créer avec la commande :

kbux@mucti:~/certs$ openssl ca -gencrl -keyfile private/cacertkey.pem -cert cacert.pem -out crl.pem
Enter pass phrase for private/cacertkey.pem:

Si vous avez la curiosité de catter la liste en question, vous aurez un truc du genre :

kbux@mucti:~/certs$ cat crl.pem
-----BEGIN X509 CRL-----
MIIBrjCBlzANBgkqhkiG9w0BAQQFADBoMQswCQYDVQQGEwJGUjESMBAGA1UECBMJ
U29tZVN0YXRlMRIwEAYDVQQHEwlTb21ld2hlcmUxITAfBgNVBAoTGEludGVybmV0
IFdpZGdpdHMgUHR5IEx0ZDEOMAwGA1UEAxMFSy1UVVgXDTA5MTEyMDA3MzgyOVoX
muTn6MxcVhmw14o+bAfLPP9exIOTi7X+AISakYKCe/up2nuP5rY8PVS3sgcoYJpm
kwTE0NQQs3QQoGQzeTVnCR8R6wlz0HlYx45eEPaV5gj8RLLrPnUV3lJlhhbK10J4
TnNslWQctp+9DuRaC/8bm1gnv/T0i5vGbYRVX82wQMGLcyGVx+yJ7RrnAx5VxBtM
odI=
-----END X509 CRL-----

Ensuite, pour révoquer -par exemple notre certificat utilisateur, kbux-cert.pem-, il vous suffit de faire :

kbux@mucti:~/certs$ openssl ca -revoke signedcerts/kbux-cert.pem -keyfile private/cacertkey.pem -cert cacert.pem
Using configuration from /home/kbux/certs/openssl.cnf
Enter pass phrase for private/cacertkey.pem:
Revoking Certificate 03.
Data Base Updated

Et enfin, regénérer et consulter le contenu de cette CRL. Et là vous pouvez saisir la véritable nature de la CRL : une version lisible et exploitable des certificats révoqués, uniquement vouée à un objectif d’information et de publication.

kbux@mucti:~/certs$ openssl ca -gencrl -keyfile cacert.pem -cert cacert.pem -out crl.pem
kbux@mucti:~/certs$ openssl crl -in crl.pem -noout -text
Certificate Revocation List (CRL):
 Version 1 (0x0)
 Signature Algorithm: md5WithRSAEncryption
 Issuer: /C=FR/ST=SomeState/L=Somewhere/O=Internet Widgits Pty Ltd/CN=K-TUX
 Last Update: Nov 20 08:01:45 2009 GMT
 Next Update: Nov 20 08:01:45 2010 GMT
Revoked Certificates:
 Serial Number: 03
 Revocation Date: Nov 20 07:41:11 2009 GMT
 Signature Algorithm: md5WithRSAEncryption
 52:[...]:37

Voila pour ce qui est de la PKI.

Pour ceux que ça connait, ce n’est quand même pas de la tarte à maintenir, entre les renouvellements, les « perdu passphrase », les révocations, on a de quoi se tenir chaud l’hiver, près des serveurs.

A savoir tout de même qu’OpenSSL vous permet de tester -et on en fera un usage bien massif- les discussions entre serveurs et clients via les certificats.

Ce point-là sera d’ailleur expliqué, mis en place et exploité dans un prochain post. Et oui, l’informatique c’est comme tout. Faut d’abord laisser infuser !

Sur ce, je vous laisse méditer et vous souhaite un bon wiikend !

4 Responses to OpenSSL : création et mise en place d’une PKI

  1. Visiteur-JP dit :

    article tres interresant et complet,
    un autre guide sur le net, un pe mois detaille.
    http://www.codealias.info/technotes/manipulating_pki_certificates

  2. K-TUX dit :

    Merci !

    Je vais bouquiner ton lien, histoire de voir ce que je n’ai pas mis dans ce post, en tout cas j’apprécie ton commentaire !

    A + !

  3. testtux dit :

    très utile comme doc

  4. K-TUX dit :

    Merci !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>