10.2. Préparatifs

10.2.1. Le paquetage OpenSSL

Afin de générer des certificats et de créer notre propre autorité de certification, nous devons installer le paquetage openssl.

root@ubuntu:~# apt-get install openssl
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Reading state information... Fait       
Paquets suggérés :
  ca-certificates
Les NOUVEAUX paquets suivants seront installés :
  openssl
0 mis à jour, 1 nouvellement installés, 0 à enlever et 8 non mis à jour.
Il est nécessaire de prendre 0o/1001ko dans les archives.
Après dépaquetage, 2359ko d'espace disque supplémentaires seront utilisés.
Sélection du paquet openssl précédemment désélectionné.
(Lecture de la base de données... 18124 fichiers et répertoires déjà installés.)
Dépaquetage de openssl (à partir de .../openssl_0.9.8c-4build1_i386.deb) ...
Paramétrage de openssl (0.9.8c-4build1) ...

root@ubuntu:~# 

OpenSSL permet de fixer un certain nombre de paramètres par défaut. Cela évitera de saisir des informations répétitives lors de la création des certificats (aumoins un certificat de CA et un serveur). Pour modifier les valeurs par défaut de création de certificats, il faut éditer le fichier /etc/ssl/openssl.cnf et modifier les paramètres suivants :

  • countryName_default : mettre le CC (country code) du pays à la place de « AU ». A priori, « FR ».

  • stateOrProvinceName_default : remplacer « Some-State » par une valeur plus adaptée.

  • localityName_default : mettre la ville ou se trouve la société recevant le certificat.

  • 0.organizationName_default : mettre le nom de la société recevant le certificat.

  • organizationalUnitName_default : nom du service utilisant le certificat. Il n'est pas necessaire de prendre ce champ au pied de la lettre et l'on peut mettre Serveur par exemple.

  • commonName_default : le nom d'hôte du serveur. Il ne faut pas se tromper ici sous peine de recevoir un pop-up supplémentaire du navigateur !

  • emailAddress_default : une adresse email de contact dans la société recevant le certificat.

10.2.2. Création d'une autorité de certification

Le paquetage OpenSSL installe des scripts permettant de simplifier la génération de certificats. La manipulation d'openssl en ligne de commande étant particulièrement inhumaine, il est vivement recommandé de les utiliser, au moins pour la création de notre CA.

Avant de créér notre PKI, il est important de comprendre que créér une autorité de certification n'est pas anodin. Si la clef privée de notre CA est compromise, l'attaquante (Mallory) signer n'importe quel certificat (client ou serveur) à notre place, et, si elle est en mesure d'in,tercepter des communication qui nous sont destinées, pourra même de faire passer pour nôtre serveur. La RFC 3647 ([RFC3647]) définit un certain nombre de bonnes pratiques pour la gestion d'infrastructures à clef publiques.

La première tâche dans la création de notre mini-PKI consiste donc à créér notre propre autorité de certification (afin de signer à terme nos propres certificats). On utilisera le script /usr/lib/ssl/misc/CA.pl pour la totalité de nos besoins.

root@ubuntu:~# /usr/lib/ssl/misc/CA.pl -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Generating a 1024 bit RSA private key
.............................++++++
.........++++++
writing new private key to './demoCA/private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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.
-----
Country Name (2 letter code) [FR]:
State or Province Name (full name) [Rhone]:
Locality Name (eg, city) [Souris City]:
Organization Name (eg, company) [Souris SARL]:
Organizational Unit Name (eg, section) [Servers]:
Common Name (eg, YOUR name) [ubuntu.example.com]:
Email Address [souris@example.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            93:02:12:ea:93:09:59:f3
        Validity
            Not Before: Jun 24 13:47:39 2007 GMT
            Not After : Jun 23 13:47:39 2010 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = Rhone
            organizationName          = Souris SARL
            organizationalUnitName    = Servers
            commonName                = ubuntu.example.com
            emailAddress              = souris@example.com
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                FD:12:E1:CA:84:81:87:A3:E4:A1:DD:43:5B:88:E3:0D:E0:5B:D4:25
            X509v3 Authority Key Identifier: 
                keyid:FD:12:E1:CA:84:81:87:A3:E4:A1:DD:43:5B:88:E3:0D:E0:5B:D...
                DirName:/C=FR/ST=Rhone/O=Souris SARL/OU=Servers/CN=ubuntu.exa...
                serial:93:02:12:EA:93:09:59:F3

            X509v3 Basic Constraints: 
                CA:TRUE
Certificate is to be certified until Jun 23 13:47:39 2010 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated
root@ubuntu:~# 

Comme nous avons préalablement renseigné /etc/ssl/openssl.conf, il nous suffit d'accepter toutes les valeurs par défaut. Il faudra en revanche utiliser un mot de passe raisonnable (Enter PEM pass phrase) pour chiffrer la clef privée.

10.2.3. Création d'un certificat serveur

Pour générer un certificat serveur, on invoquera CA.pl avec l'argument -newreq-nodes. On veillera à utiliser -newreq-nodes et non -newreq. Ce dernier chiffre la clef privée liée au certificat (et nécessite donc un mot de passe pour l'utiliser). Bien que dans l'absolu ce soit une bonne pratique (quelqu'un qui déroberait notre certificat et notre clef non protégée pourrait se faire passer pour nous), ça n'est pas très pratique en production : à chaque démarrage, les serveurs demanderont le mot de passe pour débloquer la clef, et il faudra donc être présent physiquement sur la console. Comme souvent, augmenter la sécurité induit une complication d'usage. Chacun pourra choisir en fonction du ratio sécurité / « praticité » désiré.

root@ubuntu:~# /usr/lib/ssl/misc/CA.pl -newreq-nodes
Generating a 1024 bit RSA private key
.........................++++++
................................++++++
writing new private key to 'newkey.pem'
-----
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.
-----
Country Name (2 letter code) [FR]:
State or Province Name (full name) [Rhone]:
Locality Name (eg, city) [Souris City]:
Organization Name (eg, company) [Souris SARL]:
Organizational Unit Name (eg, section) [Servers]:
Common Name (eg, YOUR name) [ubuntu.example.com]:
Email Address [souris@example.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Request is in newreq.pem, private key is in newkey.pem
root@ubuntu:~#

A cet instant, nous avons un certificat (newreq.pem) contenant une demande de signature (CSR, Certificate Signing Request) ainsi qu'une clef privée associée (newreq.pem). Là aussi les opérations sont très simples puisque la majoroté des informations a déja été saisie dans openssl.conf.

Nous pouvons maintenant signer la demande de certificat avec la clef de notre CA. Cela permettra à ceux qui font confiance à notre autorité de certification de faire confiance à ce certificat, établissant ainsi une « chaîne de confiance » (web of trust).

root@ubuntu:~# /usr/lib/ssl/misc/CA.pl -sign
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:xxxxxx
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            93:02:12:ea:93:09:59:f4
        Validity
            Not Before: Jun 24 13:47:54 2007 GMT
            Not After : Jun 23 13:47:54 2008 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = Rhone
            localityName              = Souris City
            organizationName          = Souris SARL
            organizationalUnitName    = Servers
            commonName                = ubuntu.example.com
            emailAddress              = souris@example.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                F8:06:7D:14:27:C2:76:07:24:12:16:D9:80:71:C2:23:36:2F:15:D2
            X509v3 Authority Key Identifier: 
                keyid:FD:12:E1:CA:84:81:87:A3:E4:A1:DD:43:5B:88:E3:0D:E0:5B:D...

Certificate is to be certified until Jun 23 13:47:54 2008 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
Signed certificate is in newcert.pem
root@ubuntu:~# 

On déplacera ensuite le certificat généré et sa clef dans des emplacements plus appropriés, c'est à dire respectivement sous /etc/ssl/cert/ et /etc/ssl/private/. On pourra aussi copier le certificat de notre CA.

root@ubuntu:~# mv newcert.pem /etc/ssl/certs/serveur.pem
root@ubuntu:~# mv newkey.pem /etc/ssl/private/serveur.key
root@ubuntu:~# cp demoCA/cacert.pem /etc/ssl/certs/cacert.pem

10.2.4. Liste de révocation

Emettre un certificat n'est heureusement pas irrévoquable. Il peut être compromis, le serveur démantelé, le porteur du certificat ne bénéficie plus du service, ... Dans ce cas, on pourra révoquer ce certificat, en le placant dans une CRL (Certificate Revocation List).

Cette CRL pourra ensuite être utilisée par tous ceux qui potentiellement peuvent rencontrer des certificats révoqués. En général, les CRL sont utilisées par les serveurs afin de ne plus fournir de service aux usagers qui n'y ont plus droit, mais on peut aussi utiliser des CRLs sur des clients afin de ne plus accepter les certificats serveurs révoqués (suite à un piratage par exemple).

root@ubuntu:~# openssl ca -revoke alice.pem -crl_reason keyCompromise ❶
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA//private/cakey.pem:
Revoking Certificate 930212EA930959F6.
Data Base Updated
root@ubuntu:~# openssl ca -gencrl ❷
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA//private/cakey.pem:
-----BEGIN X509 CRL-----
MIIBijCB9AIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCRlIxDjAMBgNV
BAgTBVJob25lMRQwEgYDVQQKEwtTb3VyaXMgU0FSTDEQMA4GA1UECxMHU2VydmVy
czEbMBkGA1UEAxMSdWJ1bnR1LmV4YW1wbGUuY29tMSEwHwYJKoZIhvcNAQkBFhJz
b3VyaXNAZXhhbXBsZS5jb20XDTA3MDcwMzE1NTYwNloXDTA3MDgwMjE1NTYwNlow
KjAoAgkAkwIS6pMJWfYXDTA3MDcwMzE1NTU1NVowDDAKBgNVHRUEAwoBAaAOMAww
CgYDVR0UBAMCAQEwDQYJKoZIhvcNAQEFBQADgYEAcq+U2r8S3TdQnT50Hm0XzHcy
inwO4P43r5WJ2Xw5DHieJfDwpoASpBjrkXQeQdF3zc6e0GxSkJpvc051bdbQ3dx4
PSemqff+trxCapHA4pXBt2M3PqPAhze8bx7af6EQw27+k5HWGfbEew2ByAuqHa7S
jJteWU6hYkCymbqrDX4=
-----END X509 CRL-----
root@ubuntu:~# 

L'option -revoke demande la révocation du certificat passé en paramètre, tandis que -crl_reason donne la raison de la révocation. La liste des raisons de révocation et donnée dans la mage de man d'openssl/ca (ca(1ssl)).

On peut ensuite générer une liste de révocation que l'on peut distribuer aux serveurs et/ou clients qui en ont besoin, et qui contient la liste signée de tous les certificats révoqués.