====== Https et certificat ssl ====== Cet article est en brouillon et contient des informations fragmentaires. Si vous en avez l'occasion, complétez-le, ajoutez des liens vers des pages mieux fournies. Prenez avec précaution les informations contenues ici et vérifiez. ===== Pourquoi https ? ===== Lorsque vous vous rendez sur un site internet, un flux de données circulent entre votre ordinateur et celui du serveur où le site est hébergé. Pour certains sites, ça n'a pas grande importance que ce flux soit lisible par tous, mais à partir du moment où vous devez entrer un mot de passe, vous devez passer par le protocole "https" qui garantit que les échanges entre vous et le serveur sont chiffrés. Donc, que les échanges ne sont pas faciles à espionner. * [[http://www.bitdefender.fr/blog/Pourquoi-le-protocole-HTTPS-est-%28toujours%29-bon-pour-vous-437.html|Développement sur pourquoi https, c'est mieux pour celui qui navigue sur le web.]] * [[http://sebsauvage.net/comprendre/ssl/index.html|Un article plus complet de Sebsauvage sur la question.]] * Pour résumer, https, c'est un peu comme le préservatif : ça protège pas de tout, mais c'est le minimum pour éviter les ennuis. Https est à présent une norme pour tout le contenu web et les navigateurs n'aiment pas du tout tomber sur des pages qui ne sont pas protégées par ce protocole. Soyez sérieux, mettez https partout. ===== Let's Encrypt - Certbot ===== Certbot est un client permettant d'obtenir un certificat auprès de l'entité Let's Encrypt. Il est inclus dans la plupart des distributions linux, dont Debian : sudo apt install certbot Lors de sa première utilisation (et suivant les options qu'on lui donne), il pose quelques questions, demandant notamment un email pour recevoir des notifications quand on oublie de renouveler. Il faut en effet demander tous les trois mois à renouveller le certificat, l'action s'automatisant très bien. ==== Apache ==== Je déconseille de laisser certbot ajouter tout seul les informations dans Apache, il fait des crasses. Générez un certificat, modifiez à la main vos configurations Apache, ce sera mieux. Par défaut, les certificats se trouvent dans ''/etc/letsencrypt/live/''. Demander la certification d'un seul domaine sans ajouter des crasses partout : sudo certbot certonly --standalone -d mondomain.org Les chemins à ajouter dans ''/etc/apache2/site-enabled/MONSITE-le-ssl.conf'' seront : SSLCertificateFile /etc/letsencrypt/live/mondomain.org/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/mondomain.org/privkey.pem Pensez à rediriger tout votre flux du port 80 (http) vers le 443 (https), puis à redémarrer Apache. Plus d'informations sur la [[fr:securite_sysadmin#securiser_apache|configuration sécurisée d'Apache]]. === Sous-domaines et domaines différents sur la même machine === Il vaut mieux faire un fichier par //vhost// dans Apache. Faites uniquement les versions non sécurisées (port 80), let's encrypt génère automatiquement les versions sécurisées (port 443, soit le "https"). Vous pouvez désactiver les versions non sécurisées ensuite. Let's encrypt semble repérer correctement les sous domaines dans le même fichier (nom1.mondomaine.com, nom2.mondomaine.com, etc.)((À éviter quand même, un fichier par sous-domaine c'est mieux.)), mais pas les noms de domaines différents (mondomaine.com et mondomaine2.com par exemple), qui doivent impérativement être dans deux fichiers de configuration différents. ==== Sur Nginx ==== Nginx a besoin d'être éteint pour obtenir un certficat. Commencez par demander un certificat SSL. Il faut arrêter nginx sinon ça fait une erreur : sudo service nginx stop sudo certbot certonly --standalone -d monsite.mondomaine.org sudo service nginx start Voir [[fr:nginx#exemple_de_configuration|l'exemple de configuration de nginx]] et la partie sur le port "443" pour ensuite déclarer correctement le certificat généré. Lors des renouvellements, éteindre à nouveau nginx et renouveler avec la commande suivante : sudo certbot renew ==== Renouveler le certificat ==== Pour renouveler le certificat, il suffit de lancer la commande suivante : sudo certbot renew Si vous n'avez que les certificats à renouveller sans laisser let's encrypt bidouiller vos conf, alors il faudra éteindre le serveur web (nginx ou apache) avant de renouveller, puis rallumer. Cela peut se faire en laissant Certbot gérer : sudo certbot renew --pre-hook "service apache2 stop" --post-hook "service apache2 restart" sudo certbot renew --pre-hook "service nginx stop" --post-hook "service nginx restart" Un cron tout les 90 jours suffirait à renouveler les certificats. Exemple de cron, avec renouvellement/vérification tous les mois (à 4h7 du matin) et log de ce qui se fait : 7 4 * */1 * /usr/bin/certbot renew --pre-hook "service nginx stop" --post-hook "service nginx restart" > /root/renewlets.log Le log vous permettra de vérifier s'il y a eu des soucis. ==== Supprimer un certificat ==== Absolument nécessaire si on migre un site de machine... Il faut alors virer les restes sur l'ancienne machine, sinon cela fera des erreurs. sudo certbot delete --cert-name mondomaine.org ===== Client Let's Encrypt ACMEd ===== Le client ACMEd est à privilégier si vous voulez une installation sécurisée. Voir le détail dans la [[fr:acmed|page dédiée]]. ===== Installer un certificat auto-signé ===== Un certificat auto-signé va générer une alerte sur tout navigateur sérieux. Le certificat installé est très basique et sert uniquement sur un serveur de test pour des tests autour de https. Il ne sera reconnu par aucune autorité. Il existe à présent Let's encrypt, qui vous fournit gratuitement un certificat reconnu. Il n'y a quasiment aucune raison de ne pas l'utiliser, donc oubliez les certificats auto-signés et utilisez Let's encrypt. Le certificat auto-signé peut tout de même présenter un peu d'intérêt, en local ou si on travaille dans une vm sans accès web. C'est la raison pour laquelle la doc reste ici. Mais PAS en production. **En root** Installer le paquet ''ssl-cert''. Il va installer un certificat pré-configuré pour le serveur sur lequel il est installé. Vérifier que dans ''/etc/apache2/sites-available/default-ssl.conf'', les options ''SSLCertificateKeyFile'' et ''SSLCertificateFile'' pointent vers le certificat SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key Activer la prise en charge de SSL : a2ensite default-ssl a2enmod ssl service apache2 restart Pour plus de détails sur l'installation d'un certificat auto-signé, si on souhaite utiliser une méthode moins "clé en main" : * http://blog.moncoindunet.fr/linux/openssl-creer-un-certificat-auto-signe/ * http://doc.ubuntu-fr.org/tutoriel/securiser_apache2_avec_ssl ===== Améliorer et tester la sécurité du site via https ===== Pour vérifier la qualité de la sécurisation de l'accès au site : * https://www.ssllabs.com/ssltest/analyze.html : permet de voir les plus grosses erreurs * https://observatory.mozilla.org/ : Mozilla est plus exigeant et permet d'avoir un site bien sécurisé * https://cryptcheck.fr/ qui est terriblement exigeant... attention, certains paramètres qui vous vaudront un F (parce que c'est vrai, c'est pas sécu) peuvent aussi empêcher certains de vos internautes de vous voir (parce qu'ils ont des vieux navigateurs pas à jour). Mais ces clients méritent-ils de voir votre site ? Let's encrypt est pas mal... mais pas parfait((En tout cas, au moment où je rédige ces lignes, 30 décembre 2016.)). La taille de la clé est un peu petite ; il faut avouer que la génération d'une clé plus longue peut prendre un très long temps. On va donc [[https://f4fia.wordpress.com/2015/08/09/configurer-son-serveur-web-en-https/|générer de nouveaux paramètres Diffie-Hellman]]. cd /etc/letsencrypt/live/MONSITE.COM/ openssl dhparam -out dhparams.pem 4096 Puis ajouter cette ligne dans ''/etc/apache2/site-enabled/MONSITE-le-ssl.conf'' : SSLDHParametersFile /etc/letsencrypt/live/MONSITE.COM/dhparams.pem Voir aussi [[fr:securite_sysadmin#module_ssl|la configuration de SSL.]] {{tag>Serveur Web Tutoriel Brouillon}}