[PKI] Installez votre autorité de certification sur votre Debian

PKI - Installer une CA chez soi

Après vous avoir fait un petit briefing sur les infrastructures à clés publiques, je vous propose de mettre en place votre propre autorité de certification sur votre serveur Debian. Cette CA vous permettra entre autres d’auto-signer les certificats que vous seriez amenés à générer pour vos propres services.

Comme je vous prépare un petit tas d’articles sur l’auto-hébergement et que je chiffre tout ce que je peux, je me suis dit que de noter cette démarche dans un coin ne pourrait pas faire de mal…

Pour réaliser cela, on va faire simple : on va utiliser les scripts proposés avec le paquet openssl. Si ce n’est pas déjà fait, installez-le :

sudo apt-get install openssl

Création d’une autorité de certification avec OpenSSL

Configuration d’OpenSSL

Avant de commencer, vous pouvez apporter quelques modifications au fichier /etc/ssl/openssl.cnf, dont le script que nous allons utiliser s’inspirera pour créer la CA.

Vous n’avez pas besoin de tout modifier, mais voici ce que j’ai modifié chez moi :

# Durée pour laquelle les demandes seront signées (ici 10 ans)
default_days = 3652
 
# Taille de clé utilisé
default_bits = 2048
 
# Informations de la CA
countryName_default = FR
stateOrProvinceName_default = Bretagne
0.organizationName_default = Le blog de Guillaume

Utilisation des scripts OpenSSL

Ensuite c’est très simple, rendez-vous dans /usr/lib/ssl/misc/ où vous devriez avoir le contenu suivant :

ll
total 60K
-rwxr-xr-x 1 root root 5,8K nov.   1 19:10 CA.pl
-rwxr-xr-x 1 root root 5,1K nov.   1 19:10 CA.sh
-rwxr-xr-x 1 root root  119 nov.   1 19:10 c_hash
-rwxr-xr-x 1 root root  152 nov.   1 19:10 c_info
-rwxr-xr-x 1 root root  112 nov.   1 19:10 c_issuer
-rwxr-xr-x 1 root root  110 nov.   1 19:10 c_name
drwxr-xr-x 6 root root 4,0K nov.  27 10:29 demoCA
-rwxr-xr-x 1 root root 6,3K nov.   1 19:10 tsget

C’est le fichier CA.sh qui nous intéresse puisque c’est lui qui va générer notre PKI !

sudo ./CA.sh -newca
CA certificate filename (or enter to create)
 
Making CA certificate ...
Generating a 2048 bit RSA private key
.........++++++
......++++++
writing new private key to './demoCA/private/./cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
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) [Bretagne]:
Locality Name (eg, city) [Newbury]:Rennes
Organization Name (eg, company) [Le blog de Guillaume]:
Organizational Unit Name (eg, section) []:Networks
Common Name (eg, your name or your servers hostname) []:www.guillaume-leduc.fr
Email Address []:admin@guillaume-leduc.fr

Et voilà ! C’est tout ! Un dossier intitulé demoCA a normalement été créé et il contient toutes les informations de votre autorité de certification 🙂

ll demoCA
total 52K
-rw-r--r-- 1 root root 4,6K nov.  27 10:28 cacert.pem
-rw-r--r-- 1 root root 1,1K nov.  27 10:28 careq.pem
drwxr-xr-x 2 root root 4,0K nov.  27 10:28 certs
drwxr-xr-x 2 root root 4,0K nov.  27 10:28 crl
-rw-r--r-- 1 root root  268 nov.  27 10:29 index.txt
-rw-r--r-- 1 root root   21 nov.  27 10:29 index.txt.attr
-rw-r--r-- 1 root root   21 nov.  27 10:28 index.txt.attr.old
-rw-r--r-- 1 root root  159 nov.  27 10:28 index.txt.old
drwxr-xr-x 2 root root 4,0K nov.  27 10:29 newcerts
drwxr-xr-x 2 root root 4,0K nov.  27 10:28 private
-rw-r--r-- 1 root root   17 nov.  27 10:29 serial
-rw-r--r-- 1 root root   17 nov.  27 10:28 serial.old

Créer un certificat et le signer avec votre autorité de certification

C’est bien joli tout ça mais si on commençait à signer nos certificats ? Vous allez voir que c’est au moins aussi simple. Prenons par exemple le cas où je souhaiterais générer un certificat pour ce site (sur l’adresse www.guillaume-leduc.fr) afin d’utiliser le protocole HTTPS.

Première étape : création d’une demande de signature

On crée donc notre couple clé privée / clé publique + certificat, comme expliqué dans mon rappel sur les PKI :

cd /tmp
sudo openssl req -new -nodes -subj '/CN=www.guillaume-leduc.fr/O=Le blog de Guillaume/C=FR/ST=Bretagne/L=Rennes' -keyout www-key.pem -out www-req.pem -days 3652
Generating a 2048 bit RSA private key
........................+++
...............................................................................................................................................+++
writing new private key to 'www-key.pem'
-----

Qu’est-ce qu’on vient de faire ?

  • La commande req crée et traite des demandes de certificats au format PKCS#10.
  • L’option -new permet de générer une nouvelle demande de certificat.
  • -nodes désactive le chiffrement de la clé privée (pour éviter qu’Apache par exemple ne demande le passphrase de la clé au démarrage).
  • -subj permet de nommer notre requête.
  • -keyout donne le nom de fichier où la clé privée sera écrite.
  • -out le nom du fichier de sortie (le certificat).
  • Et -days le nombre de jours pour lequel le certificat sera certifié.

Si on regarde les deux fichiers que l’on vient de créer, www-key.pem contient la clé privée (qu’il faudra absolument garder en sécurité)… :

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC/xfU04Tw1co/N
1n4xBRi9k5ZjGiRazj85PA9YblesmYC2HBeTr4yV2HM7ojZRcehTzbrDPKM65R32
/eauAvTY0BhlIFotG+IYiREtibv2MAEPsFOSCzgdWCbiNgPJKXKxGCagJni58Do9
DrWXOjzhnbfUhiSa2cJnrdXmSAUnR2q/otKdcfeWpmUY/2aJNKyNcjrBNzD8SleN
+p2KvA9Zex6DLNgN/YMcIlPykOdNayMyWySO9UTx5+yKtpJ97eZ0CVp0m77q5jRn
Wtz3IyhdREYn50UIfuUlxJ9HVer+fVbjV1bf2SBs1SFvAxtGKwQ/V3knhEYUMt6O
Pck0w6DnAgMBAAECggEBAJNiEQxd2cb9z5UTNpJ350azKY3qZmw/PAnBpc2Bp/Hn
WysaNehzryjuW8lF5lb7ouDdKJ6peI1nznqnMWUksoX6j/UQQx2N41qV5NTJmOIg
jIBBNEj2RF8RA3kwqAIuz41ZET5dssS74hZQurCJuoZujvxPR8yWdLj3uX8sdIF1
JeSEASaXlGFK5ciGW+RhYor8lK9x7mfV5g4limHaUjiYy2vcUF65PhipxlpkNczO
mI3j+ZsVfJ/fuUn4NRwc5kiZUKM1dfE/1fsQQnLglLxWkaNCmVosZ619nDhmF9pt
Xk7ghW9w/elVbHlRBHtKaTBAo3mSc7JtjW2eDKMkJKkCgYEA4rjr5S9vJ7Ejz+Be
roCR9jQbc9FQf8Zpoz3GdrWxCPjc0RvuQkhUKKYbMynx467QbO7Z2R2t1WkOH4uQ
buR4abBedVbyeR5Vnt5AfG69eDKUVmD1ae02a8otpskR8NThUOmznW54LqNjflf/
OGQWzhqHRWfxomhgPL282YJY6qMCgYEA2Ims/hPdn0awlLSo+JcgouvJNeRlV/G+
Ieaol+90SX/35RfLDJcM1S7i089+w3NRcCKjPpu/4wbao3pLhuX9Lt6ZA0tS2dGZ
B8eecsDpWim0aiOFDC0RlOv3nU35KJ7sBrnkrftKUdKdz829lqvxmI5+V3fq2R3G
hp25oekSeO0CgYBQQmY/m6sdwfeLf0IFRD5nicquFUsJ8JM01omLPIaPRonk/J47
mJ8yRJscYZzfnOLrrSIxWfBPvADj6eQXXYnC4EyP/VeYyMRGmSb65bjs8/rPGUPH
W9IIFmpSwJs5RiL9Ib4T3SduWyi9cSlILSZlj76TM1i2xXxMBF72IM6ZQQKBgQCt
gyzW785ACiIHFvjrMhaZ1nyGLb0zimfDvJPOI7e4Cc33imhPb15+GTLzbSpzrZ1N
UMQksCND5UMfiiipMPP/ManE5P+/wN9yR3flFkYm1JJYFpxPVHHpNmhVaZzE+wvA
nAbtjxZPmIiScpd/+8n9Z/k/V70dO2nQhuSwJBaERQKBgA1j2NWnTIY7JAuQDCAd
UnrXe73WW2bYLce+pIrBZcvdVwOZGxTuPX+m5X3cFsLPTcFT2yPGCVKx7ITxCcZZ
CAMgoUUjkSAUT/sm2Hu8IjyuvoSTXEErxBl8JIbhRS4h9jJM9TZTs0pQStN25AJQ
JruaL2Mb1mPTqpYEgKd7RQrn
-----END PRIVATE KEY-----

… et www-req.pem la clé publique, ainsi que son certificat que nous allons faire signer :

-----BEGIN CERTIFICATE REQUEST-----
MIICtjCCAZ4CAQAwcTEfMB0GA1UEAwwWd3d3Lmd1aWxsYXVtZS1sZWR1Yy5mcjEd
MBsGA1UECgwUTGUgYmxvZyBkZSBHdWlsbGF1bWUxCzAJBgNVBAYTAkZSMREwDwYD
VQQIDAhCcmV0YWduZTEPMA0GA1UEBwwGUmVubmVzMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEAv8X1NOE8NXKPzdZ+MQUYvZOWYxokWs4/OTwPWG5XrJmA
thwXk6+MldhzO6I2UXHoU826wzyjOuUd9v3mrgL02NAYZSBaLRviGIkRLYm79jAB
D7BTkgs4HVgm4jYDySlysRgmoCZ4ufA6PQ61lzo84Z231IYkmtnCZ63V5kgFJ0dq
v6LSnXH3lqZlGP9miTSsjXI6wTcw/EpXjfqdirwPWXsegyzYDf2DHCJT8pDnTWsj
MlskjvVE8efsiraSfe3mdAladJu+6uY0Z1rc9yMoXURGJ+dFCH7lJcSfR1Xq/n1W
41dW39kgbNUhbwMbRisEP1d5J4RGFDLejj3JNMOg5wIDAQABoAAwDQYJKoZIhvcN
AQEFBQADggEBAA5Bj8guo2b87xfkQKwLQvMgGNhTbJgNBgHpJPXNbJ0JRdjb9r5P
W/0LaZKmDPqu8NHBZkyuucr1G5ENW5SXhQvGMEM1oOs7bv24g6TEqQUUpRGZARkW
PLKvFrtZBmviPLypu0EL8AHpgUJB/XKoLb9o//gqeuJwk9YvEHqpRL2RcBzoJea4
Zu6ljViFZy/ZIpUN0kS+psPdpBIKFcNWbB7xZb5mXSDQpWRfnLkpepr0MWEmn65J
WDuvh9GooxJ6HXvwkDTWLVBHf1udVxL1LwQzV6XsBETTfywqtAkErukHvhhg0l80
4evFjWNwkAxQAkG+MbjXQink3/8X1FtrqjU=
-----END CERTIFICATE REQUEST-----

Étape suivante : signer notre certificat avec notre CA

Là aussi c’est très simple, retour dans le dossier :

cd /usr/lib/ssl/misc/
sudo openssl ca -out /tmp/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: 16246269360411714243 (0xe17657e828a722c3)
        Validity
            Not Before: Nov 27 11:39:46 2013 GMT
            Not After : Nov 27 11:39:46 2023 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = Bretagne
            organizationName          = Le blog de Guillaume
            commonName                = www.guillaume-leduc.fr
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                21:CB:18:73:53:94:D4:0D:50:EC:12:16:36:3B:4A:40:3C:A4:01:9A
            X509v3 Authority Key Identifier:
                keyid:1C:3E:10:A9:DC:67:B7:D9:60:F1:B4:82:17:E7:EB:A7:C1:A2:0D:9C
 
Certificate is to be certified until Nov 27 11:39:46 2023 GMT (3652 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 voilà ! le fichier www-cert.pem a été généré dans /tmp/ et c’est ce fichier, ainsi que ma clé privée (www-key.pem) que je fournirai à Apache pour la mise en place du protocole HTTPS 🙂

Et si je souhaite révoquer un certificat ?

Si jamais votre clé venait à être corrompue, vous pourriez révoquer votre certificat avec la commande :

sudo openssl ca -revoke /tmp/www-cert.pem
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Revoking Certificate E17657E828A722C3.
Data Base Updated

La base de données de certificats de votre autorité de certification sera alors mise à jour.

Cet article vous a plu ? Partagez-le sur les réseaux sociaux !

Twitter Facebook Google Plus email