Si vous utilisez OpenBSD, alors vous vous servez aussi vraisemblablement de acme-client. C’est un client acme (Merci Capitaine Obvious) codé avec la philosophie OpenBSD, separation des pouvoirs et des processus, etc.

Mais ce client logiciel ne peut aujourd’hui fonctionner qu’avec une seule autorité : Let’s Encrypt, le service originel. Ceci est un problème parce qu’ils fournissent en fait 55 % des certificats TLS (à la date de juin 2020). Cela devient un Single Point of Failure.

On pouvait espérer travailler avec Dane mais apparemment c’est pas pour tout de suite. Essayons donc de trouver une alternative. Celle dont je veux parler, c’est Buypass. C’est une AC norvégienne. Je trouve que ça peut être interressant de chercher un peu en dehors des sentiers battus et aussi en dehors des USA. La Norvège est l’un des pays les moins corrompus de la planète, et qui plus est européen. Je pense donc qu’on peut leur faire confiance. Comme en plus je vis au Danemak, je trouve assez logique d’utiliser un service scandinave pour mes sites web.

Bon en fait, c’est quoi le problème avec cette AC ?

Indique ton adresse courriel

Tout d’abord, on ne peut pas utiliser acme-client directement. Ils ont des pré-requis impossible à satisfaire avec acme-client. En particulier “agree to their terms” et indiquer l’adresse courriel.

Bah on va tricher.

On va installer certbot, déclarer un compte ACME et l’utiliser. Mais avec acme-client !

doas pkg_add certbot

doas certbot register -m 'spamtrap@22decembre.eu' --agree-tos --server 'https://api.buypass.com/acme/directory'

Voila, Vous devriez avoir un compte ACME avec une clé privée.

Extraire la clé

Certbot devrait avoir créé une clé de certification dans /etc/letsencrypt/accounts/api.buypass.com/acme/directory/ numéro de série /private_key.json.

Oui, c’est long et compliqué. Et c’est du Json. Pourquoi faire simple quand on peut faire compliqué ?

Maintenant, vous devez extraire la clé du compte du Json.

Quelqu’un a écrit un script python2 pour celà.

Vous avez besoin de python2 pour ça. Et modifiez le shebang en top, pour être sûr d’utiliser la bonne version. Si vous avez une version plus récente du script, mentionnez-le en commentaires s’il vous plait.

doas pkg_add python

Utilisez Python 2 !

less conv.py

#!/usr/local/bin/python2
…

Vous pouvez maintenant extraire la clé.

# Create a DER encoded private key
openssl asn1parse -noout -out private_key.der -genconf <(python2 conv.py private_key.json)
# Convert to PEM
openssl rsa -in buypass.key -inform der

Vous devez copier la buypass.key obtenue dans /etc/acme/. Vous pouvez aussi la copier sur d’autres machines sur lesquelles vous vouler obtenir des certificats TLS. Et plus de bricolage pour eux.

Configurez votre acme-client.conf :

authority buypass {
    api url "https://api.buypass.com/acme/directory"
    account key "/etc/acme/buypass.key"
}

domain some.domain.tld {
    domain key                      "/etc/ssl/acme/private/some.domain.tld.pem"
    domain full chain certificate   "/etc/ssl/acme/some.domain.tld-fullchain.pem"
    domain certificate              "/etc/ssl/acme/some.domain.tld.pem"
    sign with buypass
}

Il faut à présent configurer le serveur web.

Pas de connection TLS

Buypass a une installation un peu bizarre. Ils fournissent des certificats TLS gratuitement, mais ils ne suivent pas les redirections TLS dans les sites web.

Donc, on va devoir laisser passer http, juste pour pouvoir valider la requête ACME. Voila ce que ça donne sur Nginx :

server {
    listen 80;
    listen [::]:80;
    server_name some.domain.tld;

    location /.well-known/acme-challenge/ {
        rewrite ^/.well-known/acme-challenge/(.*) /$1 break;
        root /acme;
    }

    location / { return 301 https://$host$request_uri; }
 }

 server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name some.domain.tld;
 
    ## HSTS
    add_header Strict-Transport-Security "max-age=20000000" always;

    location /.well-known/acme-challenge/ {
      rewrite ^/.well-known/acme-challenge/(.*) /$1 break;
      root /acme;
    }
    …
    ssl_certificate      /etc/ssl/acme/some.domain.tld-fullchain.pem;
    ssl_certificate_key  /etc/ssl/acme/private/some.domain.tld.pem;
    
    ssl configuration
    …
    stuff
    …
    tons of stuff
 }

Comme vous voyez, je laisse d’abord passer http pour le acme-challenge (avec redirection interne vers le repertoire indiqué dans acme-client.conf) puis immédiatement après, https redirection puis HSTS, soit connection TLS obligatoire permanente.

Vous devez pouvoir enfin obtenir des certificats TLS de Buypass avec acme-client, à la manière OpenBSD !

Cette installation est celle de ce site web ainsi que celle de mon instance PeerTube.