Ceci est une ancienne révision du document !
Table des matières
< retour à la page de l'administration technique
Cette page décrit la mise en place des certificats signés par Let's Encrypt sur les serveurs de FedeRez.
Installation de Let's Encrypt (Janvier 2016)
Avant-Propos
En janvier 2016, la méthode officiellement recommandée pour installer Let's Encrypt consiste à cloner le dépôt officiel de letsencrypt et d'utiliser le script officiel letsencrypt-auto
.
Il est à noter que letsencrypt reconnait officiellement que c'est une solution temporaire en attendant un packaging en bonne et due forme par les distributions. Il existe aussi d'autres clients ACME 1) que le client officiel, qui avancent certains avantages tels que la possibilité de ne pas être exécutés en root, ou bien le fait qu'ils sont fait de peu de lignes de codes et donc plus faciles à auditer.
Après avoir pris en compte tout ceci, il fut décidé de s'en tenir pour le moment au client officiel, avec pour but de migrer vers une alternative plus adaptée une fois que la poussière sera retombée et qu'une meilleure alternative stable et viable se présentera.
Vue d'ensemble du système
Pour le moment, chaque serveur est responsable de générer et faire signer les certificats pour les noms de domaines qu'il gère.
- La source de letsencrypt telle que clonée depuis le dépôt officiel se trouve dans
/opt/letsencrypt
. - Le client automatique officiel se trouve sous
/opt/letsencrypt/letsencrypt-auto
- Le virtualenv créé, mis à jour et appelé automatiquement par
letsencrypt-auto
se trouve dans/root/.local/share/letsencrypt
. Normalement y'a pas besoin d'y toucher. - La configuration et les certificats sont dans
/etc/letsencrypt
:- Le fichier de config utilisé est à créer sous
/etc/letsencrypt/cli.ini
(cf. installation ci-dessous) - La gestion des certificats est faite automatiquement par le client. Voir la documentation officielle pour plus d'informations.
- Au final la seule chose à retenir c'est que les certificats valides se situent sous
/etc/letsencrypt/live/example.org/*
- Le script de renouvellement automatique adapté à FedeRez et au serveur se trouve dans
/root/renew_letsencrypt_certificates.sh
. C'est ce script qui est appelé dans le crontab chaque jour.
Installation initiale (Janvier 2016)
Tout se fait (pour le moment) en root
sur le serveur.
Clonage du dépot git de letsencrypt et bootstrap
git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt /opt/letsencrypt/letsencrypt-auto --version # to bootstrap letsencrypt without doing anything else
Création du fichier de config
Créer le dossier de config :
mkdir /etc/letsencrypt
Créer le fichier /etc/letsencrypt/cli.ini
avec le contenu suivant :
- /etc/letsencrypt/cli.ini
# Use a 4096 bit RSA key instead of 2048 rsa-key-size = 4096 # Uncomment and update to register with the specified e-mail address email = admin@federez.net # Accept the Terms of Service agree-tos = True # Uncomment to use a text interface instead of ncurses text = True authenticator = standalone # If the requested cert matches an existing cert, always # keep the existing one until it is due for renewal keep-until-expiring = True # If an existing cert covers some subset of the requested names, # always expand and replace it with the additional names expand = True
Création du script de renouvellement automatique
Le script de renouvellement automatique se trouve dans /root/scripts/renew_letsencrypt_certificates.sh
Attention, le contenu de ce script est à adapter en fonction du serveur: il faut uniquement lister les domaines qui pointent réellement sur ce serveur dans la config DNS.
- /root/scripts/renew_letsencrypt_certificates.sh
#!/usr/bin/env bash # ---------------------------------- # EXAMPLE POUR QUIGON.FEDEREZ.NET # À ADAPTER EN FONCTION DU SERVEUR # ---------------------------------- set -e set -o pipefail FULLCHAINPATH="/etc/letsencrypt/live/EXAMPLE.federez.net/fullchain.pem" if [[ -e "$FULLCHAINPATH" ]] then OLDHASH_CERT=$(sha1sum $FULLCHAINPATH | cut -d" " -f 1) else OLDHASH_CERT="nope" fi echo "Stopping Apache..." /bin/systemctl stop apache2.service echo "Renewing federez.net with letsencrypt-auto..." /opt/letsencrypt/letsencrypt-auto certonly --config /etc/letsencrypt/cli.ini \ -d quigon.federez.net \ -d ldap-ro.federez.net \ -d wiki-backup.federez.net \ -d git.federez.net \ -t echo "Starting Apache..." /bin/systemctl start apache2.service NEWHASH_CERT=$(sha1sum $FULLCHAINPATH | cut -d" " -f 1) if [[ "$OLDHASH_CERT" == "$NEWHASH_CERT" ]] then echo "INFO: No certificate renewed, will not restart services." exit fi echo "Renewal done!" # --------------------------------------------------------------------- # Ci-dessous à adapter en fonction des services présents sur le serveur # --------------------------------------------------------------------- # # for pure-ftpd # echo "Generating pure-ftpd's certificate..." # cat /etc/letsencrypt/live/EXAMPLE.federez.net/privkey.pem /etc/letsencrypt/live/EXAMPLE.federez.net/fullchain.pem > /etc/ssl/private/pure-ftpd.pem echo "Restarting services ..." #/bin/systemctl reload postfix.service # /bin/systemctl restart pure-ftpd.service #/bin/systemctl restart dovecot.service
Tester la génération du certificat
chmod u+x /root/scripts/renew_letsencrypt_certificates.sh /root/scripts/renew_letsencrypt_certificates.sh
Mise en place dans le crontab
crontab -e
Insérer la ligne suivante :
14 9 * * * /root/scripts/renew_letsencrypt_certificates.sh 1>/dev/null
Configuration des services pour faire usage des certificats letsencrypt
Comme certains services n'ont pas les privilèges root à leur démarrage (au moins OpenLDAP), l'accès aux certificats leur a été donné par les commandes suivantes :
chown :ssl-cert /etc/letsencrypt/{archive,live} chmod g+rx /etc/letsencrypt/{archive,live}
Apache
Dans chaque VirtualHost HTTPS :
SSLEngine on SSLCertificateFile /etc/letsencrypt/live/EXAMPLE.federez.net/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/EXAMPLE.federez.net/privkey.pem
Postfix
Dans /etc/postfix/main.cf
:
smtpd_tls_cert_file=/etc/letsencrypt/live/EXAMPLE.federez.net/fullchain.pem smtpd_tls_key_file=/etc/letsencrypt/live/EXAMPLE.federez.net/privkey.pem smtpd_use_tls = yes
Dovecot
Dans /etc/dovecot/conf.d/10-ssl.conf
:
ssl = yes ssl_cert = </etc/letsencrypt/live/EXAMPLE.federez.net/fullchain.pem ssl_key = </etc/letsencrypt/live/EXAMPLE.federez.net/privkey.pem
Freeradius
Pas nécessaire car ce sont les certificats des assos qui sont utilisés. Le Freeradius à Federez ne fonctionne qu'un proxy.
OpenLDAP
Exécuter la commande suivante en root avec le fichier ci-dessous :
ldapmodify -H ldapi:/// -Y EXTERNAL -f letsencrypt.ldif
- letsencrypt.ldif
dn: cn=config changetype: modify replace: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/letsencrypt/live/EXAMPLE/chain.pem - replace: olcTLSCertificateFile olcTLSCertificateFile: /etc/letsencrypt/live/EXAMPLE/cert.pem - replace: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/letsencrypt/live/EXAMPLE/privkey.pem -
Si slapd n'a pas accès en lecture aux fichiers, la commande échoue :
ldap_modify: Other (e.g., implementation specific) error (80)