Outils personnels

Let's Encrypt utilisation

De wikiGite

Let's encrypt : https://letsencrypt.org


Letsencrypt uses a protocol called ACME (Automated Certificate Management Environment) for determining if you are really the owner of the domain for which you're requesting a cert. The basic way it works is that it will genreate some files that you post to a directory on your server which it (letsencrypt) can access over port 80 on your domain. If you're able to do that, then you must be the owner of that domain.

Procédure créée à partir de :

http://linuxfr.org/news/reparlons-de-let-s-encrypt

https://www.upcloud.com/support/install-lets-encrypt-apache/

https://www.grafikart.fr/formations/serveur-linux/apache-ssl-letsencrypt

https://vincent.composieux.fr/article/install-configure-and-automatically-renew-let-s-encrypt-ssl-certificate

https://nikhilthedev.com/ssl/how-to-install-lets-encrypt-free-ssl-certificate-on-vestacp-domains/

http://www.servermom.org/install-lets-encrypt-certificate-vestacp/3208/

INSTALLATION

 cd /opt
 git clone https://github.com/letsencrypt/letsencrypt
 cd letsencrypt
 ./letsencrypt-auto --help # installe les dépendances par yum et affiche l'aide ensuite. Vérifier que les paquets installés n'entrent pas en conflit avec Vesta ou autres logiciels

UTILISATION

certonly

le module "--apache" de letsencypt ne fonctionne pas avec certaines implémentation d'apache SSL, par exemple Blueonyx parce qu'elle gère ssl avec un ssl_perl.conf qui n'est pas un fichier de configuration standard. Le client letsencrypt ne peut pas modifier lui-même les fichiers de configuration apache comme il le fait par défaut. On créera donc dans cette procédure les certificats avec "certonly" pour qu'il ne fasse que générer et télécharger les certificats, pour une installation manuelle ensuite.

mode test

TIP: commencer en ajoutant "--test-cert" (ou "--staging") sur toutes les commandes letsencrypt-auto ci-dessous, afin de ne générer que des certificats "fake" qui n'incrémentent pas le compteur chez Let-s Encrypt. En effet, si plusieurs tests échouent pour un domaine, ils finissent par bloquer les demandes.

WEBROOT

le client crée un flag dans le site, lu par Let's Encrypt pour valider qu'on est sur le bon serveur.


Dans les écrans suivant, indiquer

  • Place files in webroot directory (webroot)
  • email de l'admin
  • Agree (terms of service)
  • Enter a new webroot
  • choisir le webroot HTTP (pas https) du site

Ou avec une fichier de configuration :

 ./letsencrypt-auto certonly -d monsite.domain.fr --config /opt/letsencrypt/monsite.domain.fr.ini

créer /opt/monsite.domain.fr.ini

# We use a 4096 bit RSA key instead of 2048
rsa-key-size = 4096

email = admin@domain.fr
domains = monsite.domain.fr

authenticator = webroot

# This is the webroot directory of your domain in which
# letsencrypt will write a hash in /.well-known/acme-challenge directory.
webroot-path = /var/www/monsite.domain.fr/web

Réponse si OK :

Version: 1.1-20080819
Version: 1.1-20080819

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/monsite.domain.fr/fullchain.pem. Your cert
   will expire on 2016-09-07. To obtain a new or tweaked version of
   this certificate in the future, simply run letsencrypt-auto again.
   To non-interactively renew *all* of your certificates, run
   "letsencrypt-auto renew"

Le pem peut être installé dans la configuration SSL de monsite.domain.fr

 # add ssl protocol
 SSLEngine On
 SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
 SSLCertificateFile  /etc/letsencrypt/live/monsite.domain.fr/fullchain.pem
 SSLCertificateKeyFile /etc/letsencrypt/live/monsite.domain.fr/privkey.pem

STANDALONE

letsencrypt lance son propre serveur web. Aucun autre service web ne doit être lancé sur le même port sur le serveur. Arrêter le service web en cours si nécessaire.

Selon le port disponible au moment de la génération sur le serveur (derrière un firewall par exemple), ajouter :

  • --standalone-supported-challenges http-01 # to use port 80
  • --standalone-supported-challenges tls-sni-01 # to use port 443
 ./letsencrypt-auto certonly --standalone -d monsite.domain.fr

Les certificats sont créés dans /etc/letsencrypt/live/monsite.domain.fr, à placer dans la configuration SSL.

MANUEL en dehors du serveur de production

Pour utiliser un autre serveur que le serveur qui héberge le site (et donc doit normalement répondre), on peut lancer la client en manuel et répondre soi-même au challenge (création du .well-known/acme-challenge avec le token attendu). Donc sur un serveur tierce, sans apache qui tourne :

 ./letsencrypt-auto certonly --manual -d monsite.domain.fr

Accepter le fait que l'IP sera logguée par Let's Encrypt. C'est un moindre mal pour ce qu'ils apportent !

Réponse :

Make sure your web server displays the following content at
http://monsite.domain.fr/.well-known/acme-challenge/iAV8OLYoNPchaClyvLx4J6-DDkymW3EmBzg3icUlEeg before continuing:

iAV8OLYoNPchaClyvLx4J6-DDkymW3EmBzg3icUlEeg.VM6IgnRLoxo484hbGGHHhnQHuWeAwzIbkt9IoX7HsK8

If you don't have HTTP server configured, you can run the following
command on the target server (as root):
mkdir -p /tmp/certbot/public_html/.well-known/acme-challenge
cd /tmp/certbot/public_html
printf "%s" iAV8OLYoNPchaClyvLx4J6-DDkymW3EmBzg3icUlEeg.VM6IgnRLoxo484hbGGHHhnQHuWeAwzIbkt9IoX7HsK8 > .well-known/acme-challenge/iAV8OLYoNPchaClyvLx4J6-DDkymW3EmBzg3icUlEeg
# run only once per server:
$(command -v python2 || command -v python2.7 || command -v python2.6) -c \
"import BaseHTTPServer, SimpleHTTPServer; \
s = BaseHTTPServer.HTTPServer((, 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \
s.serve_forever()" 

A ce stade, le client letsencrypt attend notre décision

Traduction : soit on crée ensuite manuellement .well-known/acme-challenge/iAV8OLYoNPchaClyvLx4J6-DDkymW3EmBzg3icUlEeg sur le serveur de production (qui a le site), soit on lance un serveur web temporaire sur notre serveur tierce comme indiqué après "you can run the following..." (dans une autre console ssh).

Une fois qu'un des serveurs est paramétré, appuyer sur un touche pour que le client letsencrypt termine.

Le certificat est créé sur le serveur tierce dans /etc/letsencrypt/live/monsite.domain.fr/, à installer dans la configuration SSL du serveur de production.

TIP : Pour VESTACP, manuellement dans le webui, mettre le contenu de "cert1.pem" dans la case certificat, de "privkey1.pe" dans la case clé, et de "chain1.pem" dans la case autorité/intermédiaire.


OU : automatisation par le script letsencrypt-vesta :

Letsencrypt-vesta

Interbrite a eu la bonne idée de développer un script d'automatisation spécialement pour VestaCP.

 yum install git
 cd /opt
 git clone https://github.com/letsencrypt/letsencrypt.git
 git clone https://github.com/interbrite/letsencrypt-vesta.git
 mkdir -p /etc/letsencrypt/webroot

modifier le chemin du client letsencrypt dans le script letsencrypt-vesta :

LETSENCRYPT_COMMAND='/opt/letsencrypt-auto ...(etc)...'

puis

 ln -s /opt/letsencrypt-vesta/letsencrypt.conf /etc/httpd/conf.d/letsencrypt.conf

Pour faciliter le lancement des scripts :

 ln -s /opt/letsencrypt/letsencrypt-auto /usr/local/bin/letsencrypt-auto
 ln -s /opt/letsencrypt-vesta/letsencrypt-vesta /usr/local/bin/letsencrypt-vesta

ATTENTION, alors que python-virtualenv est disponible dans les dépôts de base sur Centos7, il est dans le dépôt EPEL sur Centos6. Il faut donc l'installer préalablement si EPEL est désactivé par défaut (ce que je vous conseille !).

ATTENTION, s'assurer que tous les alias DNS du domaine pour lequel on veut créer les certificats pointent bien vers le même serveur (letsencrypt teste tous les alias !)

Création des certificats :

 letsencrypt-vesta username domain

le premier lancement installe les dépendances. Il crée les certificats, et modifie tout seul la configuration VestaCP pour le domaine donné.

Renouvellement

Pour vesta, c'est simple avec le script : relancer la même commande tous les 60 jours, ça renouvellera le certificat. A mettre dans le cron vesta, donc.

par exemple: le 1er, tous les 2 mois : mettre "1" pour le jour, "*/2" pour les mois

Divers

Automatisation

A tester : script d'automatisation de création manuelle (enlève l'obligation d'être sur le serveur lui-même (=> pas de réponse directe quand letsencrypt essaie de se connecter au site), ou pour un service non-apache/nginx qu'on ne peut pas arrêter pour le mode standalone)

ATTENTION : !! /etc/ssl/openssl.cnf doit exister !!

#!/bin/sh
#
# Wrapper script for the letsencrypt client to generate a server certificate in
# manual mode. It uses openssl to generate the key and should not modify the
# server configuration. It can be called off-side, i.e. not on the destination
# server.
#
# usage: gencert DOMAIN [DOMAIN...]
#
# This is free and unencumbered software released into the public domain.
# For more information, please refer to http://unlicense.org/ 

set -e

if [ $# -lt 1 ]; then
    echo "$0: error: at least one domain name required."
    exit 1
fi
domain=$1 

shift
other_domains=
while [ $# -gt 0 ]; do
    other_domains="$other_domains,DNS:$1"
    shift
done

country=FR
state="Vienne"
town="Poitiers"
email=support@systea.net

outdir="certs/$domain"
key="$outdir/privkey1.pem"
csr="$outdir/signreq.der"

if [ -d "$outdir" ]; then
    echo "output directory $outdir exists"
    exit 1
fi

tmpdir=
cleanup() {
    if [ -n "$tmpdir" -a -d "$tmpdir" ]; then
        rm -rf "$tmpdir"
    fi
}
trap cleanup INT QUIT TERM EXIT
tmpdir=`mktemp -d -t mkcert-XXXXXXX`

sslcnf="$tmpdir/openssl.cnf"
cat /etc/ssl/openssl.cnf > "$sslcnf"
echo "[SAN]" >> "$sslcnf"
echo "subjectAltName=DNS:$domain$other_domains" >> "$sslcnf"

mkdir -p "$outdir"
openssl req \
    -new -newkey rsa:2048 -sha256 -nodes \
    -keyout "$key" -out "$csr" -outform der \
    -subj "/C=$country/ST=$state/L=$town/O=$domain/emailAddress=$email/CN=$domain" \
    -reqexts SAN \
    -config "$sslcnf"

letsencrypt certonly \
    --authenticator manual \
    --server https://acme-v01.api.letsencrypt.org/directory --text \
    --config-dir letsencrypt/etc --logs-dir letsencrypt/log \
    --work-dir letsencrypt/lib --email "$email" \
    --csr "$csr"