admin:services:letsencrypt
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédenteProchaine révisionLes deux révisions suivantes | ||
admin:services:letsencrypt [2016/01/22 18:56] – ajout config pour apache, postfix, dovecot, ldap marc.gallet | admin:services:letsencrypt [2020/04/26 00:28] – [Installation] Désactivation du timer et du service systemd david | ||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
Cette page décrit la mise en place des certificats signés par [[https:// | Cette page décrit la mise en place des certificats signés par [[https:// | ||
- | ===== Installation | + | ===== Mise en place de Let's Encrypt |
- | ==== Avant-Propos | + | ==== Historique |
- | En janvier 2016, la méthode officiellement recommandée pour installer Let's Encrypt | + | En janvier 2016, la méthode officiellement recommandée pour installer Let's Encrypt |
- | Il est à noter que letsencrypt reconnait officiellement que c'est une solution temporaire | + | En mai 2016, suite à la disponibilité de paquets officiels dans les Backports de Jessie pour le client officiel Let's Encrypt renommé |
+ | |||
+ | Fin juin 2016 le cronjob livré avec certbot a été désactivé via // | ||
+ | |||
+ | ==== Remarque sur le choix du client certbot ==== | ||
+ | |||
+ | Il existe aussi d' | ||
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. | 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. | ||
+ | |||
+ | ==== Procédure d' | ||
+ | |||
+ | Le certbot a évolué depuis le début et il n'est plus nécessaire d' | ||
+ | |||
+ | On installera le certbot depuis les backports jessie ou les dépots stretch. | ||
+ | |||
+ | Il existe deux méthodes pour réaliser le challenge en HTTP : | ||
+ | | ||
+ | | ||
+ | |||
+ | Nous choisirons ici le deuxième méthode le plus souvent. | ||
+ | |||
+ | Pour un nginx la configuration à placer dans le vhost est la suivante : | ||
+ | |||
+ | location ^~ / | ||
+ | |||
+ | Il faut que le dossier existe (un coup de mkdir devrait suffire). Il doit appartenir à l' | ||
+ | |||
+ | Enfin, il faut mettre en place le cron de renouvellement des certificats s'il n'a pas été ajouté lors de l' | ||
+ | |||
+ | 0 */12 * * * root test -x / | ||
+ | |||
+ | On notera le renew hook qui permet de relancer les services si un nouveau certificat doit être pris en compte. On pourra faire un script pour le hook s'il n'est pas une commande courte et simple. | ||
+ | |||
+ | Tout est prêt pour générer le certificat :) | ||
+ | |||
+ | Il suffit de placer une commande du type : | ||
+ | |||
+ | certbot certonly --cert-name mon.certificat.tld --rsa-key-size 4096 \ | ||
+ | --email admin@federez.net --webroot -w / | ||
+ | |||
+ | |||
+ | La première fois on vous demandera de dire oui aux TOSS. Pour les test il faut apposer --dry-run. Il est obligatoire de faire des tests jusqu' | ||
+ | |||
+ | Si on veut étendre un certificat existant on peut placer un --extend et il faut mettre le même nom. | ||
+ | |||
+ | Pour avoir une idée de quels certificats sont existants un '' | ||
+ | |||
==== Vue d' | ==== Vue d' | ||
Ligne 17: | Ligne 62: | ||
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. | 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 '' | + | * Le **paquet |
- | | + | |
- | * Le virtualenv créé, mis à jour et appelé automatiquement par '' | + | |
* La configuration et les certificats sont dans ''/ | * La configuration et les certificats sont dans ''/ | ||
* Le **fichier de config** utilisé est à créer sous ''/ | * Le **fichier de config** utilisé est à créer sous ''/ | ||
- | * La gestion des certificats est faite automatiquement par le client. Voir la [[https:// | + | * La gestion des certificats |
* Au final la seule chose à retenir c'est que les **certificats valides** se situent sous ''/ | * Au final la seule chose à retenir c'est que les **certificats valides** se situent sous ''/ | ||
- | * Le **script de renouvellement automatique** adapté à FedeRez | + | * Le **script de renouvellement automatique** adapté à FedeRez |
+ | * Le fichier crontab ce situe dans ''/ | ||
+ | * Un **script de monitoring des certificats SSL** est en place pour vérifier la durée de validité restante et alerter si le certificat s' | ||
+ | <WRAP center round alert> | ||
+ | Précédemment, | ||
- | ==== Installation initiale (Janvier 2016) ==== | + | Ceci était du au bug https:// |
- | :!: Tout se fait (pour le moment) en '' | + | Il était cependant possible d'ajouter des SAN sans problème. |
- | === Clonage | + | Désormais, il suffit que l' |
+ | </ | ||
+ | |||
+ | |||
+ | <WRAP center round important> | ||
+ | Quand vous ajoutez des sous-domaines dans le certificat, pensez bien à mettre à jour le script de monitoring des certificats SSL : cf [[admin: | ||
+ | </ | ||
+ | |||
+ | ==== Installation ==== | ||
+ | |||
+ | <WRAP left round info> | ||
+ | Tout se fait (pour le moment) en '' | ||
+ | </ | ||
+ | |||
+ | === Installation | ||
+ | |||
+ | < | ||
+ | apt-get install certbot | ||
+ | </ | ||
+ | |||
+ | On désactive le cron bi-quotidien livré avec le paquet certbot avec '' | ||
+ | |||
+ | < | ||
+ | sudo dpkg-divert --add --rename --divert / | ||
+ | </ | ||
+ | On désactive aussi le service et le timer systemd qui viennent en doublon du fichier de cron : | ||
< | < | ||
- | git clone https:// | + | systemctl stop certbot.service certbot.timer |
- | / | + | systemctl disable certbot.service certbot.timer |
+ | systemctl mask certbot.service certbot.timer | ||
</ | </ | ||
Ligne 59: | Ligne 132: | ||
text = True | text = True | ||
- | authenticator = standalone | + | authenticator = webroot |
+ | webroot-path = / | ||
# If the requested cert matches an existing cert, always | # If the requested cert matches an existing cert, always | ||
Ligne 69: | Ligne 143: | ||
expand = True | expand = True | ||
</ | </ | ||
+ | |||
+ | === Configuration et vérification que les conf apaches sont bien compatibles avec l'auth webroot === | ||
+ | |||
+ | Avec le plugin d'auth webroot, lors de l' | ||
+ | |||
+ | Premièrement on crée / | ||
+ | |||
+ | < | ||
+ | mkdir -p / | ||
+ | </ | ||
+ | |||
+ | |||
+ | Pour éviter de définir pour chaque site un bloc de configuration pour HTTP afin de rediriger les navigateurs vers la version HTTPS de chaque site, on peut créer un fichier '''/ | ||
+ | <file apache / | ||
+ | < | ||
+ | ServerAdmin webmaster@federez.net | ||
+ | ServerName hexagon.federez.net | ||
+ | |||
+ | RewriteEngine On | ||
+ | RewriteCond %{HTTPS} !=on | ||
+ | | ||
+ | # Pas de redirection pour les requêtes de Let's Encrypt | ||
+ | RewriteCond %{REQUEST_URI} !^/ | ||
+ | | ||
+ | # Redirection vers un domaine de federez.net | ||
+ | RewriteCond %{HTTP_HOST} ^([^.]+\.)? | ||
+ | RewriteRule ^.*$ https:// | ||
+ | |||
+ | < | ||
+ | ProxyPass / | ||
+ | </ | ||
+ | | ||
+ | < | ||
+ | Alias / | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | AllowOverride None | ||
+ | Require all granted | ||
+ | # Utilité à confirmer : | ||
+ | # Options FollowSymLinks | ||
+ | # AddDefaultCharset off | ||
+ | </ | ||
+ | |||
+ | ErrorLog / | ||
+ | CustomLog / | ||
+ | LogLevel Warn | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | On s' | ||
+ | a2enmod rewrite | ||
+ | Ensuite, il faut activer la configuration du site qui gère HTTP avec : | ||
+ | a2ensite 000-no-tls | ||
+ | |||
+ | Enfin, on peut supprimer tous les VHOST HTTP pour ne laisser que les blocs qui concernent HTTPS dans les fichiers de configuration d' | ||
+ | service apache2 reload | ||
+ | |||
+ | Astuce pour vérifier que tout est OK avant de tester avec Letsencrypt : | ||
+ | |||
+ | - Créer un fichier de test : '' | ||
+ | - Depuis une autre machine, utiliser le oneliner suivant pour tester l' | ||
+ | |||
+ | < | ||
+ | for sub in quigon ldap-ro wiki-backup git; do echo $sub; curl http:// | ||
+ | </ | ||
=== Création du script de renouvellement automatique === | === Création du script de renouvellement automatique === | ||
Ligne 74: | Ligne 214: | ||
Le script de renouvellement automatique se trouve dans ''/ | Le script de renouvellement automatique se trouve dans ''/ | ||
- | :!: **Attention**, | + | <WRAP left round important> |
+ | **Attention**, | ||
+ | * il faut uniquement lister les domaines qui pointent réellement sur ce serveur dans la config DNS | ||
+ | * il faut penser à recharger/ | ||
+ | </ | ||
<file bash / | <file bash / | ||
Ligne 84: | Ligne 228: | ||
# ---------------------------------- | # ---------------------------------- | ||
- | set -e | + | #set -e |
- | set -o pipefail | + | #set -o pipefail |
+ | |||
+ | PATH=/ | ||
FULLCHAINPATH="/ | FULLCHAINPATH="/ | ||
Ligne 95: | Ligne 241: | ||
OLDHASH_CERT=" | OLDHASH_CERT=" | ||
fi | fi | ||
- | |||
- | echo " | ||
- | / | ||
echo " | echo " | ||
- | /opt/ | + | # 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/ | ||
+ | # | ||
+ | # Il est cependant possible d' | ||
+ | |||
+ | / | ||
-d quigon.federez.net \ | -d quigon.federez.net \ | ||
-d ldap-ro.federez.net \ | -d ldap-ro.federez.net \ | ||
-d wiki-backup.federez.net \ | -d wiki-backup.federez.net \ | ||
-d git.federez.net \ | -d git.federez.net \ | ||
- | -t | + | --text |
- | + | ||
- | echo " | + | |
- | / | + | |
NEWHASH_CERT=$(sha1sum $FULLCHAINPATH | cut -d" " -f 1) | NEWHASH_CERT=$(sha1sum $FULLCHAINPATH | cut -d" " -f 1) | ||
- | if [[ " | + | if [[ " |
then | then | ||
+ | SHOULD_RESTART_SERVICES=1 | ||
+ | echo " | ||
+ | else | ||
+ | SHOULD_RESTART_SERVICES=0 | ||
echo "INFO: No certificate renewed, will not restart services." | echo "INFO: No certificate renewed, will not restart services." | ||
- | exit | ||
fi | fi | ||
- | |||
- | echo " | ||
# --------------------------------------------------------------------- | # --------------------------------------------------------------------- | ||
Ligne 125: | Ligne 274: | ||
# --------------------------------------------------------------------- | # --------------------------------------------------------------------- | ||
- | # # for pure-ftpd | + | # # exemple |
# echo " | # echo " | ||
# cat / | # cat / | ||
- | echo " | + | # restart the services only if needed |
- | #/ | + | if [[ " |
- | # / | + | then |
- | #/ | + | |
+ | / | ||
+ | | ||
+ | # / | ||
+ | # / | ||
+ | # / | ||
+ | fi | ||
</ | </ | ||
Ligne 144: | Ligne 299: | ||
=== Mise en place dans le crontab === | === Mise en place dans le crontab === | ||
- | < | + | Créer le fichier '' |
- | Insérer la ligne suivante : | + | <file text / |
- | + | 14 9 * * * root / | |
- | <code>14 9 * * * / | + | </file> |
==== Configuration des services pour faire usage des certificats letsencrypt ==== | ==== 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' | ||
+ | |||
+ | <code bash> | ||
+ | chown :ssl-cert / | ||
+ | chmod g+rx / | ||
+ | </ | ||
=== Apache === | === Apache === | ||
Ligne 160: | Ligne 322: | ||
SSLCertificateFile / | SSLCertificateFile / | ||
SSLCertificateKeyFile / | SSLCertificateKeyFile / | ||
+ | </ | ||
+ | |||
+ | === Dovecot === | ||
+ | |||
+ | Dans ''/ | ||
+ | |||
+ | < | ||
+ | ssl = yes | ||
+ | ssl_cert = </ | ||
+ | ssl_key = </ | ||
+ | </ | ||
+ | |||
+ | === 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 : | ||
+ | |||
+ | <code bash> | ||
+ | ldapmodify -H ldapi:/// -Y EXTERNAL -f letsencrypt.ldif | ||
+ | </ | ||
+ | |||
+ | <file ldif letsencrypt.ldif> | ||
+ | dn: cn=config | ||
+ | changetype: modify | ||
+ | replace: olcTLSCACertificateFile | ||
+ | olcTLSCACertificateFile: | ||
+ | - | ||
+ | replace: olcTLSCertificateFile | ||
+ | olcTLSCertificateFile: | ||
+ | - | ||
+ | replace: olcTLSCertificateKeyFile | ||
+ | olcTLSCertificateKeyFile: | ||
+ | - | ||
+ | </ | ||
+ | |||
+ | Si slapd n'a pas accès en lecture aux fichiers, la commande échoue : | ||
+ | < | ||
+ | ldap_modify: | ||
</ | </ | ||
Ligne 172: | Ligne 375: | ||
</ | </ | ||
- | === Dovecot | + | === Proftpd |
- | Dans ''/ | + | Dans ''/ |
< | < | ||
- | ssl = yes | + | TLSRSACertificateFile |
- | ssl_cert = </ | + | TLSRSACertificateKeyFile |
- | ssl_key = </ | + | TLSProtocol |
+ | TLSRequired | ||
</ | </ | ||
- | === Freeradius === | + | === Prosody |
- | + | ||
- | FIXME | + | |
- | + | ||
- | === LDAP === | + | |
- | FIXME | + | Dans ''/ |
< | < | ||
- | # de Zertrin qui ne s'y connait pas du tout en LDAP --> pas vérifié, ne pas utiliser ! | + | ssl = { |
- | olcTLSCACertificateFile: | + | key = "/ |
- | olcTLSCertificateFile: | + | |
- | olcTLSCertificateKeyFile: | + | } |
</ | </ | ||
admin/services/letsencrypt.txt · Dernière modification : 2020/06/17 18:23 de zertrin