Mon serveur web NGINX ne sert que du contenu privé protégé par mot de passe, mais si l’accès à ce contenu est protégé, les données qui transitent sur le réseau elles ne le sont pas.

Pour cela il faut mettre en œuvre un chiffrage via https.

Https se base sur un système de clé de cryptage publique/certificat, il existe plusieurs moyen pour obtenir ces fichiers :

J’ai personnellement choisi cette dernière solution.

Dans mon article OpenSSL puissance et complexité, j’ai listé/référencé les étapes et commandes openssl disponible pour créer un certificat.

 

Voici les sujets abordé par cet article :

 

Gestion des certificats manuellement

Préparation de l’environnement

Je vais créer un répertoire myCa dans le /home de mon utilisateur et y placer tout ce qui sera nécessaire à gérer les certificats

cd && mkdir -p myCA/certs && mkdir myCA/private && mkdir myCA/csr && mkdir myCA/newcerts && mkdir myCA/crl && mkdir myCA/tmp && cd myCA
echo '01' > serial  && touch index.txt
cp /etc/ssl/openssl.cnf .

Configuration d’openSSL

On édite ensuite le fichier openssl.cnf copié dans notre répertoire myCA, pour modifier les éléments suivants :

Section [ CA_default ] on paramètre les dossiers, seul la première valeur est à modifier :

dir        = <strong>/home/[utilisateur]/myCA</strong>            # Where everything is kept
certs        = $dir/certs        # Where the issued certs are kept
crl_dir        = $dir/crl        # Where the issued crl are kept
database    = $dir/index.txt    # database index file.
new_certs_dir    = $dir/newcerts        # default place for new certs.
certificate    = $certs/cacert.pem    # The CA certificate
serial        = $dir/serial         # The current serial number
crl        = $dir/crl.pem         # The current CRL
private_key    = $dir/private/cakey.pem # The private key
RANDFILE    = $dir/private/.rand    # private random number file

Un peu plus loin dans cette même section, on paramètre la duré de validité par défaut des certificats et le cryptage utilisé :

default_days    = 1825            # how long to certify for
default_crl_days= 30            # how long before next CRL
default_md    = sha1            # which md to use.

Dans la section [ req_distinguished_name ] j’ai francisé les libellé et adpater les valeurs par défaut :

[ req_distinguished_name ]
 countryName                     = Pays (2 lettres)
 countryName_default             = FR
 countryName_min                 = 2
 countryName_max                 = 2
 stateOrProvinceName             = Region
 stateOrProvinceName_default     = PAYS DE LOIRE
 localityName                    = Ville
 localityName_default            = Nantes
 0.organizationName              = Societe
 0.organizationName_default      = VoidAndAny
 #organizationalUnitName         = Organizational Unit Name (eg, section)
 #organizationalUnitName_default =
 commonName                      = Site
 commonName_max                  = 64
 emailAddress                    = Email
 emailAddress_max                = 64
 emailAddress_default            = mon_email@free.fr

Dès lors les questions sont les suivantes et il suffit de les valider par entrée pour avoir les valeurs par défaut (optionnel) :

Pays (2 lettres) [FR]:
Region [PAYS DE LOIRE]:
Ville [Nantes]:
Societe [VoidAndAny]:
Site []: mon_domaine.fr
Email [mon_email@free.fr]:

Dans la section [ usr_cert ] j’ai modifié les commentaire qui seront embarqués dans les certificats :

nsComment            = "Void And Any Generated Certificate"

Création de l’autorité de certification

On va tout d’abord créer notre autorité de certification qui permettra de signer les certificats serveurs suivant.

Cela se fait avec la commande (se placer dans le répertoire myCA) :

openssl req -new -x509 -config ./openssl.cnf -keyout ./private/cakey.pem -out ./certs/cacert.pem -days 1825

Lors de la génération du certificat un mot de passe vous est demandé, en choisir un robuste et ne pas l’oublier sous peine de ne plus pouvoir vous servir de votre autorisé de certification.

Création du/des certificats

En 2 temps, création de la clé et de la demande de certificat :

openssl req -new -keyout ./private/mondomaine.key -out ./csr/mondomaine.csr -config ./openssl.cnf -nodes -days 1825

L’option -nodes permet d’indiquer que la clé qui doit être générée ne doit pas être protégée par un mot de passe (passphrase)

 

La commande vous poseras quelques questions :

Generating a 2048 bit RSA private key
 .............+++
 ............................+++
 writing new private key to '/etc/nginx/certificates/test.key'
 -----
 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) [AU]:FR
 State or Province Name (full name) [Some-State]:PAYS DE LOIRE
 Locality Name (eg, city) []:Nantes
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:VoidAndAny
 Organizational Unit Name (eg, section) []:
 Common Name (eg, YOUR name) []:mon_domaine.fr
 Email Address []:mon_email@free.fr

La zone la plus importante est « Common name » qui doit correspondre au nom du domaine/sous-domaine que vous voulez protéger.

 

Création du certificat à partir de la demande de certificat et signature de ce dernier avec notre autorité de certification :

openssl ca -infiles ./csr/mondomaine.csr -out ./certs/mondomaine.crt -config ./openssl.cnf

Les certificat et sa clé sont alors respectivement dans les sous-répertoires certs et private.

 

Voila pour la création manuelle voici comment automatiser tout cela et ne pas avoir de ligne de commande à taper.

 

Gestion des certificats avec easyCA

EasyCA est un script qui n’est plus maintenu depuis 2005 et que l’on peut retrouver ICI, personnellement j’ai utilisé la version modifiée de GuiguiAbloc que l’on trouve ICI

Je vais comme précédemment faire du répertoire myCA de mon home le lieu de travail. (si vous avez fait des essais manuellement il peut être conseillé de tout supprimer le contenu du dit répertoire ou d’en utiliser un autre)

Télécharger l’archive, la décompresser et rendre le script exécutable :

mkdir -p ~/myCA && cd ~/myCA
wget http://guiguiabloc.appspot.com/wp-content/2008/12/easyca.tgz
tar -xvf easyca.tgz
mv easyca/* .
chmod 755 easyCA.sh

Éditer le fichier openssl.cnf fournis, modifier les lignes préalablement décrites et supprimer la ligne :

# !!!!! remove this line after configuration as it is NOT_CONFIGURED yet !!!

Rque : j’ai en plus changé les différents paramètres nsComment en fin de fichier.

Lancer le script easyCA.sh, le menu suivant apparaît :

=====================================================================
 Certificate Management System
 easyCA version 0.9(6) by Ferry Kemps and Guiguiabloc
 GPL Licensed
 =====================================================================
 
 1) Sign a Certificate Signing Request (PKCS#10)
 2) Create a Server Certificate (PEM SelfSigned)
 3) Create a Client Certificate (PKCS#12)
 4) Create a Certificate Signing Request
 5) Generate Certificate Revocation List (CRL)
 6) List, Display and Revoke Certificates
 
 I) Initialize Root Certificate Authority (CA)
 O) Initialize OCSP Server Certificate
 B) Backup & Restore the Certificate environment
 R) Reinstall easyCA (erase)
 
==> Make your choice [none]:

(dans les « copie d’écran » suivante je n’ai pas personnalisé mon openssl.cnf, d’où les localité, adresse mail par défaut)

Création de l’autorité de certification

Pour créer l’autorité de certification il suffit de choisir l’option I :

-----------------------------------------------------------------------
 ----------------- Initialize root Certificate Authority ---------------
 -----------------------------------------------------------------------
 
Are you sure you want to (re)initialize the Root CA? [y|n]: y
 >>> Initializing Root CA <<<
 Generating a 1024 bit RSA private key
 ...................++++++
 .............................................++++++
 writing new private key to './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) [NL]:
 State or Province Name (full name) [Gelderland]:
 Locality Name (eg, city) [Arnhem]:
 Organization Name (eg, company) [Your Company Name]:
 Organizational Unit Name (eg, section) [HQ]:
 Common Name (eg, your name or your server's hostname) []:
 Email Address [postmaster@domain.ext]:
 
Press [enter] to continue

Comme dans le paragraphe précédent il faut choisir une passphrase sécurisé et ne pas l’oublier. Le Common Name n’a que peut d’importance ici.

Création du/des certificats

Pour générer un certificat serveur, il faut procéder en 2 temps, la demande de certificat, option 4 du menu :

-----------------------------------------------------------------------
 --------------- Generate Certificate Signing Request ------------------
 -----------------------------------------------------------------------
 
Enter Certificate CN (Common name|FQDN) like www.example.com [none]: mondomaine
 Generating a 1024 bit RSA private key
 ..................++++++
 .......++++++
 writing new private key to './private/mondomaine-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) [NL]:
 State or Province Name (full name) [Gelderland]:
 Locality Name (eg, city) [Arnhem]:
 Organization Name (eg, company) [Your Company Name]:
 Organizational Unit Name (eg, section) [HQ]:
 Common Name (eg, your name or your server's hostname) []:mondomaine.fr
 Email Address [postmaster@domain.ext]:
 
Please enter the following 'extra' attributes
 to be sent with your certificate request
 A challenge password []:
 An optional company name []:
 
Certificate Signing Request (CSR) stored as: ./csr/mondomaine.csr
 Certificate private-key stored as: ./private/mondomaine-key.pem
 Press [enter] to continue

La première question (Enter Certificate CN (Common name|FQDN) like www.example.com [none]:) ne sert pas à alimenter le common name du certificat mais a déterminer le nom des fichier certificat et clé.

A la question common name, il faut ici indiquer le domaine sur lequel s’appliquera la certificat sous peine d’avoir des avertissement de sécurité dans les navigateurs.

 

2ème étape obtenir le certificat et le signer , option 1 du menu :

-----------------------------------------------------------------------
 --------------- Certifiace Signing Request handling -------------------
 -----------------------------------------------------------------------
 
(CSR request files should be copied into directory: ./csr)
 
1: mondomaine.csr
 
==> Select the CSR to sign [none]: 1
 
==> Add OCSP Extension to Certificate ? [y/N]: N
 
==> Select the Usage Key [server|client|none]: server
 Using configuration from ./openssl.cnf
 Enter pass phrase for ./private/cakey.pem:
 Check that the request matches the signature
 Signature ok
 Certificate Details:
 Serial Number: 1 (0x1)
 
...
 
 Certificate is to be certified until Jun 19 18:36:00 2016 GMT (1825 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 stored as: ./certs/mondomaine.crt
 Return this certificate to the requesting party.
 
Display Certificate? y/n [n] n

On sélectionne les demande de certificat en cours (il peut y en avoir plusieurs), on indique le rôle du certificat à générer (server), on saisi le mot de passe de l’autorité de certification et voila…

L’utilisation de easyCA est quand même beaucoup plus simple que de se taper les lignes de commande….

 

Pour info voici les commandes par easyCA  qui sont lancées pour les 3 étapes décrites ci-dessus :

openssl req -new -x509 -config ./openssl.cnf -keyout ./private/cakey.pem -out ./certs/cacert.pem -days 1825
 
openssl req -new -nodes -config ./openssl.cnf -days 1825 -keyout ./private/mondomaine-key.pem -out ./csr/mondomaine.csr
 
openssl ca -config ./openssl.cnf -cert ./certs/cacert.pem -extensions  SERVEUR -in ./csr/mondomaine.csr -out ./certs/mondomaine.crt

Elle très très semblables à celles que j’ai décrite dans le premier paragraphe…


Configuration NGINX

Une fois un certificat généré pour votre site que ce soit manuellement ou via easyCA, il faut tout d’abord copier le clé et le dit certificat vers un répertoire qui sera accessible par NGINX.

Dans mon cas j’ai créé un répertoire certificates dans /etc/nginx.

cd ~
sudo cp myCA/certs/mondomaine.crt /etc/nginx/certificates
sudo cp myCA/private/mondomaine-key.pem /etc/nginx/certificates
sudo chown root.root /etc/nginx/certificates/mondomaine-key.pem
sudo chmod 400 /etc/nginx/certificates/mondomaine-key.pem

Il suffit ensuite d’indiquer à NGINX pour le site voulu l’écouter sur le port 443 (au lieu du 80) et l’utilisation du certificat et de la clé privée

server {
    listen               443;
    server_name          mondomaine.fr;

    ssl                  on;
    ssl_certificate      /etc/nginx/certificates/mondomaine.crt;
    ssl_certificate_key  /etc/nginx/certificates/mondomaine-key.fr;

....
  }

Et rediriger le port 443 vers votre serveur…

 

Configuration Firefox

Lorsque vous irez sur votre site pour la première fois vous aurez un message d’avertissement car votre autorité de certification (c’est à dire votre serveur) n’est pas reconnue par le navigateur :

Si on regarde les détail technique on a ceci :

Ou ceci Dans le premeir cas je ne comprend pas très bien l’erreur, peut être est ce d^au fait que j’utilise un certificat joker mais ceci est une autre histoire, dans le 2ème cas on a 2 erreurs, le fait que le certificat est auto-signée et le fait que le common name donnée lors de la création du certification ne correspond pas au domaine sur lequel il a été appliqué.

Dans tous les cas pour passer outre il suffit d’importer le certificat racine publique de notre autorité de certification.

Il faut donc diffuser, copier le fichier cacert.pem contenu dans le répertoire certs sur votre serveur sur les machine clientes. ATTENTION il ne faut surtout pas diffuser la clé privé cakey.pem

 

Ensuite sur les machines clientes dans Firefox aller dans le menu « Avancé » sur l’onglet « Chiffrement » et cliquer sur « Afficher les certificats » :

Dans l’onglet « Autorités » cliquer sur « Importer… » et sélectionner votre fichier (cacert.pem)

Sélectionner l’usage que vous souhaitez faire du certificat « identifier des sites web » :

Votre autorité de certification est désormais reconnue :

Et la page devrait s’afficher sans problème.

 

Dans IE il faut aller dans Option Internet > Onglet Contenu > Bouton Certificats, puis onglet Autorités principales de confiance > Bouton Importer

 

Sources :

Gestion des certificats :

Configuration NGINX :

Autre :

Les commentaires sont fermés.