Utiliser des certificats de la CaCert avec Nginx

Note: Ce tutoriel fait suite à un autre tutoriel posté il y a quelques années sur ce blog. N’hésitez donc pas à lire « Signez vos certificats avec la CaCert » avant de vous lancer dans celui-ci!

Après avoir installé et configuré votre serveur web Nginx, vous vous dites que chiffrer la connexion entre votre serveur et votre ordinateur serait une bonne solution pour protéger vos mots de passes des méchants pirates, surtout si vous vous connectez depuis des connexions internet partagées avec des inconnus (que ce soit dans un lieu public, à votre travail, et même chez vous). C’est ce que nous allons voir à travers ce petit tutoriel.

Organiser ses certificats

Pour nous y retrouver plus facilement, je vous propose de regrouper tous vos certificats dans un seul et même dossier. Nous allons donc commencer par copier les trois fichiers certificat.pem, certificat_csr.pem et certificat_privatekey.pem dans le dossier /etc/nginx/ssl. Pour ce faire, déplacez-vous dans le dossier contenant vos certificats (/root/nom_certificat si vous avez suivi mon précédent tutoriel), et entrez la commande suivante:

cp * /etc/nginx/ssl

Créer un fichier CRT racine

Nginx a beau être un excellent serveur web, il possède une énorme lacune. En effet, contrairement à Apache, il ne supporte pas l’utilisation de certificats racine, pourtant nécessaire à la bonne authentification de la connexion par le navigateur.

Pour passer outre ce problème, nous allons devoir générer un fichier CRT, fruit de la fusion de notre fichier certificat.pem et du fichier racine de la CaCert. Pour ce faire, exécutez simplement la ligne suivante dans votre terminal, qui s’occupe de concaténer (via la commande cat) les deux fichiers dans un troisième, appelé certificat_crt.pem (grâce à l’opérateur >):

cat certificat.pem /etc/ssl/certs/cacert.org.pem > certificat_crt.pem

Une fois ceci fait, nous allons pouvoir configurer Nginx pour qu’il utilise notre certificat.

Configurer ses domaines

Une fois nos certificats générés et prêts à être utilisés, nous pouvons passer à la seconde partie: l’intégration de ces certificats dans Nginx. Ici, nous allons nous intéresser à deux situations possibles:

  1. Vous souhaitez que votre site soit accessible à la vois via son adresse en http:// et en https://
  2. Vous souhaitez que votre site ne soit accessible que via son adresse en https://, et que son adresse en http:// vous redirige vers elle

Dans les deux cas, vous allez devoir éditer les fichiers de configuration présent dans le dossier /etc/nginx/sites-enabled. Pour ce faire, vous pouvez utiliser un éditeur en mode console, comme nano ou vim.

Première situation

Dans cette situation, l’utilisateur aura le choix entre surfer sur http://votresite.com/ ou sur https://votresite.com/. Cela peut être utile dans le cas d’un petit site web/blog, qui ne nécessite pas toujours d’entrer des informations dites « sensibles » (mots de passe, numéro de carte bancaire, etc.).

Dans chaque fichier de configuration, repérez ces deux lignes:

server {
    listen 80;

[...]

et modifiez-les en suivant mon exemple commenté (un commentaire commence par un dièse et ne sera pas pris en compte par Nginx). Les lignes ajoutées sont surlignées:

server {
    listen 80; # On garde la connexion non sécurisée sur le port 80
    listen 443 ssl; # Et on ajoute une connexion chiffrée (notez le « ssl ») sur le port 443, qui est le port standard pour le protocole https

    ssl_certificate      /etc/nginx/ssl/certificat_crt.pem; # Adresse de notre CRT racine
    ssl_certificate_key  /etc/nginx/ssl/certificat_privatekey.pem; # Adresse de notre clé privée

[...]

Deuxième situation

Dans cette situation, lorsque l’utilisateur entrera http://votresite.com/, il sera automatiquement redirigé vers https://votresite.com/. C’est la solution à adopter si votre site nécessite d’entrer des informations qui peuvent être considérées comme « sensibles ».

Dans chaque fichier de configuration, repérez ces trois lignes:

server {
    listen 80;
    server_name votresite.com;

[...]

et modifiez-les en suivant mon exemple commenté (un commentaire commence par un dièse et ne sera pas pris en compte par Nginx). Les lignes ajoutées sont surlignées:

# Version HTTP : redirection automatique
server {
    listen 80; # Pour le port 80 (http)
    server_name votresite.com; # Et le domaine votresite.com
    return 301 https://$host$request_uri; # On redirige vers la version https
}

# Version HTTPS
server {
    listen 443 ssl; # Pour le port 443 (https)

    ssl_certificate      /etc/nginx/ssl/certificatcrt.pem; # Adresse de notre CRT racine
    ssl_certificate_key  /etc/nginx/ssl/certificatprivatekey.pem; # Adresse de notre clé privée

    server_name votresite.com; # Et le domaine votresite.com

[...]

Le moment de vérité

Une fois ceci fait, il ne vous reste plus qu’à redémarrer Nginx:

service nginx restart

Et voilà. Votre serveur utilise maintenant votre certificat signé par la CaCert. Enjoy!