Outils pour utilisateurs

Outils du site


admin:services:letsencrypt

Ceci est une ancienne révision du document !


< 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.

Mise en place de Let's Encrypt sur un serveur

Avant-Propos

En janvier 2016, la méthode officiellement recommandée pour installer Let's Encrypt consistait à cloner le dépôt officiel de letsencrypt et d'utiliser le script officiel letsencrypt-auto.

En mai 2016, suite à la disponibilité de paquets officiels dans les Backports de Jessie, il a été décidé de migrer sur la version packagée et en même temps de passer du plugin d'auth apache au plugin d'auth webroot.

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.

  • Le paquet letsencrypt a été installé depuis les backports de jessie (jessie-backports).
  • Le client automatique officiel se trouve sous /usr/bin/letsencrypt
  • 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/scripts/renew_letsencrypt_certificates.sh. C'est ce script qui est appelé dans le crontab chaque jour. C'est ici qu'il faut ajouter les sous-domaines pour lesquels obtenir un certificat.
  • Un script de monitoring des certificats SSL pour vérifier la durée de validité restante et alerter si le certificat s'approche de son expiration : ssl-cert-check.

Pour le moment, il faut absolument éviter de retirer un sous-domaine de la liste des domaines après que le certificat ait été déjà émis. Lors du renouvellement une nouvelle “lignée” de certificats sera créée ne se trouvant pas dans le dossier de destination attendu par les services.

Ceci est du au bug https://github.com/certbot/certbot/issues/2071

Il est cependant possible d'ajouter des SAN sans problème.

Pour retirer un sous domaine, contactez Zertrin auparavant pour coordonner l'opération tant que le bug 2071 n'est pas résolu.

Quand vous ajoutez des sous-domaines dans le certificat, pensez bien à mettre à jour le script de monitoring des certificats SSL : cf ssl-cert-check

Installation

Tout se fait (pour le moment) en root sur le serveur.

Clonage du dépot git de letsencrypt et bootstrap

apt-get install -t jessie-backports letsencrypt

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 = webroot
webroot-path = /var/www/letsencrypt
 
# 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
 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 
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 "Renewing federez.net with letsencrypt-auto..."
 
# Pour le moment, il faut absolument éviter de retirer un sous-domaine de la liste des domaines
# après que le certificat ait été déjà émis. Lors du renouvellement une nouvelle “lignée” de
# certificats sera créée ne se trouvant pas dans le dossier de destination attendu par les services.
#
# Ceci est du au bug https://github.com/letsencrypt/letsencrypt/issues/2071
#
# Il est cependant possible d'ajouter des SAN sans problème.
 
/usr/bin/letsencrypt certonly --config /etc/letsencrypt/cli.ini --non-interactive \
  -d quigon.federez.net \
  -d ldap-ro.federez.net \
  -d wiki-backup.federez.net \
  -d git.federez.net \
  -t
 
NEWHASH_CERT=$(sha1sum $FULLCHAINPATH | cut -d" " -f 1)
 
if [[ "$OLDHASH_CERT" != "$NEWHASH_CERT" ]]
then
  SHOULD_RESTART_SERVICES=1
  echo "Renewals done!"
else
  SHOULD_RESTART_SERVICES=0
  echo "INFO: No certificate renewed, will not restart services."
fi
 
# ---------------------------------------------------------------------
# Ci-dessous à adapter en fonction des services présents sur le serveur
# ---------------------------------------------------------------------
 
# # exemple for pure-ftpd that needs a very specific certificate file
# 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
 
# restart the services only if needed
if [[ "$SHOULD_RESTART_SERVICES" -eq 1 ]]
then
  echo "Restarting services ..."
  /bin/systemctl reload apache2.service
  /bin/systemctl reload postfix.service
fi

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

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'en tant que 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)

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

Proftpd

Dans /etc/proftpd/tls.conf :

TLSRSACertificateFile                   /etc/letsencrypt/live/federez.net/fullchain.pem
TLSRSACertificateKeyFile                /etc/letsencrypt/live/federez.net/privkey.pem
TLSProtocol                             TLSv1.2
TLSRequired                             on
1)
le protocole pour obtenir un certificat automatiquement
admin/services/letsencrypt.1463256595.txt.gz · Dernière modification : 2016/05/14 22:09 de zertrin

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki