Un blog de geek 2.0, RTFM et 42

Utiliser let's encrypt et Zimbra

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 let’s encrypt

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 code let’s encrypt via git
  • exécuter le programme avec des options
  • 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 let’s encrypt (en root) :

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt

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

./letsencrypt-auto certonly --standalone -d <FQDN>

où FQDN correspond au nom que vous souhaitez faire apparaître dans le subject de votre certificat.

On peut maintenant redémarrer les services 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/ est le nom utilisé pour le certificat SSL. 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://www.identrust.com/certificates/trustid/root-download-x3.html ; nous allons créer le fichier suivant : /etc/letsencrypt/live/FQDN/root-ca.pem. Le contenu doit être ceci :

-----BEGIN CERTIFICATE-----
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
-----END CERTIFICATE-----

Notez bien que nous avons ajouté le BEGIN CERTIFICATE et le END CERTIFICATE.

Nous procédons alors à la création de la chaine de certification ainsi qu’à l’utilisation de la root CA :

cd /etc/letsencrypt/live/<FQDN>
cat chain.pem root-ca.pem > chain-root-ca.pem

Installation du certificat SSL

cp -a /opt/zimbra/ssl/zimbra /opt/zimbra/ssl/zimbra.$(date "+%Y%m%d")
mkdir /root/ssl/
cd /root/ssl/
cp /etc/letsencrypt/live/<FQDN>/*.pem /root/ssl/
mv cert.pem commercial.crt
mv chain-root-ca.pem chain.txt
cp /root/ssl/privkey.pem /opt/zimbra/ssl/zimbra/commercial/commercial.key
/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

/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 :

./letsencrypt-auto certonly --standalone -d <FQDN>

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

5 Jan 2016 #linux #zimbra