Créer une autorité de certification racine (Root CA) avec OpenSSL

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.

Sommaire

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.

apt-get update

Puis, installez le paquet "openssl".

 

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

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.

default_bits = 2048

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

 

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

 

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.

...

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

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

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)

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.

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.

cd /usr/lib/ssl/misc/

openssl ca -out /etc/ssl/certs/www-cert.pem -infiles /tmp/www-req.pem

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

5. Sécuriser Apache avec le certificat SSL

Dans la configuration d'un site sécurisé avec SSL, vous indiquerez les lignes suivantes :

SSLEngine on

SSLCertificateFile    /etc/ssl/certs/www-cert.pem

SSLCertificateKeyFile /etc/ssl/private/www-key.pem

Pour plus d'informations sur la sécurisation d'un serveur web Apache, lisez notre tutoriel "Sécurisation du serveur web Apache".

6. Test de la configuration

Si vous tentez d'accéder à la partie sécurisée de votre site via le protocole https, vous aurez un avertissement "Cette connexion n'est pas certifiée".
Ce qui est tout à fait normal étant donné que notre autorité de certification n'est pas reconnue par défaut. Pour établir cette confiance, l'utilisateur doit ajouter le certificat de votre autorité dans la liste des autorités de certification de confiance de son ordinateur (ou smartphone, ...).

 

7. Importer le certificat de l'autorité dans les PC Linux

Pour les PC Linux, pas de problème. Il suffit de copier le certificat de l'autorité (uniquement le certificat) dans l'espace web de votre serveur.

cp /usr/lib/ssl/misc/demoCA/cacert.pem /var/www/

Ensuite, sur les pc clients, accédez à l'adresse : http://www.informatiweblan.net/cacert.pem
Note : Il faut utiliser le protocole http pour télécharger le certificat car la version https est bloquée par l'avertissement.

Le navigateur web vous demandera de confirmer cette nouvelle autorité.
Si utilisez des certificats uniquement pour vos sites web, cochez uniquement la première case.
Sinon, cochez aussi les autres cases si besoin (pour les protocoles imap et pop3 de votre serveur de messagerie, par exemple).

 

Le navigateur web n'affichera plus d'avertissement pour les certificats que vous signerez avec votre autorité de certification.

 

8. Importer le certificat de l'autorité dans les PC Windows

Pour les PC Windows, vous devez convertir le certificat .pem en .cer (format microsoft).
Pour cela, faites la conversion sur le serveur grâce à "OpenSSL".

cd /usr/lib/ssl/misc/demoCA

openssl x509 -inform PEM -in cacert.pem -outform DER -out cacert.cer

Puis, copiez cette version du certificat dans l'espace web de votre serveur.

cp /usr/lib/ssl/misc/demoCA/cacert.cer /var/www/

Ensuite, sur les pc clients, téléchargez le certificat de votre autorité de certification à l'adresse : http://www.informatiweblan.net/cacert.cer
Note : Il faut utiliser le protocole http pour télécharger le certificat car la version https est bloquée par l'avertissement.

 

 

Ouvrez le certificat et cliquez sur "Installer le certificat".

 

Cliquez sur "Parcourir" et sélectionnez le magasin "Autorités de certification racines de confiances".