Debian / Ubuntu - Créer une autorité de certification racine (Root CA)

Page 1 / 2
  • Publié le : 14 février 2015 à 19:46
  • Par Lionel Eppe

Si vous avez un serveur Linux ou un VPS (machine virtuelle sur Internet) et que vous souhaitez sécuriser plusieurs services (web, mails, ...), il devient très intéressant d'utiliser une autorité de certification. Grâce à cette autorité de certification, il vous suffira d'importer le certificat de votre autorité de certification dans les autorités de confiance de vos périphériques (ordinateurs, smartphones, ...) pour que tous vos certificats soient considérés comme émanant d'une autorité reconnue.

Tutoriel testé sous Ubuntu 12.04 et Debian 7.7.0.

  1. Installation d'OpenSSL
  2. Création de l'autorité de certification (CA)
  3. Création d'une demande de signature de certificat
  4. Création du certificat depuis la demande de signature
  5. Sécuriser Apache avec le certificat SSL
  6. Test de la configuration
  7. Importer le certificat de l'autorité dans les PC Linux
  8. Importer le certificat de l'autorité dans les PC Windows
  9. Révoquer un certificat
  10. Création de la liste de révocation (CRL)
  11. Rendre la liste de révocation accessible depuis le web
  12. Test de la révocation

1. Installation d'OpenSSL

Par sécurité, faites une mise à jour de la liste des paquets.

Code : Bash

apt-get update

Puis, installez le paquet "openssl".

Code : Bash

apt-get install openssl

 

2. Création de l'autorité de certification (CA)

Pour modifiez les informations qu'OpenSSL utilisera pour créer l'autorité de certification, modifiez le fichier "/etc/ssl/openssl.cnf".

Dans ce fichier, vous pourrez modifiez la durée de validité des certificats que vous signerez.
Par exemple : 10 ans (3650 jours).

Code : Plain Text

default_days = 3650

Modifier la taille de la clé utilisée. Pour information : Geotrust demande maintenant des certificats en 2048 bits. Donc, autant faire comme eux.

Code : Plain Text

default_bits = 2048

Ainsi, que les informations de votre autorité de certification. Dont celles-ci :

Code : Plain Text

# Le code du pays.
countryName_default = BE
# L'état ou la province. Perso, j'ai mis le pays pour protéger ma vie privée.
stateOrProvinceName_default = Belgique
# Le nom de votre organisation (ou le nom de votre site si vous le souhaitez).
0.organizationName_default = InformatiWeb
# Dans la partie "[ usr_cert ]", ajoutez la ligne suivante :
crlDistributionPoints=URI:http://www.informatiweblan.net/ca-crl.crl
# Doc : https://www.openssl.org/docs/apps/x509v3_config.html#crl_distribution_points_

Pour finir, créer votre autorité de certification en utilisant le script "CA.sh" d'OpenSSL.

Code : Bash

cd /usr/lib/ssl/misc/
sudo ./CA.sh -newca

Lors de la création de l'autorité de certification, le script vous demandera :
- un mot de passe pour protéger la clé privée de l'autorité de certification
- les informations à indiquer dans le certificat de l'autorité

Note : Le nom commun a indiquer lors de la création de l'autorité de certification est le nom de votre autorité de certification.

Code : Plain Text

...
writing new private key to './demoCA/private/./cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
...
Country Name (2 letter code) [BE]:
State or Province Name (full name) [Belgique]:
Locality Name (eg, city) []:
Organization Name (eg, company) [InformatiWeb]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:InformatiWeb CA
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
...

Dans le dossier "/usr/lib/ssl/misc/demoCA" qui a été créé par ce script, vous trouverez tous les fichiers concernant votre autorité de certification.
Dont le certificat de l'autorité : "cacert.pem".

Code : Bash

ls -l /usr/lib/ssl/misc/demoCA/

Code : Bash

total 40
-rw-r--r-- 1 root root 4309 fév 11 16:14 cacert.pem
-rw-r--r-- 1 root root  972 fév 11 16:14 careq.pem
drwxr-xr-x 2 root root 4096 fév 11 16:14 certs
drwxr-xr-x 2 root root 4096 fév 11 16:14 crl
-rw-r--r-- 1 root root   94 fév 11 16:14 index.txt
-rw-r--r-- 1 root root   21 fév 11 16:14 index.txt.attr
-rw-r--r-- 1 root root    0 fév 11 16:14 index.txt.old
drwxr-xr-x 2 root root 4096 fév 11 16:14 newcerts
drwxr-xr-x 2 root root 4096 fév 11 16:14 private
-rw-r--r-- 1 root root   17 fév 11 16:14 serial

 

3. Création d'une demande de signature de certificat

Pour prendre un exemple courant, nous allons demander un certificat qui aura ces caractéristiques :
- valable 10 ans
- valide pour tous les sous-domaines (sauf le domaine)
- clé privée non protégée par mot de passe pour éviter qu'Apache ne le demande au démarrage (ou redémarrage en cas de problèmes)

Code : Bash

openssl req -new -nodes -keyout /etc/ssl/private/www-key.pem -out /tmp/www-req.pem -days 3650

Comme tout à l'heure, des informations vous seront demandées.
Parmi ces informations, vous devez obligatoirement indiquer "*.domaine.net" pour le nom commun car c'est cette valeur que le navigateur web vérifiera.
Note : Pour générer un certificat valable pour le domaine uniquement, indiquez "domaine.net" pour le nom commun.

Code : Plain Text

Generating a 2048 bit RSA private key
............+++
..........+++
writing new private key to 'www-key.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) [BE]:
State or Province Name (full name) [Belgique]:
Locality Name (eg, city) []:
Organization Name (eg, company) [InformatiWeb]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:*.informatiweblan.net
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

 

4. Création du certificat depuis la demande de signature

Pour finir, utilisez la demande de signature pour signer le certificat.

Code : Bash

cd /usr/lib/ssl/misc/
openssl ca -out /etc/ssl/certs/www-cert.pem -infiles /tmp/www-req.pem

Code : Plain Text

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:
92:41:c8:a0:fa:43:33:f6
Validity
Not Before: Feb 11 15:30:52 2015 GMT
Not After : Feb  8 15:30:52 2025 GMT
Subject:
countryName               = BE
stateOrProvinceName       = Belgique
organizationName          = InformatiWeb
commonName                = *.informatiweblan.net
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
9E:24:79:43:C8:90:6E:9E:52:4A:80:8C:35:32:92:AC:66:CD:20:F6
X509v3 Authority Key Identifier:
keyid:10:44:64:86:EB:FE:F1:52:10:8A:0B:EF:2C:49:EE:DC:F0:1C:B3:2F

Certificate is to be certified until Feb  8 15:30:52 2025 GMT (3650 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