Créer et installer des certificats SSL

L'astuce pour notre environnement local de développement est d'être sa propre autorité de certification , et de générer les certificats pour ses sites locaux.
On utilise openssl pour ce faire.
La création du premier certificat SSL se déroulera en 3 étapes:
1. Création d'une autorité de certification
2. Génération du certificat SSL X509 pour votre site
3. Configuration d'Apache

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

1.1 Mise en place du répertoire

Tous les fichiers de configuration, key, certificat.. seront placés dans le répertoire /srv/ssl.

  1. Nous allons créer un répertoire /srv/ssl
  2. Créer les sous répertoires certs, crl, newcerts et private
  3. Un fichier serial avec uniquement “01” à l'intérieur qui donne le numéro du prochain certificat
  4. Un fichier index.txt dans lequel seront enregistrés les informations pour chaque certificat
  5. Notre fichier de configuration ssl openssl.cnf (copie du fichier /usr/lib/ssl/openssl.cnf).
$ sudo mkdir -p /srv/ssl
$ cd /srv/ssl
srv/ssl $ sudo mkdir certs crl newcerts private
srv/ssl $ echo 01 | sudo tee serial
srv/ssl $ sudo touch index.txt
srv/ssl $ sudo cp /usr/lib/ssl/openssl.cnf

1.2 Configuration

On informe openssl que le répertoire à utiliser est notre répertoire /srv/ssl en éditant le fichier /srv/ssl/openssl.cnf

$ sudo gedit /srv/ssl/openssl.cnf

Au niveau du “paragraphe” [CA_default] à la ligne dir = .. on renseigne notre répertoire /srv/ssl

[CA_default]
dir = /srv/ssl
Il est aussi possible de modifier d'autres valeurs, nom, pays….etc

1.3 Création de la clé privé de l'autorité de certification

La commande est assez longue, et il faudra se trouver et mémoriser une phrase passe.

La phrase passe sera nécessaire à chaque fois qu'on voudra certifier une clé SSL pour un de nos sites.

Cette procédure crée la clé privée de l'autorité de certification, c'est à dire elle génère le fichier /srv/ssl/private/cakey.pem.

$ cd /srv/ssl
/srv/ssl $ sudo openssl genrsa -des3 -out private/cakey.pem 4096

Il faut alors taper la phrase passe quand elle est demandée

2. Création d'un certificat pour monsite.fr

2.1 Modification du fichier openssl.cnf

Plusieurs modifications sont à apporter dans le fichier /srv/ssl/openssl.cnf (ou bien il faudrait créer un fichier de configuration par domaine)

$ cd /srv/ssl
srv/ssl $ sudo gedit /srv/ssl/openssl.cnf
  1. Décommenter la ligne req_extensions = v3_req
  2. Dans la section [ v3_req ] ajouter la ligne subjectAltName = @alt_names
  3. Plus loin, ou à la fin, ajouter une section [ alt_names]:

[ alt_names ]  
DNS.1 = monsite.fr

2.2 Création d'une clé

Ici on va créer deux fichiers :

  • la clé privée /srv/ssl/monsite.fr/monsite.fr.key.pem
  • et un clé sans phrase passe /srv/ssl/monsite.fr/monsite.fr.key.nopass.pem

On commence par créer le répertoire /srv/ssl/monsite.fr, où seront enregistrées les clés de monsite.fr

/srv/ssl$ sudo mkdir monsite.fr
/srv/ssl$ cd monsite.fr

On génère la clé privée de monsite.fr, ( il sera demandé une phrase passe à retenir!, celle de monsite.fr)

/srv/ssl/monsite.fr $ sudo openssl genrsa -des3 -out monsite.fr.key.pem 4096
Generating RSA private key, 4096 bit long modulus
...............................................................++
..................................++
e is 65537 (0x010001)
Enter pass phrase for monsite.fr.test.key.pem:
Verifying - Enter pass phrase for monsite.fr.key.pem:

Puis, On créé une clé sans mot de passe

/srv/ssl/monsite.fr $ sudo openssl rsa -in monsite.fr.key.pem -out monsite.fr.key.nopass.pem
Enter pass phrase for monsite.fr.key.pem:
writing RSA key

2.3 Création du certificat pour cette clé

On crée ici le fichier /srv/ssl/monsite.fr/monsite.fr.csr.pem, certificat pour la clé de notre domaine monsite.fr.

La phrase passe, la deuxième, celle de monsite.fr.key.pem, est demandée,

Dans Common Name on met le domaine, mais ce n'est pas obligatoire car il utilise les alt_names du fichier /srv/ssl/openssl.cnf par défaut

Il ne faut pas donner de mot de passe à la fin de la procédure.

/srv/ssl/monsite.fr$ sudo openssl req -config ../openssl.cnf -new -key monsite.fr.key.pem -out monsite.fr.csr.pem
Enter pass phrase for monsite.fr.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) [FR]:
State or Province Name (full name) [Some-State]:France
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Organisation]:Mon organisation
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:monsite.fr
Email Address []:pointal@truc.fr
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

2.4 Signature de la demande

On crée ici le fichier /srv/ssl/monsite.fr/monsite.fr.cert.pem

Il s'agit de valider notre certificat par l'autorité de certification, créée en 1.

Tout d'abord, nous avons une petite modification à apporter au fichier /srv/ssl/openssl.cnf

 $ sudo gedit /srv/ssl/openssl.cnf

Dans la section [ CA_default ] on décommente la ligne copy_extensions = copy

On peut alors signer la demande, cette fois-ci, la petite phrase de l'autorité, celle du début, ( la clé /srv/ssl/private/cakey.pem) sera demandée,

Sinon, on répond Y

$ cd /srv/ssl/monsite.fr
/srv/ssl/monsite.fr $ sudo openssl ca -config ../openssl.cnf -policy policy_anything -out monsite.fr.cert.pem -infiles monsite.fr.csr.pem
Using configuration from ../openssl.cnf
Enter pass phrase for /srv/ssl/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: Jan 23 09:34:35 2018 GMT
            Not After : Jan 23 09:34:35 2019 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = France
            localityName              = Paris
            organizationName          = Mon organisation
            organizationalUnitName    = 
            commonName                = monsite.fr
            emailAddress              = pointal@truc.fr
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                44:2C:5F:39:94:FA:DA:1F:1D:F6:74:E0:3A:3C:CF:9D:B2:90:45:0F
            X509v3 Authority Key Identifier: 
                keyid:D5:58:B3:DF:12:40:2C:41:18:F5:36:22:F9:C9:88:20:59:46:8E:5F
            X509v3 Subject Alternative Name: 
                DNS:monsite.fr
            X509v3 Key Usage: 
                Digital Signature, Non Repudiation, Key Encipherment
Certificate is to be certified until Jan 23 09:34:35 2019 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

3. Configuration de Apache

3.1 Activation du mode SSL de Apache

$ sudo a2enmod ssl

3.2 Enregistrement du site sur Apache

Il suffit de créer un nouveau site parmi ceux enregistrés dans /etc/apache2/sites-available qui écoute le port 443

On indiquera dans le ficher l'adresse du certificat et de la clé

$ sudo gedit /etc/apache2/sites-available/monsite.fr-ssl.conf

<VirtualHost *:443>  
    ServerName monsite.fr  
    DocumentRoot /var/www/monsite.fr 
    SSLEngine On
    SSLCertificateFile /srv/ssl/monsite.fr/monsite.fr.cert.pem
    SSLCertificateKeyFile /srv/ssl/monsite.fr/monsite.fr.key.nopass.pem
    SSLProtocol all -SSLv2 
    <Directory />    
        Options FollowSymLinks  
        AllowOverride All  
    </Directory>  
    <Directory /var/www/monsite.fr>  
        Options Indexes FollowSymLinks MultiViews  
        AllowOverride All  
        Order allow,deny  
        allow from all  
    </Directory>  
</VirtualHost>

Il faut ensuite activer le site et redémarrer Apache

$ sudo a2ensite monsite.fr-ssl
$ sudo service apache2 restart

Et enfin, on peut accéder au site [ https://monsite.fr](https://monsite.fr), en acceptant une exception de sécurité.


Contact
Elisabeth Pointal
elisabeth.pointal@free.fr
CV
Page perso