Sortie de Let's Encrypt

\o/

Enfin. On l'attendait depuis longtemps. À chaque message publié sur leur blog, je lisais vite pour voir s'illes parlent d'une date de sortie. Il y avait d'abord eu une beta fermée (avec inscription sur un google docs), puis avant-hier, jeudi 3 décembre la beta a été ouverte à tou⋅te⋅s. Enfin.

Les révélations de Snowden

Snowden a révélé l'espionnage massif des télécommunications. On entend parfois certaines personnes dire "moui, ça n'a rien changé". Et pourtant il y a eu plein de changements. Certains ne sont pas du tout visible, tels que le chiffrement des connexions entre les datacenters de Google (vous vous souvenez peut-être du "SSL added and removed here"). Il y en a aussi moins visibles (enfin surtout "vues") pour le profane, comme le travail qui est en train d'être fait pour chiffrer les requêtes DNS (non je ne parle pas de dnscrypt). Enfin il y a let's encrypt.

Le nombre de fois que j'ai dû accepter des certificats parce que :

  • CAcert
  • la personne fait sa propre PKI
  • auto-signé.

Il y avait déjà des méthodes pour avoir des certificats pas cher voire gratuit mais elles n'étaient pas forcément utilisable par tout le monde.

J'espère vraiment que ces conneries vont rapidement être terminées.

Puis Let's encrypt est arrivé

Maintenant Let's Encrypt est là et avec un nouveau protocole, ACME. Il y a une page sur le site qui explique plutôt bien comment ça marche. Ce protocole permet de simplifier grandement le fait de se faire signer son certificat par une autorité de certification.

La durée de validité des certificats Let's Encrypt

La durée des certificats délivrés par Let's encrypt est de 90 jours. Pour certaines personnes, cela est trop court. Néanmoins je trouve ça plutôt positif.

Parfois il arrive qu'on ne veuille plus qu'un certificat puisse fonctionner (car on a perdu le contrôle de la clé privée par exemple).

Il y a alors deux moyens que le certificat ne soit plus valide. La première est de le révoquer. Mais comme l'explique Adam Langley, cela ne marche pas (et encore un autre article pour la route). Pour la petite anecdote, j'ai révoqué une clé gpg il y a 6+ mois, y a deux semaines j'ai encore reçu un mail chiffré avec...

L'autre moyen, c'est tout simplement que le certificat arrive à expiration et donc un temps de validité restreint permet de réduire la durée du problème, s'il se passe quelque chose.

Les clients

Ils ont donc créé une autorité de certification et afin de distribuer les certificats, illes ont créé le protocole ACME, il a fallu donc un client pour utiliser ce nouveau protocole. Illes ont donc développé un client qui a l'air d'être assez complexe (#alerteeuphémisme).

J'ai préféré utiliser un petit client (200 lignes de python2.7). Il suffit de suivre le README tout simple et ça marche plutôt bien.

J'ai écrit un petit script (en gros copié/collé des commandes du readme :o).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/bin/sh
PATH='/bin:/usr/bin:/usr/local/bin'

# needs https://github.com/diafygi/acme-tiny/

# if it's the first time
# openssl genrsa 4096 > master.key
# ftp -o - https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem \
#       > intermediate.pem

LEdir=/home/danj/LE
ACME_TINY=/home/danj/acme-tiny/acme_tiny.py

_date=$(date "+%Y-%m-%d")

if [[ -z ${1} || -z ${2} ]]; then
        echo "usage: ${0##*/} FQDN new"
        echo "       ${0##*/} FQDN update"
        exit 1
fi

_FQDN="${1}"
_mode="${2}"

if [[ "${_mode}" = new ]]; then
        echo "new domain"

        # generate a domain private key (if you haven't already)
        openssl genrsa 4096 > "${LEdir}/key/${_FQDN}.key"

        # for a single domain
        openssl req -new -sha256 \
                -key "${LEdir}/key/${_FQDN}.key" \
                -subj "/CN=${_FQDN}" > "${LEdir}/csr/${_FQDN}.csr"

elif [[ "${_mode}" = update ]]; then
        echo "update"
else
        echo "which mode?"
        exit 1
fi

# make some challenge folder (modify to suit your needs)
mkdir -p "/var/www/${_FQDN}/.well-known/acme-challenge/"

# run the script on your server
python2.7 "${ACME_TINY}" \
        --account-key "${LEdir}/key/master.key" \
        --csr "${LEdir}/csr/${_FQDN}.csr" \
        --acme-dir "/var/www/${_FQDN}/.well-known/acme-challenge/" \
        > "${LEdir}/cert/${_FQDN}-${_date}.crt"

[[ -d "/var/www/${_FQDN}/.well-known" ]] \
        && rm -rf "/var/www/${_FQDN}/.well-known"

if [[ ${_mode} = update ]]; then
        cp "${LEdir}/pem/${_FQDN}.pem" "${LEdir}/pem/${_FQDN}.pem.old"
fi

cat "${LEdir}/cert/${_FQDN}-${_date}.crt" \
        "${LEdir}/pem/intermediate.pem" \
        "${LEdir}/key/${_FQDN}.key" \
        > "${LEdir}/pem/${_FQDN}-${_date}.pem"

L'exécution du script se fait tout simplement (il suffit comme vous pouvez le lire de lui donner le domaine).

$ ksh script.sh chown.me new
new domain
Generating RSA private key, 4096 bit long modulus
.............++
..................................................++
e is 65537 (0x10001)
Parsing account key...
Parsing CSR...
Registering account...
Already registered!
Verifying chown.me...
chown.me verified!
Signing certificate...
Certificate signed!

On rajoute ensuite ce qu'il faut dans le soft qui va gérer la connexion TLS (dans mon cas haproxy) et ça marche

Il ne reste plus qu'à faire en sorte de renouveler le certificat tous les deux mois, comme il est valide trois mois et qu'on veut se donner de la marge.

Gros bisous et prenez soin de vous.

By Vigdis in
Tags : #xmpp, #mail, #tls,
linkedin email