====== Web server - HTTPS grade A ====== Date: 2022 Installation faite sur Debian 11 La configuration restreint les navigateurs utilisables - Internet Explorer 11* - Chrome 70 - Firefox 63 Objectif de cette article: Obtenir un serveur répondant en HTTPS from scratch avec un grade A+ ===== Pré-requis: ===== Debian 11 ([[debian_11_-_perfect_server|Voir cet article]]) Note: On partira d'un serveur vierge avec uniquement le package apache2 d'installé ''apt install apache2 -y'' ===== Activation SSL sur Apache2 ===== Il est nécessaire d'activer l'écoute sur le protocol 443 dans le fichier ''/etc/apache2/ports.conf''. Le port 80 doit rester ouvert pour la négociation du certificat # /etc/apache2/ports.conf Listen 80 Listen 443 Quelques mods à activer: a2enmod ssl a2enmod headers a2enmod http2 * Liste à pucemod_ssl: Active la gestion du SSL/TLS * mod_headers: Personnalisation des en-têtes HTTP. Il sera utilisé pour informer le navigateur d'utiliser exclusivement HTTPS * http2: Plus rapide que HTTP/1.1, élimite d'anciens protocols de sécurité obsolète ===== Certbot ===== Source: https://certbot.eff.org/instructions?ws=apache&os=debianbuster # Installation de snapd apt install snapd snap install core snap refresh core # Installation de certbot snap install --classic certbot ln -s /snap/bin/certbot /usr/bin/certbot # On configure Let's Encrypt pour notre serveur: certbot --apache ✅ A partir d'ici, notre site devrait être en HTTPS certifié Let's Encrypt avec une configuration déjà correct faite par Certbot Le renouvellement se fait automatiquement, il y a un timer dans systemd. Il peut être simulé (dry-run) avec cette commande: ''certbot renew --dry-run'' ==== Modifications constatée dans la configuration Apache2: ==== ''/etc/apache2/sites-enabled/.conf'' # ... SSLEngine on SSLCertificateFile /etc/letsencrypt/live/httpslabs.gh3.be/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/httpslabs.gh3.be/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf # ... ===== Amélioration de la sécurité ===== Source: https://ssl-config.mozilla.org/ On se base sur une configuration "moderne" proposé par Mozilla ==== Redirection HTTP vers HTTPS. ==== **Note**: Cette manipulation n'est pas idéale car du man-in-the-middle est toujours possible le temps de la redirection vers HTTPS **Note2**: Le port 80 ne peut pas être fermé car (historiquement ?) le fichier .well-known-challenge utilisé par Let's Encrypt passe par HTTP ''/etc/apache2/sites-enabled/.conf'' # ... RewriteEngine On RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/ RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L] # ... ''/etc/apache2/sites-enabled/.conf'' # ... # Activation de HTTP/2, rétrocompatibilité vers HTTP/1.1 si besoin (mod_http2 Protocols h2 http/1.1 # Activation du HTTP Strict Transport Security (mod_header) Header always set Strict-Transport-Security "max-age=63072000" # ... # OCSP Stapling - https://fr.wikipedia.org/wiki/Agrafage_OCSP SSLUseStapling On SSLStaplingCache "shmcb:logs/ssl_stapling(32768)" ==== Modification du chiffrement ==== On a remarqué précédemment que Certbot a créé un fichier de configuration des options SSL, on modifiera là dedans. ''/etc/letsencrypt/options-ssl-apache.conf'' # ... # SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLProtocol TLSv1.2 TLSv1.3 #SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305 # ... 2 changements ici : * Support de TLSv1.2 et TLSv1.3\\ **Note**: curl 7.83.1 ne supporte pas TLSv1.3\\ **Note2**: Internet Explorer 11 ne supporte pas TLSv1.3\\ https://caniuse.com/tls1-3 * Désactivation des protocoles DHE-RSA-AES128-GCM-SHA256 et DHE-RSA-AES256-GCM-SHA384\\ DH (Diffie Hellman) est déprécié par rapport à Eliptic Curve Diffie-Hellman (ECDH)