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.
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.
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
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 |
❷ | 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. |