Obtenir un certificat SSL signé gratuitement (Let’s Encrypt) sans toucher au serveur web principal

Bien d’entre vous ont déjà entendu parler du projet Let’s Encrypt ayant pour unique but de favoriser la cryptographie de bout en bout (HTTPS) sur la majorité des sites internet. Sauf que pour mettre en place Let’s Encrypt sur un site quelconque il faut qu’il accepte les fichiers temporaires dans un répertoire ou d’utiliser une redirection ou de développer un bout de code à côté mais ces méthodes ne sont pas toujours très favorables lorsqu’on possède de multiples domaines sous différentes technologies ou bien qu’on n’a pas nécessairement envie de toucher à sa configuration actuelle qui marche du tonnerre.

Explication du procédé

Pour en venir à nos fins nous utiliserons Haproxy qui est un répartiteur de charges. Celui-ci permettra de rerouter les requêtes de validation de domaine de Let’s Encrypt vers un serveur web en particulier et qu’un visiteur lambda soit redirigé vers le serveur web principal.

Pré-requis

  • Tout type de serveur Web (Apache, nginx, etc).
  • Le serveur web devra être associé avec un certificat SSL (auto) signé.
    Note : Même si Let’s Encrypt propose la vérification via HTTP (80), uniquement la méthode la plus sécurisée vous sera proposée (via le port 443).
  • Python 2.7.x : permettant de stocker les fichiers d’un répertoire.

Remarque : En suivant cet article, je ne pourrai-vous garantir 0 down time. Néanmoins si vous lisez puis suivez le tutoriel après seconde lecture, le temps estimé pour mettre en place le procédé sera assez court.

1 – Installation de Haproxy

Le programme est disponible en version stable sur la majorité des distributions, utilisez votre gestionnaire de paquets par défaut pour l’installer.

Note pour Debian et dérivés

Il est possible d’obtenir une version supérieure à celle proposée dans les dépôts officiels de Debian : haproxy.debian.net.

2 – Configuration de Haproxy

  1. Éditez le fichier /etc/haproxy/haproxy.cfg.
  2. Ajoutez les lignes suivantes au fichier préexistant :
    frontend https
        log global
        mode tcp
        option tcplog
        option forwardfor
        bind *:443
    
        # wait up to 5 seconds from the time the tcp socket opens
        # until the hello packet comes in (otherwise fallthru to the default)
        tcp-request inspect-delay 5s
        tcp-request content accept if { req.ssl_hello_type 1 }
    
        # wildcard match all SNI servernames for *.acme.invalid
        acl app_letsencrypt req.ssl_sni -m end .acme.invalid
        use_backend server_letsencrypt if app_letsencrypt
    
        # send everything that doesn't match *.acme.invalid to the default
        default_backend server_default
    
    backend server_letsencrypt
        log global
        mode tcp
        option tcplog
    
        # all letsencrypt traffic goes to 63443 locally
        server app_letsencrypt 127.0.0.1:63443
    
    backend server_default
        log global
        mode tcp
        option tcplog
    
        # all normal traffic goes to 8443 locally
        server server_default 127.0.0.1:8443 check
  3. Sauvegardez le fichier.

3 – Configuration du serveur web principal

Note : Ceci s’applique uniquement à votre serveur web principal qui avant gérait la partie publique de vos sites web.

Changez le port d’écoute de votre serveur web principal par le port 8443 :

  • Apache
  • Nginx
  • Pour tout autre serveur web, référez-vous à la documentation de celui-ci.

4 – Mise en production du procédé

  1. Relancez votre serveur web.
  2. Redémarrez haproxy au moyen de votre gestionnaire de services favoris (init, systemd, etc) :
    • Init :
      service haproxy restart
    • Systemd :
      systemctl restart haproxy
  3. Vérifiez une page aléatoire de votre site web pour s’assurer que la configuration fonctionne parfaitement.

5 – Configuration et vérification de Let’s Encrypt

I – Configuration et première exécution de Let’s Encrypt

  1. Clonez le dépôt de Let’s Encrypt :
    git clone https://github.com/letsencrypt/letsencrypt.git /etc/ssl/letsencrypt
  2. Créez un nouveau script nommé generate.bash dans le dossier /etc/ssl/letsencrypt :
  3. nano /etc/ssl/letsencrypt/generate.bash
  4. Dans le contenu de ce fichier placez-y le texte suivant :
    /etc/ssl/letsencrypt/letsencrypt-auto --config /etc/ssl/letsencrypt/cli.ini \
     --standalone-supported-challenges tls-sni-01 \
     --tls-sni-01-port 63443 \
    certonly
  5. Créez ensuite un fichier cli.ini dans le dossier /etc/ssl/letsencrypt contenant toutes les informations relatives à la création du certificat :
    nano /etc/ssl/letsencrypt/cli.ini
  6. Dans ce fichier copiez collez le contenu suivant en remplissant la ligne domains par les noms de domaines que vous souhaitez obtenir un certificat et en ajoutant à la ligne email votre adresse email :
    rsa-key-size = 4096
    server = https://acme-v01.api.letsencrypt.org/directory
    text = True
    domains = exemple.com, www.exemple.com, exemple.exemple.com
    agree-tos = True
    renew-by-default = True
    email = [email protected]
  7. Exécutez le script permettant de générer le certificat :
    bash /etc/ssl/letsencrypt/generate.bash

II – Configuration du serveur web pour utiliser les certificats de Let’s Encrypt

A la fin de la génération du certificat, Let’s Encrypt vous fournira le chemin absolu du certificat :

Chemin absolu certificat

Il vous suffit simplement de l’incorporer dans la configuration de votre serveur web muni de la clé disposant le même chemin sous le nom de privkey.pem.

Exemple de chemin pour certificat et clé privée :

  • Certificat : 
    /etc/letsencrypt/live/exemple.com/fullchain.pem
  • Clé privée : 
    /etc/letsencrypt/live/exemple.com/privkey.pem

III – Mise en place d’une tâche cron pour renouvellement automatique du certificat

Ajout d’une entrée dans crontab pour l’exécution automatique du script generate.bash :

  1. Exécutez la commande :
    crontab -e
  2. Ajoutez l’entrée suivante :
    10 1 */9 * * sleep 704s ; bash /etc/ssl/letsencrypt/generate.bash
  3. Sauvegardez le fichier.

6 (Facultatif) – Préserver de l’adresse IP du visiteur

Etant donné que Haproxy ne fournit pas par défaut les adresses IP des visiteurs de votre site web à votre serveur web, il vous faudra configurer celui-ci et votre serveur web pour qu’ils communiquent via le protocole proxy ou une autre méthode (voire fin).

I – Configuration de Haproxy en proxy protocol

  1. Éditez le fichier /etc/haproxy/haproxy.cfg.
  2. A la dernière ligne ajoutez l’argument send-proxy après check :
    server server_default 127.0.0.1:8443 check send-proxy
  3. Sauvegardez le fichier et redémarrez haproxy.

II – Configuration du serveur web principal en proxy procotol

La configuration de chaque serveur web diffère de chacun, par contre certains serveurs web peu populaires n’incluent aucune option pour ce protocole.

Néanmoins voici une liste non exhaustive pour les serveurs web les plus populaires :

Note – Si votre serveur web ne propose pas le proxy protocol

Référez-vous à d’autres moyens permettant de préserver l’IP du client via ce gist Github et Google.

Source : https://coolaj86.com/articles/lets-encrypt-with-haproxy/

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.