Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
serveur_hebergement:let_s_encrypt_certbot_et_ssl_sur_debian [2022/10/05 22:46] – [Configuration de Apache] fate | serveur_hebergement:let_s_encrypt_certbot_et_ssl_sur_debian [2022/10/21 16:59] (Version actuelle) – supprimée fate | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Let’s Encrypt, Certbot et SSL sur Debian ====== | ||
- | Pour ceux qui ne connaissent pas, Let's Encrypt fourni, gratuitement, | ||
- | |||
- | Le SSL, qu' | ||
- | |||
- | Pour expliquer rapidement comment ça fonctionne, le SSL utilise une paire de clé (publique et privée) et une autorité de confiance : | ||
- | - Le navigateur se connecte au serveur et demande une connexion SSL | ||
- | - Le serveur envoi un certificat SSL, contenant sa clé publique et sa signature numérique chiffrée, au navigateur | ||
- | - Le navigateur essaye de déchiffrer la signature avec les clés publique des autorités de confiance intégrés au navigateur (VeriSign, Visa, etc) | ||
- | - S'il y arrive, ça prouve que le certificat a été émis par une autorité de confiance, tout va bien. S'il n'y arrive pas il va déchiffrer la signature avec la clé publique fournie avec le certificat et va alerter l' | ||
- | - Une fois le certificat validé, le navigateur va échanger des données chiffrées avec le serveur en utilisant des suites cryptographiques (voir plus de détails [[https:// | ||
- | |||
- | La révolution amenée par Let's Encrypt est qu'il a été reconnu comme une autorité de confiance et que, contrairement aux autres autorités de confiance, il propose des certificats gratuitement. | ||
- | |||
- | Toutes les commandes indiquées doivent être lancé avec l' | ||
- | |||
- | =====Activez le support SSL===== | ||
- | |||
- | Tout d' | ||
- | <code bash> | ||
- | |||
- | Maintenant que ça c'est fait, on va installer le client Certbot qui est utilisé pour générer les certificats SSL Let's Encrypt. | ||
- | |||
- | ===== Installation de Certbot ===== | ||
- | |||
- | Il va nous falloir installer la version présente dans les dépôts backports de Debian. Pour ajouter ces dépôts, ouvrez le fichier | ||
- | < | ||
- | |||
- | Ajoutez la ligne suivante au fichier | ||
- | < | ||
- | |||
- | Mettez à jour les dépôts | ||
- | <code bash> | ||
- | |||
- | On va maintenant pouvoir installer Certbot | ||
- | <code bash> | ||
- | |||
- | Maintenant que nous avons tout ce qu’il nous faut, passons à la création. | ||
- | |||
- | =====Création du certificat SSL sans wildcard ===== | ||
- | |||
- | Si vous avez besoin de créer un certificat wildcard (c'est à dire valide pour tous les sous-domaines également), | ||
- | |||
- | Commencez par créer un fichier lets_encrypt.ini (vous pouvez le nommer comme vous voulez) et mettez-y les lignes suivantes dedans : | ||
- | <code bash> | ||
- | authenticator = standalone | ||
- | renew-by-default = True | ||
- | agree-tos=true | ||
- | email = postmaster@votredomaine.fr | ||
- | domains=www.domaine.fr, | ||
- | rsa-key-size = 4096 | ||
- | </ | ||
- | |||
- | Ceci va être le fichier de config du client Certbot que l’on va lancer pour générer nos certificats SSL. Si vous vous demandez à quoi correspondent ces lignes : | ||
- | * authenticator = standalone : indique qu’on va utiliser un serveur web temporaire pour authentifier nos noms de domaine | ||
- | * renew-by-default = True : indique qu’on va renouveler des certificats existants | ||
- | * agree-tos=true : permet d’accepter les conditions d’utilisation de Certbot | ||
- | * email : c’est l’adresse sur laquelle seront envoyés les messages de renouvellement. Il vous faut la modifier | ||
- | * domains : indique les domaines pour lesquels vous voulez renouveler les certificats. Il vous faudra les modifier pour mettre vos nom de domaine | ||
- | * rsa-key-size = 4096 : permet de générer un certificat avec une clé RSA de 4096 bits et non pas de 2048 bits comme c’est le cas par défaut. | ||
- | |||
- | |||
- | Le client Certbot a besoin d' | ||
- | |||
- | On va donc commencer par couper Apache | ||
- | <code bash> | ||
- | |||
- | Il ne reste plus qu’à générer notre certificat. Pensez à modifier l’emplacement du fichier ini si vous ne l’avez pas mis dans le home de l’utilisateur root | ||
- | <code bash> | ||
- | |||
- | Les certificats vont être créés dans le répertoire | ||
- | < | ||
- | |||
- | Si tout c'est bien passé, vous devriez avoir le message suivant | ||
- | <code bash> | ||
- | IMPORTANT NOTES: | ||
- | - Congratulations! Your certificate and chain have been saved at | ||
- | / | ||
- | will expire on 2016-05-15. To obtain a new version of the | ||
- | | ||
- | - If you like Let's Encrypt, please consider supporting our work by: | ||
- | |||
- | | ||
- | | ||
- | </ | ||
- | |||
- | Si vous allez dans le répertoire / | ||
- | * privkey.pem qui est la clé privé SSL | ||
- | * cert.pem qui est le certificat SSL. (n'est utilisé que par les version d' | ||
- | * chain.pem qui contient des certificats intermédiaire (n'est utilisé que par les version d' | ||
- | * fullchain.pem qui est une concaténation des fichier cert.pem et chain.pem (n'est utilisé que par les version d' | ||
- | |||
- | ===== Création d’un certificat wildcard ===== | ||
- | |||
- | Let’s Encrypt permet également de générer des certificats wildcard. Les wildcard sont des certificats qui sont valables pour l’ensemble des sous-domaines. | ||
- | |||
- | Avec la méthode du chapitre précédent, | ||
- | |||
- | Pour vérifier que le nom de domaine pour lequel vous souhaitez générer un certificat vous appartient, Let’s Encrypt propose 2 types de challenges : | ||
- | * http-01 : il envoi une requête http | ||
- | * dns-01 : il demande la création d’un enregistrement TXT sur la zone du domaine | ||
- | |||
- | Dans le chapitre précédent, | ||
- | Je ne traiterai dans ce chapitre que le cas du serveur DNS auto-hébergé, | ||
- | |||
- | Il faut donc impérativement que vous ayez suivi la page [[gnu_linux: | ||
- | Seuls les chapitres 1 et 2 de cet articles, qui traitent de la création de la clé et de la configuration de Bind, sont indispensable. | ||
- | L’autre partie traite de la mise à jour de l’adresse ip, qui n’est pas utile pour les wildcard. | ||
- | Par contre, il ne vous faudra pas utiliser “update-policy”comme indiqué au début du chapitre 2, mais “allow-update” comme indiqué à la fin du chapitre 2 (que vous utilisiez ISPConfig ou non). | ||
- | |||
- | Il va également nous falloir installer un plugin pour mettre à jour notre zone DNS | ||
- | <code bash> | ||
- | |||
- | Créez un fichier ini, lets_encrypt.ini par exemple (vous pouvez l’appeler comme vous voulez). Voici ce qu’il doit y avoir dedans : | ||
- | < | ||
- | renew-by-default = True | ||
- | agree-tos=true | ||
- | email = toto@domaine.fr | ||
- | domains=domaine.fr, | ||
- | rsa-key-size = 4096 | ||
- | server = https:// | ||
- | dns-rfc2136-credentials = / | ||
- | |||
- | Expliquons toutes ces lignes : | ||
- | * authenticator = dns-rfc2136 : indique qu’on va utiliser le plugin dns-rfc2136. Il utilisera automatiquement le challenge dns-01 également | ||
- | * renew-by-default = True : accepte automatiquement le renouvellement du certificat | ||
- | * agree-tos=true : accepte automatiquement les conditions d’utilisation | ||
- | * email = toto@domaine.fr : indique l’adresse mail sur laquelle sera envoyé les mails d’information de renouvellement | ||
- | * rsa-key-size = 4096 : force la création d’un certificat avec une clé 4096 bits (2048 bits par défaut) | ||
- | * server = https:// | ||
- | * dns-rfc2136-credentials = / | ||
- | |||
- | Et voici ce que doit contenir le fichier dns.ini (pareil, vous pouvez l’appeler comme vous voulez) : | ||
- | < | ||
- | dns_rfc2136_server = IP du serveur DNS | ||
- | # Target DNS port | ||
- | dns_rfc2136_port = 53 | ||
- | # TSIG key name | ||
- | dns_rfc2136_name = nom de la clé | ||
- | # TSIG key secret | ||
- | dns_rfc2136_secret = contenu de la clé | ||
- | # TSIG key algorithm | ||
- | dns_rfc2136_algorithm = HMAC-SHA512</ | ||
- | |||
- | Si votre serveur DNS et votre serveur web (Apache ou Nginx) sont sur le même serveur, il vous faudra mettre 127.0.0.1 pour l’IP. | ||
- | Le nom de clé correspond au nom que vous avez donné à la clé dans le fichier named.conf.keys. | ||
- | Le contenu correspond au code secret de la clé. | ||
- | Si vous avez utilisé un algorithme autre que le HMAC-SHA512, | ||
- | |||
- | Comme ce fichier ini contient le code secret de la clé, chose assez sensible, on va modifier les droits de ce fichier | ||
- | <code bash> | ||
- | |||
- | Comme j’ai mis la clé dans le home de l’utilisateur root, lui seul pourra lire ce fichier. | ||
- | |||
- | Il ne reste plus qu’à générer notre certificat. Pensez à modifier l’emplacement du fichier ini si vous ne l’avez pas mis dans le home de l’utilisateur root | ||
- | <code bash> | ||
- | |||
- | Les certificats vont être créés dans le répertoire | ||
- | < | ||
- | |||
- | =====Configuration de Apache===== | ||
- | |||
- | Maintenant, il nous faut modifier les fichiers de config d' | ||
- | |||
- | |||
- | Dans votre fichier de configuration Apache pour votre nom de domaine, ajoutez les lignes suivantes : | ||
- | <code apache> | ||
- | < | ||
- | ServerName domaine.fr | ||
- | ServerAlias www.domaine.fr | ||
- | |||
- | DocumentRoot / | ||
- | | ||
- | ErrorLog / | ||
- | CustomLog / | ||
- | | ||
- | < | ||
- | Options -Indexes +FollowSymLinks +MultiViews | ||
- | AllowOverride none | ||
- | Require all granted | ||
- | </ | ||
- | |||
- | SSLEngine on | ||
- | SSLCertificateFile | ||
- | SSLCertificateKeyFile | ||
- | |||
- | Header always set Strict-Transport-Security " | ||
- | |||
- | |||
- | </ | ||
- | |||
- | # intermediate configuration | ||
- | SSLProtocol | ||
- | SSLCipherSuite | ||
- | SSLHonorCipherOrder | ||
- | SSLSessionTickets | ||
- | |||
- | SSLUseStapling On | ||
- | SSLStaplingCache " | ||
- | </ | ||
- | |||
- | Petite explication rapide de ces lignes : | ||
- | * SSLEngine on : active le SSL | ||
- | * SSLCertificateFile : indique le chemin du certificat SSL. | ||
- | * SSLCertificateKeyFile : indique le chemin vers la clé privée. | ||
- | * Header always set Strict-Transport-Security (HSTS) : sert à indiquer que les connexions doivent se faire en utilisant le https. | ||
- | * SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 : interdit l' | ||
- | * SSLCipherSuite : indique les suites cryptographiques qui peuvent être utilisées (des failles de sécurités ont été trouvées sur certaines suites). | ||
- | * SSLHonorCipherOrder : on indique que l' | ||
- | * SSLSessionTickets : on désactive les tickets de session TLS. Si cette fonction est activé sans redémarrer le serveur selon une périodicité appropriée (par exemple quotidiennement), | ||
- | * SSLUseStapling on et SSLStaplingCache : permet de vérifier les certificats SSL plus rapidement. | ||
- | | ||
- | Il faut également que toutes les connexions http (port 80) soient redirigées vers https (port 443) car le HSTS ne fonctionne pas sur tous les navigateurs. | ||
- | |||
- | Dans votre fichier de configuration Apache2 il faut rajouter ces lignes après < | ||
- | <code apache> | ||
- | Redirect / https:// | ||
- | </ | ||
- | |||
- | Redémarrez Apache et c'est tout bon. | ||
- | |||
- | Si jamais vous utilisez plusieurs fichiers de configurations, | ||
- | |||
- | Ouvrez le fichier de configuration SSL : | ||
- | <code bash> | ||
- | |||
- | Les configurations indiquées dans ce fichier seront appliquées à tous les vhosts. Avant la balise " | ||
- | <code apache> | ||
- | # intermediate configuration | ||
- | SSLProtocol | ||
- | SSLCipherSuite | ||
- | SSLHonorCipherOrder | ||
- | SSLSessionTickets | ||
- | |||
- | SSLUseStapling On | ||
- | SSLStaplingCache " | ||
- | |||
- | # HTTP Strict Transport Security (mod_headers is required) (63072000 seconds) | ||
- | Header always set Strict-Transport-Security " | ||
- | </ | ||
- | |||
- | On redémarre Apache : | ||
- | <code bash> | ||
- | |||
- | Il existe un site qui teste et note les connexions SSL. C'est [[https:// | ||
- | |||
- | ===== Automatisation du renouvellement des certificats Let’s Encrypt ===== | ||
- | |||
- | Les certificats Let’s Encrypt étant valable 3 mois, c’est vite chiant de devoir les renouveler à la main tous les 3 mois. On va donc voir comment automatiser tout ça. | ||
- | |||
- | Créez un fichier script_letsencrypt.sh (vous pouvez le nommer comme vous voulez). | ||
- | |||
- | Si vous utilisez un certificat standard (pas de wildcard), collez les lignes suivantes dedans (pensez à modifier le chemin des différents fichiers) | ||
- | <code bash> | ||
- | #!/bin/sh | ||
- | |||
- | # | ||
- | |||
- | if ! openssl x509 -checkend 86400 -in / | ||
- | then | ||
- | systemctl stop apache2.service | ||
- | certbot certonly --config / | ||
- | systemctl start apache2.service | ||
- | fi | ||
- | </ | ||
- | |||
- | Si vous utilisez un certificat wildcard, collez les lignes suivantes (pensez à modifier le chemin des différents fichiers) | ||
- | <code bash> | ||
- | #!/bin/sh | ||
- | |||
- | # | ||
- | |||
- | if ! openssl x509 -checkend 86400 -in / | ||
- | then | ||
- | certbot certonly --config / | ||
- | systemctl restart apache2.service | ||
- | rm / | ||
- | systemctl restart bind9 | ||
- | fi | ||
- | </ | ||
- | |||
- | Petite explication sur ce script : | ||
- | * Le “if ! openssl x509 -checkend 86400” va permettre de vérifier la date d’expiration du certificat SSL d’ici un temps donné (ici 86400 secondes, soit 24h) et n' | ||
- | * Ensuite, dans le cas où on utilise le challenge http-01 (certificats sans wildcard ), le script va arrêter Apache avec la commande <code bash> | ||
- | * Le client Certbot est exécuté avec le fichier de config lets_encrypt.ini grâce à la commande <code bash> | ||
- | * Une fois le certificat renouvelé, le script va relancer/ | ||
- | * Puis, dans le cas où on utilise le challenge dns-01 (certificat wildcard), on supprime le fichier journal de Bind9 et on le relance (ce fichier peut provoquer des erreurs) avec les commandes <code bash>rm / | ||
- | systemctl restart bind9</ | ||
- | |||
- | Pensez à rendre ce fichier exécutable | ||
- | <code bash> | ||
- | |||
- | Il ne nous reste plus qu’a lancer ce script tous les jours via le crontab de l’utilisateur root. | ||
- | |||
- | Editez le crontab du root | ||
- | <code bash> | ||
- | |||
- | Ajoutez la ligne suivante | ||
- | <code bash> 00 01 * * * / | ||
- | |||
- | Il vous faudra là aussi modifier le répertoire d’accès au script. | ||
- | |||
- | Le script sera lancé tous les jours à 1h du matin par l’utilisateur root et votre certificat sera renouvelé automatiquement 24h avant son expiration. | ||
- | Les sorties seront stockés dans le fichier / |