<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" ><channel><title>Kévin Subileau &#187; apache</title> <atom:link href="http://www.kevinsubileau.fr/tag/apache/feed" rel="self" type="application/rss+xml" /><link>http://www.kevinsubileau.fr</link> <description>Espace personnel</description> <lastBuildDate>Sun, 02 Feb 2020 15:18:58 +0000</lastBuildDate> <language>fr-FR</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <item><title>Let&#039;s Encrypt - Installation manuelle et sécurisée sur Apache</title><link>http://www.kevinsubileau.fr/informatique/astuces-tutoriels/lets-encrypt-installation-manuelle-vps-apache.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link> <comments>http://www.kevinsubileau.fr/informatique/astuces-tutoriels/lets-encrypt-installation-manuelle-vps-apache.html#comments</comments> <pubDate>Wed, 25 May 2016 18:30:40 +0000</pubDate> <dc:creator>Kévin Subileau</dc:creator> <category><![CDATA[Astuces et Tutoriels]]></category> <category><![CDATA[apache]]></category> <category><![CDATA[debian]]></category> <category><![CDATA[Let's Encrypt]]></category><guid isPermaLink="false">http://www.kevinsubileau.fr/?p=2216</guid> <description><![CDATA[Voici ma méthode pour mettre en place manuellement et renouveler automatiquement un certificat Let's Encrypt sur un VPS avec Apache, en utilisant le script acme-tiny plutôt que le client officiel. <a href="http://www.kevinsubileau.fr/informatique/astuces-tutoriels/lets-encrypt-installation-manuelle-vps-apache.html">Lire la Suite <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p><strong>Let's Encrypt</strong> est une nouvelle autorité de certification qui délivre <strong>des certificats SSL gratuits</strong>. Oui, j'ai bien dit gratuit, là où auparavant il fallait parfois débourser jusqu'à une centaine d'euros par an pour un certificat !</p><p>Mais désormais, il n'y a plus aucune raison pour ne pas laisser tomber son certificat auto-signé et <strong>mettre en place le HTTPS avec un véritable certificat SSL</strong>, certifié par une autorité, et qui n'affichera donc pas dans les navigateurs une page d'alerte qui ferait fuir vos visiteurs.</p><p>Dans cet article, je vais donc vous présenter la méthode que j'ai utilisée pour <strong>mettre en place un certificat SSL gratuit de Let's Encrypt</strong> sur mon VPS.</p><p>Le <a title="Let' Encrypt" href="https://letsencrypt.org/">site de Let's Encrypt</a> suggère pour cela d'utiliser le client Python officiel, totalement automatisé. Mais personnellement, je ne suis <strong>pas très fan de l'idée qu'un script</strong>, dont j'ignore le contenu, <strong>s’exécute automatiquement avec les permissions <em>root</em></strong>, manipule des fichiers de configurations sensibles (tel que ceux d'Apache), et contrôle la sécurité de mon serveur Web.</p><p>De plus, le script officiel requiert selon moi beaucoup <strong>trop de dépendances à installer</strong>, et propose <strong>trop de fonctionnalités</strong> par rapport à ce qui m'est réellement utile. Je suis en effet totalement capable de faire l'installation et la configuration initiale moi-même, manuellement. Je n'ai besoin d'un script que pour <strong>renouveler automatiquement le certificat</strong>, rien de plus.</p><p>Je suis donc parti à la recherche d'<strong>une solution alternative pour obtenir un certificat Let's Encrypt</strong>, et je suis finalement tombé sur <a href="https://github.com/diafygi/acme-tiny">acme-tiny</a>. C'est un script de <strong>seulement 200 lignes</strong>, que j'ai donc pu facilement analyser pour vérifier qu'il ne comportait rien de malveillant, et qui n'a besoin que de Python, quelques modules de base et la commande <code>openssl</code> pour fonctionner. Le plus souvent, tout ceci est déjà présent sur une configuration classique.</p><p>La méthode proposée ci dessous est adaptée pour <strong>obtenir une sécurité optimale sur un serveur Debian</strong> Wheezy ou Jessie, avec <strong>Apache</strong> 2.2 ou 2.4.10, et OpenSSL 1.0.1. Il est toutefois important que vous compreniez ce que vous faites et que vous ajustiez la configuration proposée selon votre système et vos besoins.<br /> <span id="more-2216"></span></p><h2>Préparation du serveur</h2><h3>Vérification des prérequis</h3><p>On commence par quelques petites vérifications et préparations sur le serveur. Tout d'abord, on s'assure que Python 2.7.x est bien installé en utilisant la commande suivante :</p><pre class="brush: bash; gutter: false">python --version</pre><p>Si vous obtenez un message <em>command not found</em>, il vous faudra passer par la case installation de Python avant de poursuivre.</p><p>Profitez en également pour récupérer la version d'Apache et d'OpenSSL installée sur votre système respectivement avec les commandes ci-dessous :</p><pre class="brush: bash; gutter: false">sudo apache2ctl -v
openssl version</pre><h3>Création d'un utilisateur dédié</h3><p>A partir de ce point, je vous conseille de passer une bonne fois pour toute en <em>root</em>, car la plupart des commandes qui vont suivre vont nécessiter ces permissions pour fonctionner. Pour cela, vous pouvez utiliser la commande <code>sudo -i</code>.</p><p>On va maintenant <strong>créer un utilisateur <code>letsencrypt</code></strong>, auquel on attribuera le strict minimum de permissions pour pouvoir créer et renouveler des certificats. Cet utilisateur sera responsable de l'exécution du script de renouvellement automatique, que nous verrons plus bas. Ainsi, <strong>ce script ne s'exécutera pas en <em>root</em></strong> et ne pourra pas modifier accidentellement des fichiers importants du système. On créé également un dossier pour contenir tous les fichiers associés à Let's Encrypt :</p><pre class="brush: bash; gutter: false">mkdir /etc/letsencrypt
adduser --system --home /etc/letsencrypt --no-create-home --disabled-login \
    --disabled-password --group letsencrypt</pre><p>On créé ensuite un ensemble de sous-dossiers pour bien ranger les choses :</p><ul><li><em><strong>bin</strong> </em>: Dossier stockant les scripts <em>acme-tiny</em> et de renouvellement automatique.</li><li><em><strong>certs</strong> </em>: Contiendra les certificats, rangés par date d'obtention dans un sous-dossier <em><strong>archive</strong></em>, avec un lien symbolique <em><strong>live</strong></em> pointant vers le dossier contenant les certificats actuellement utilisés.</li><li><em><strong>private</strong> </em>: Les clés privées, ne devant absolument pas être divulguées, seront dans ce dossier avec le minimum de permissions.</li><li><em><strong>challenges</strong></em> : Ce dossier sera utilisé pour déposer les fichiers temporaires nécessaires pour valider votre demande de certificats.</li></ul><p>Voici les commandes à lancer pour créer tous ces dossiers :</p><pre class="brush: bash; gutter: false">cd ~letsencrypt
mkdir -p ~letsencrypt/{bin,certs/archive/$(date --utc +&#039;%FT%TZ&#039;),private,challenges}</pre><p>Sans plus attendre, on ajuste quelques permissions sur les dossiers que l'on vient de créer :</p><pre class="brush: bash; gutter: false">chown -R letsencrypt:letsencrypt ~letsencrypt
chown letsencrypt:www-data ~letsencrypt/challenges

chmod 755 ~letsencrypt
chmod -R 775 ~letsencrypt/certs
chmod 750 ~letsencrypt/{bin,private,challenges}</pre><p>Ensuite, on créé le lien symbolique pointant vers le dossier des certificats en cours d'usage. L'intérêt de ce lien est qu'ainsi <strong>le script de renouvellement ne modifiera pas directement les fichiers en production</strong>. Il créera plutôt un nouveau dossier, où il préparera tout le nécessaire, et ne redirigera le lien qu'une fois terminé et en l'absence d'erreur.</p><pre class="brush: bash; gutter: false">ln -s archive/$(date --utc +&#039;%FT%TZ&#039;) ~letsencrypt/certs/live</pre><h3>Autoriser l'utilisateur <code>letsencrypt</code> à redémarrer Apache</h3><p>Lors du renouvellement automatique du certificat, <strong>le script doit être en mesure de pouvoir redémarrer Apache</strong> afin que le nouveau certificat soit pris en compte. Pour cela, on va autoriser l'utilisateur <code>letsencrypt</code> à faire un <code>sudo</code> sans mot de passe, mais seulement sur la commande permettant de redémarrer Apache.</p><p>Pour cela, on créé et on édite un nouveau fichier <em>sudoers</em> avec la commande ci-dessous :</p><pre class="brush: bash; gutter: false">visudo -f /etc/sudoers.d/letsencrypt-apache2ctl-graceful</pre><p>Dans ce nouveau fichier, on écrit le contenu suivant :</p><pre class="brush: bash; gutter: false">letsencrypt ALL=NOPASSWD: /usr/sbin/apache2ctl graceful</pre><p>Ainsi, l’utilisateur <code>letsencrypt</code>, et donc le script de renouvellement, peut désormais lancer la commande <code>sudo apache2ctl graceful</code> sans mot de passe.</p><h3>Téléchargement du script <code>acme-tiny</code></h3><p>On termine l'étape de préparation du serveur en récupérant une copie du script <code>acme-tiny</code> permettant d'obtenir le certificat Let's Encrypt avec la commande suivante :</p><pre class="brush: bash; gutter: false">wget -O ~letsencrypt/bin/acme_tiny.py https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py</pre><h2>Préparation de Apache</h2><p>Durant le processus d'obtention du certificat, il faut prouver à Let's Encrypt que l'on a bien le contrôle administratif du domaine pour lequel on fait la demande. Pour cela, Let's Encrypt va nous demander d'héberger temporairement un fichier particulier à une adresse précise.</p><p>Ce fichier sera déposé par le script <code>acme-tiny</code> dans le dossier <code>/etc/letsencrypt/challenges</code>, qui doit être accessible par le web à l'adresse <code>http://mondomaine.fr/.well-known/acme-challenge</code>.</p><p>Pour cela, il est nécessaire de <strong>modifier quelque peu la configuration d'Apache</strong>, selon la version que vous utilisez.</p><h3>Apache 2.4</h3><p>Pour Apache 2.4, on commence par<strong> créer un nouveau fichier de configuration</strong> :</p><pre class="brush: bash; gutter: false">vi /etc/apache2/conf-available/letsencrypt.conf</pre><p>Dans celui-ci, on écrit le contenu suivant :</p><pre class="brush: bash; gutter: false">Alias &quot;/.well-known/acme-challenge&quot; &quot;/etc/letsencrypt/challenges&quot;

# Retourne un code 404 plutot que Forbidden lorsque l&#039;on tente d&#039;acceder au dossier
RedirectMatch 404 ^/.well-known/acme-challenge(/$|$)

&lt;Directory &quot;/etc/letsencrypt/challenges&quot;&gt;
    Options None
    AllowOverride None
    Require all granted

    &lt;IfModule mod_headers.c&gt;
        Header set Content-Type &quot;application/jose+json&quot;
    &lt;/IfModule&gt;
&lt;/Directory&gt;</pre><p>On active ensuite cette nouvelle configuration avec les commandes ci-dessous :</p><pre class="brush: bash; gutter: false">a2enconf letsencrypt
apache2ctl graceful</pre><h3>Apache 2.2</h3><p>Sur Apache 2.2, on <strong>créé un nouveau fichier de configuration</strong> global :</p><pre class="brush: bash; gutter: false">vi /etc/apache2/conf.d/letsencrypt</pre><p>Dans ce dernier, on dispose le contenu suivant :</p><pre class="brush: bash; gutter: false">Alias &quot;/.well-known/acme-challenge&quot; &quot;/etc/letsencrypt/challenges&quot;

# Retourne un code 404 plutot que Forbidden lorsque l&#039;on tente d&#039;acceder au dossier
RedirectMatch 404 ^/.well-known/acme-challenge(/$|$)

&lt;Directory &quot;/etc/letsencrypt/challenges&quot;&gt;
    Options None
    AllowOverride None
    Order allow,deny
    Allow from all

    &lt;IfModule mod_headers.c&gt;
        Header set Content-Type &quot;application/jose+json&quot;
    &lt;/IfModule&gt;
&lt;/Directory&gt;</pre><p>Puis on <strong>redémarre le serveur Apache</strong> pour prendre en compte les changements :</p><pre class="brush: text; gutter: false">apache2ctl graceful</pre><h3>Vérification de l'accessibilité du dossier</h3><p>Une fois la configuration d'Apache appliquée, on peut ensuite vérifier que <strong>le dossier de challenge est bien accessible sur le Web</strong>. Pour cela, créez un fichier de test à l'intérieur :</p><pre class="brush: text; gutter: false">echo &quot;Hello World&quot; &gt; ~letsencrypt/challenges/test.txt</pre><p>Assurez-vous ensuite que vous pouvez <strong>récupérer ce fichier depuis un navigateur Web</strong> à l'adresse <code>http://mondomaine.fr/.well-known/acme-challenge/test.txt</code> (en remplaçant évidemment par votre propre nom de domaine). Si ce n'est pas le cas, vérifiez la configuration. Sinon, vous pouvez supprimer le fichier de test et passer à la suite :</p><pre class="brush: text; gutter: false">rm ~letsencrypt/challenges/test.txt</pre><h2>Installation de Let's Encrypt</h2><h3>Création des clés</h3><p>L'étape suivante consiste à <strong>générer un ensemble de clés et de fichiers</strong> nécessaires à Let's Encrypt pour vous authentifier et générer le certificat. En effet, il n'est <strong>pas nécessaire d'ouvrir un compte</strong> ni même de fournir des informations personnelles pour obtenir un certificat auprès de ce service. Let's Encrypt demande seulement une <strong>clé utilisateur </strong>pour vous reconnaître.</p><p>On commence donc par créer cette première clé d'une longueur de 4096 bits. Cette clé peut être partagée entre plusieurs serveurs, mais doit toujours rester parfaitement en sécurité.</p><pre class="brush: bash; gutter: false">openssl genrsa 4096 &gt; ~letsencrypt/private/account.key</pre><p>Puis on génère <strong>la clé privée du certificat</strong>. Cette clé doit obligatoirement être différente de la clé utilisateur et doit impérativement être gardée secrète !</p><pre class="brush: bash; gutter: false">openssl genrsa 4096 &gt; ~letsencrypt/private/domain.key</pre><p>On poursuit en créant la <strong>demande de signature de certificat</strong> (CSR), qui sera envoyée à Let's Encrypt par le protocole ACME pour faire générer le certificat. Pour cela, il y a deux possibilités. Soit <strong>votre certificat n'est utilisé que par un seul domaine</strong>, et dans ce cas vous utiliserez la commande suivante, en remplaçant bien sûr <code>mondomaine.fr</code> par votre propre domaine :</p><pre class="brush: bash; gutter: false">openssl req -new -sha256 -key ~letsencrypt/private/domain.key \
    -subj &quot;/CN=mondomaine.fr&quot; &gt; ~letsencrypt/private/domain.csr</pre><p>Soit vous partagez le <strong>même certificat sur plusieurs domaines</strong> (<code>mondomaine.fr</code> et <code>www.mondomaine.fr</code> par exemple), et il vous faut alors utiliser l'extension SAN (Subjet Alternative Names) dans la CSR :</p><pre class="brush: bash; gutter: false">openssl req -new -sha256 -key ~letsencrypt/private/domain.key -subj &quot;/&quot; -reqexts SAN \
    -config &lt;(cat /etc/ssl/openssl.cnf &lt;(printf &quot;[SAN]\nsubjectAltName=DNS:mondomaine.fr,DNS:www.mondomaine.fr&quot;)) &gt; ~letsencrypt/private/domain.csr</pre><p>Vous pouvez alors inclure autant de domaines que vous souhaitez simplement en ajoutant une entrée <code>DNS:autredomaine.fr</code> par domaine.</p><h3>Obtention du certificat</h3><p>Nous y voici enfin, il est temps d'<strong>obtenir ce fameux certificat SSL gratuit</strong> ! Il vous suffit pour cela de lancer la commande suivante :</p><pre class="brush: bash; gutter: false">sudo -u letsencrypt -- python ~letsencrypt/bin/acme_tiny.py \
    --account-key ~letsencrypt/private/account.key --csr ~letsencrypt/private/domain.csr \
    --acme-dir ~letsencrypt/challenges/ &gt; ~letsencrypt/certs/live/signed.crt</pre><p>Si tout se passe bien, vous devriez obtenir un nouveau fichier <em>signed.crt</em>, c'est votre certificat !</p><p>Pour qu'il puisse être utilisé, il faut encore récupérer le <strong>certificat intermédiaire</strong> de Let's Encrypt et construire le <strong>certificat chainé</strong> :</p><pre class="brush: bash; gutter: false">sudo -u letsencrypt -- wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem &gt; ~letsencrypt/certs/live/intermediate.pem
sudo -u letsencrypt -- cat ~letsencrypt/certs/live/signed.crt ~letsencrypt/certs/live/intermediate.pem &gt; ~letsencrypt/certs/live/chained.pem</pre><h3>Installation du certificat sur Apache</h3><p>L'étape suivante consiste à <strong>configurer Apache afin d'utiliser les certificats</strong> fraîchement obtenus.</p><p>Je vous propose ci-dessous un <strong>exemple de configuration</strong>, libre à vous de l'ajuster en fonction de vos besoins, du niveau de sécurité souhaité et de la compatibilité nécessaire avec les navigateurs de vos visiteurs. Vous pouvez vous aider pour cela du <a href="https://mozilla.github.io/server-side-tls/ssl-config-generator/">générateur de configuration proposé par Mozilla</a>.</p><p>Si vous souhaitez en savoir plus sur la configuration SSL avancée sur Apache, je vous conseille les pages suivantes (en anglais) :</p><ul><li><a title="Strong SSL Security on Apache 2" href="https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html">Strong SSL Security on Apache 2</a></li><li><a title="Hardening Your Web Server's SSL Ciphers" href="https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/">Hardening Your Web Server's SSL Ciphers</a></li><li><a title="Server Side TLS" href="https://wiki.mozilla.org/Security/Server_Side_TLS">Mozilla Wiki : Server Side TLS</a></li></ul><h4>Apache 2.4</h4><p>Sur Apache 2.4, il faut modifier le fichier <code>/etc/apache2/mods-available/ssl.conf</code> afin d'y insérer les directives suivantes :</p><pre class="brush: bash; gutter: false">SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder     on
SSLProtocol             all -SSLv3
SSLCompression          off
SSLSessionTickets       off

# OCSP Stapling
SSLUseStapling          on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache        shmcb:/var/run/ocsp(128000)</pre><p>Puis, pour chaque <em>virtual host</em>, il faut ajouter les lignes suivantes dans le fichier de configuration situé sous <code>/etc/apache2/site-available/</code> :</p><pre class="brush: bash; gutter: false">&lt;VirtualHost *:443&gt;
    ...
    SSLEngine on
    SSLCertificateFile      /etc/letsencrypt/certs/live/chained.pem
    SSLCertificateKeyFile   /etc/letsencrypt/private/domain.key

    ...
&lt;/VirtualHost&gt;</pre><h4>Apache 2.2</h4><p>Pour Apache 2.2, le fichier <code>/etc/apache2/mods-available/ssl.conf</code> devra contenir les lignes suivantes :</p><pre class="brush: bash; gutter: false">SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder on
SSLProtocol all -SSLv3 -SSLv2</pre><p>Ensuite, pour chaque <em>virtual host</em>, on ajoute les lignes de configuration suivantes :</p><pre class="brush: bash; gutter: false">&lt;VirtualHost *:443&gt;
    ...
    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/certs/live/signed.crt
    SSLCertificateKeyFile   /etc/letsencrypt/private/domain.key
    SSLCertificateChainFile /etc/letsencrypt/certs/live/intermediate.pem

    ...
&lt;/VirtualHost</pre><p>Une fois la configuration appliquée, quelle que soit la version d'Apache, il faudra bien sûr lui demander de recharger sa configuration avec la commande <code>apache2ctl graceful</code>.</p><h2>Automatisation du renouvellement</h2><p>Le seul inconvénient des certificats gratuits émis par Let's Encrypt est qu'ils ne sont <strong>valables que pour 90 jours</strong>. Je ne sais pas vous, mais je n'est pas très envie de devoir me connecter sans cesse sur mes serveurs pour faire le renouvellement. C'est pourquoi nous devons <strong>automatiser cela avec un petit script</strong> et une tâche <em>cron</em>.</p><p>On va donc créer un <strong>script de renouvellement automatique</strong> dans le dossier <code>/etc/letsencrypt/bin</code>, que l'on nommera par exemple <code>le-renew.sh</code>.</p><pre class="brush: bash; gutter: false">vi ~letsencrypt/bin/le-renew.sh</pre><p>Pour le contenu du script, je vous propose cet exemple qui ne renouvellera le certificat que lorsque la date d'expiration approche, mais là encore vous pouvez bien entendu le personnaliser. L'essentiel est de relancer le script <code>acme-tiny</code> avec les mêmes paramètres que lors de la création initiale du certificat, puis de reconstruire le certificat chainé et de redémarrer Apache.</p><pre class="brush: bash">#!/bin/bash

# Configure le nombre de jours en dessous duquel le certificat doit être renouvelé.
RENEW=15

# Récupère le timestamp actuel
NOW=$(date +%s)
# Récupère la date d&#039;expiration du certificat actuel
EXPIRE=$(openssl x509 -in ~letsencrypt/certs/live/signed.crt -noout -enddate)
EXPIRE=${EXPIRE:9}
# Convertit la date d&#039;expiration en un timestamp
EXPIRE=$(date --date=&quot;$EXPIRE&quot; +%s)
# Calcul le temps restant avant l&#039;expiration du certificat
LIFE=$(($EXPIRE - $NOW))
# Si la durée de vie restante est en dessous du minimum demandé.
if [ &quot;$LIFE&quot; -lt &quot;$(( $RENEW * 86400 ))&quot; ]; then 
    DATE=&quot;$(date --utc +&#039;%FT%TZ&#039;)&quot;
    mkdir --mode=775 ~letsencrypt/certs/archive/$DATE
    python ~letsencrypt/bin/acme_tiny.py --account-key ~letsencrypt/private/account.key --csr ~letsencrypt/private/domain.csr --acme-dir ~letsencrypt/challenges/ &gt; ~letsencrypt/certs/archive/$DATE/signed.crt || exit
    wget -O ~letsencrypt/certs/archive/$DATE/intermediate.pem https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem
    cat ~letsencrypt/certs/archive/$DATE/signed.crt ~letsencrypt/certs/archive/$DATE/intermediate.pem &gt; ~letsencrypt/certs/archive/$DATE/chained.pem
    chmod 644 ~letsencrypt/certs/archive/$DATE/{chained.pem,intermediate.pem,signed.crt}
    rm ~letsencrypt/certs/live
    ln -s archive/$DATE ~letsencrypt/certs/live
    sudo apache2ctl graceful
fi</pre><p>Je vous propose également <a href="https://gist.github.com/ksubileau/e4568738117ce1afbe57ab456ac2223c">une version plus avancée de ce script sur Gist</a>, avec une meilleure gestion des erreurs et des logs, qui peut ensuite être combiné à LogWatch et LogRotate par exemple. A vous de faire votre choix !</p><p>Créez ensuite un dossier supplémentaire dédié au stockage des journaux d'exécution (<em>logs</em>):</p><pre class="brush: bash; gutter: false">mkdir /var/log/letsencrypt
chown letsencrypt:adm /var/log/letsencrypt
chmod 2755 /var/log/letsencrypt</pre><p>Il ne reste plus qu'à créer une tâche <em>cron</em> qui exécutera le script avec l'utilisateur <code>letsencrypt</code>. Pour cela, plusieurs solutions, vous pouvez par exemple ajouter un fichier crontab dans le dossier <code>/etc/cron.d/</code> :</p><pre class="brush: bash; gutter: false">vi /etc/cron.d/letsencrypt</pre><p>Dans ce fichier, vous placerez le contenu suivant :</p><pre class="brush: bash; gutter: false"># Renouvellement automatique du certificat Let&#039;s Encrypt
# Tous les dimanches à 3H00
0 3 * * 0 letsencrypt /etc/letsencrypt/bin/le-renew.sh 2&gt;&gt; /var/log/letsencrypt/letsencrypt.log</pre><p><strong>Le script sera alors exécuté tous les dimanches à 3H00</strong>. Vous pouvez bien sûr ajuster cette fréquence, mais il est préférable de le faire tourner assez souvent de sorte à ce que plusieurs tentatives puissent avoir lieu durant les 90 jours de validité du certificat.</p><h2>Fermeture des écoutilles</h2><p>Il reste encore à <strong>ajuster quelques permissions</strong> pour renforcer la sécurité des fichiers sensibles et n'autoriser que le strict minimum.</p><p>On commence par changer le propriétaire et les permissions des deux scripts, de sorte que seul <code>root</code> puisse écrire dedans, et le groupe <code>letsencrypt</code> puisse les lire et les exécuter :</p><pre class="brush: bash; gutter: false">chown root:letsencrypt ~letsencrypt/bin/{acme_tiny.py,le-renew.sh}
chmod 750 ~letsencrypt/bin/{acme_tiny.py,le-renew.sh}</pre><p>Maintenant, nous allons réduire les permissions sur les clés privés. L'utilisateur <code>letsencrypt</code> a simplement besoin de lire la clé utilisateur (<code>account.key</code>) et la demande de signature (<code>domain.csr</code>). Il ne doit pas pouvoir accéder à la <strong>clé privée</strong> du certificat (<code>domain.key</code>), qui ne doit être <strong>accessible que par <code>root</code></strong>.</p><pre class="brush: bash; gutter: false">chown root:letsencrypt ~letsencrypt/private/{account.key,domain.csr,domain.key}
chmod 640 ~letsencrypt/private/{account.key,domain.csr}
chmod 600 ~letsencrypt/private/domain.key</pre><p>Enfin, on fait en sorte que <strong>les certificats soient lisibles par tous</strong>, mais que seul l'utilisateur <code>letsencrypt</code> puisse les écrire :</p><pre class="brush: bash; gutter: false">chown letsencrypt:letsencrypt ~letsencrypt/certs/live/{chained.pem,intermediate.pem,signed.crt}
chmod 644 ~letsencrypt/certs/live/{chained.pem,intermediate.pem,signed.crt}</pre><h2>Conclusion</h2><p>Félicitations, votre serveur est maintenant doté d'<strong>un certificat gratuit validé par une autorité de certification</strong> ! Pour vous assurez qu'il offre une sécurité optimale, je vous conseille de valider votre configuration sur un service tel que <a title="SSL Server Test" href="https://www.ssllabs.com/ssltest/">SSLLabs</a>. Avec la configuration proposée ici, vous devriez obtenir sans peine une note A voire A+, ce qui est très satisfaisant.</p><div id="attachment_2404" class="wp-caption aligncenter" style="width: 610px"><img class="size-full wp-image-2404" alt="SSLLabs analyse votre serveur et génère une note et un rapport sur sa sécurité." src="http://www.kevinsubileau.fr/wp-content/uploads/2016/04/SSLLabs-grade-a.png" width="600" height="230" /><p class="wp-caption-text">SSLLabs analyse votre serveur et génère une note et un rapport sur sa sécurité.</p></div><p>Si vous avez une amélioration ou une correction à apporter à cette méthode, n'hésitez pas à la <strong>proposer dans un commentaire</strong> !</p> ]]></content:encoded> <wfw:commentRss>http://www.kevinsubileau.fr/informatique/astuces-tutoriels/lets-encrypt-installation-manuelle-vps-apache.html/feed</wfw:commentRss> <slash:comments>23</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching using disk: basic

Served from: www.kevinsubileau.fr @ 2026-04-14 09:18:38 -->