Utiliser let's encrypt et Zimbra

Billet posté le 11 mai 2019

C’est quoi let’s encrypt ?

Let’s encrypt c’est une nouvelle autorité de certification qui se veut gratuite, automatisable et ouverte.

Et pourquoi pas startssl ou bien cacert ?

startssl c’est connu et utilisé depuis de nombreuses années. Il possède les caractéristiques suivantes :

  • certificat SSL gratuit pour un seul FQDN ;
  • authentification sur le portail d’administration via un certificat SSL client ;
  • une durée de validité du certificat SSL d’un an ;
  • plutôt bien reconnu auprès des navigateurs et téléphones portables.

Pourquoi startssl m’a énervé ? Pour l’administration depuis son portail. En effet, lors de votre inscription vous allez obtenir un certificat SSL client pour vous authentifier. L’idée est loin d’être idiote sauf quand c’est impossible de s’authentifier auprès du portail. Au début j’ai pensé à une corruption de mon certificat SSL client, je me suis inscrit sous une nouvelle identité cela n’a rien changé. J’en ai profité pour tenter avec un autre navigateur qui n’avait aucun historique ni aucune configuration spécifique : essai en vain. Bref, j’étais un peu embêté car je devais renouveler des certificats.

Et cacert alors ? Un seul problème : l’autorité racine n’est pas disponible dans les magasins des navigateurs ni des téléphones. Résultat : même si le chiffrement fonctionne bien techniquement, l’utilisateur aura une fenêtre l’avertissant qu’il y a un problème. Ou bien pire l’application ne fonctionnera pas tout court. Bref, l’initiative est géniale mais l’utilisation est difficile pour les utilisateurs non informaticiens.

Installation de certbot

Un peu de blabla avant de commencer. Utiliser let’s encrypt n’est pas tout à fait conventionnel. En effet, voici les grandes étapes :

  • obtenir le programme certbot ;
  • exécuter le programme avec les bonnes options, notamment nous souhaitons obtenir un certificat wildcard ;
  • récupérer la clé privée, le certificat et la chaine de certification ;
  • installer / déployer sur le logiciel.

Procédons à l’installation de certboot. Le site officiel se trouve https://certbot.eff.org/ et vous devez sélectionner le système d’exploitation souhaité ainsi que le serveur web que vous utilisez. Ici, nous utilisons Ubuntu Server 18.04 LTS et nginx.

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot python-certbot-nginx 

Stopper les services Zimbra

Quelque chose d’assez pénible c’est que le client let’s encrypt va créer un mini serveur le temps de la génération du certificat SSL or votre serveur Zimbra occupe déjà les ports dont a besoin let’s encrypt. Voilà pourquoi, temporairement, nous allons stopper les services Zimbra.

zmcontrol stop

Faire sa demande de certificat

certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --manual -d '*.lovetux.net'

où *.lovetux.net correspond au nom de domaine que vous souhaitez faire apparaître dans le Common Name de votre certificat.

On peut maintenant redémarrer les services Zimbra :

su - zimbra
zmcontrol start

Vérifier le certificat généré

Le certificat SSL, la clé privée ainsi que la chaîne de certification sont générés dans le répertoire suivant : /etc/letsencrypt/live/lovetux.net. Dans ce répertoire nous y trouvons les fichiers suivants :

  • cert.pem : le certificat SSL ;
  • chain.pem : la chaine de certification ;
  • fullchain.pem : le certificat SSL et la chaine de certification concaténée ;
  • privkey.pem : la clé privée.

Petit rappel important : la clé privée ne doit jamais être divulguée à un tiers !

Étape intermédiaire : récupérer la root CA (certificat racine)

Il faut récupérer la root CA (certificat racine) qui est disponible ici : https://letsencrypt.org/certs/isrgrootx1.pem.txt et https://letsencrypt.org/certs/letsencryptauthorityx3.pem.txt :

Installation du certificat SSL

mkdir /tmp/ssl
cp -a /opt/zimbra/ssl/zimbra /opt/zimbra/ssl/zimbra.$(date "+%Y%m%d")
cd /tmp/ssl/
cp /etc/letsencrypt/live/lovetux.net/*.pem /tmp/ssl/
mv cert.pem commercial.crt
wget https://letsencrypt.org/certs/isrgrootx1.pem.txt
wget https://letsencrypt.org/certs/letsencryptauthorityx3.pem.txt
cat isrgrootx1.pem.txt letsencryptauthorityx3.pem.txt > chain.txt
cp /root/ssl/privkey.pem /opt/zimbra/ssl/zimbra/commercial/commercial.key
chown -R zimbra:zimbra /tmp/ssl
su - zimbra
cd /tmp/ssl
/opt/zimbra/bin/zmcertmgr verifycrt comm /opt/zimbra/ssl/zimbra/commercial/commercial.key commercial.crt chain.txt
/opt/zimbra/bin/zmcertmgr deploycrt comm commercial.crt chain.txt
su - zimbra
zmcontrol restart

Vérification de l’installation du certificat SSL

su - zimbra
/opt/zimbra/bin/zmcertmgr viewdeployedcrt

Ou bien par une commande openssl :

echo QUIT | openssl s_client -connect <FQDN>:443 | openssl x509 -noout -text | less

Mise en place d’une sonde nagios pour vérifier l’expiration du certificat SSL

J’utilise l’outil nagios pour monitorer tout un tas de services dont l’expiration de mes certificats SSL.

Après l’installation des plugins nagios nous avons une nouvelle commande qui nous permet de tester l’expiration du certificat SSL :

/usr/lib/nagios/plugins/check_http --sni -H '<FQDN>' -C 30,14

La commande précédente envoie un warning à 30 jours et un critical à 14 jours avant expiration.

On peut alors créer une nouvelle commande nagios. On édite le fichier /etc/nagios-plugins/config/http.cfg et on ajoute ceci :

# 'check_https_vhost' command definition
define command{
        command_name    check_https_vhost
        command_line    /usr/lib/nagios/plugins/check_http --sni -H '$ARG1$' -C 30,14
}

Et enfin dans le fichier de configuration des services de nagios on peut ajouter quelque chose comme ceci :

define service{
        use                             generic-service
        host_name                       <FQDN>
        service_description             SSL <FQDN>
        check_command                   check_https_vhost!<FQDN>
}

Renouveler son certificat SSL

Lorsque son certificat SSL a expiré ou ne va pas tarder à expirer il convient donc de le renouveler. D’après la documentation (car le cas ne m’est pas encore arrivé) il suffit simplement de relancer la commande de génération à savoir :

certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --manual -d '*.lovetux.net'

Puis de procéder à nouveau au déploiement.