Apache2 : Installation serveur web de base + SSL

Apache2 : Installation serveur web de base + SSL

Table of Contents

Contexte

Cet article à pour but de servir de base pour l'installation d'un serveur web sous Apache2 avec un certificat SSL.

Let's Encrypt est utilisé et la résolution du challenge se fera sur le port 666 (donc sans interruption de service).

Réalisé sous Debian 11

Installation Apache2

Installation du serveur web apache2 :

sudo apt install apache2

Modification du fichier /etc/apache2/apache2.conf comme suit :

# Les variables d'environnement sont définies dans /etc/apache2/envvars
DefaultRuntimeDir ${APACHE_RUN_DIR}
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

HostnameLookups Off

ErrorLog ${APACHE_LOG_DIR}/error.log

LogLevel warn

IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf

Include ports.conf

<Directory />
# Pas de suivi des liens symboliques
    Options -FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>

<Directory /usr/share>
    AllowOverride None
    Require all granted
</Directory>

<Directory /var/www/>
# Pas de listage des fichiers du site mais ok pour le suivi des liens symboliques
    Options -Indexes +FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

AccessFileName .htaccess

<FilesMatch "^\.ht">
    Require all denied
</FilesMatch>

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf

Modification du fichier /etc/apache2/ports.conf comme suit :

# Ecoute sur le port 80 et 443
Listen 80
Listen 443

Modification du fichier /etc/apache2/conf-available/security.conf comme suit :

# Definit les informations du serveur retourné par l'en-tête HTTP
ServerTokens Prod
# Serveur version et nom du vhost désactivés
ServerSignature Off
TraceEnable Off

Activation des modules de bases :

sudo a2enmod rewrite actions headers expires ssl

Activation du site par défaut en SSL :

sudo a2ensite default-ssl

Redémarrage du serveur web apache2 :

sudo systemctl restart apache2

A ce stade, le serveur web doit être accessible : http://ip_srv_web/ et https://ip_srv_web/ (erreur de certificat)

Une fois cette vérification faites, désactivation des sites par défaut :

sudo a2dissite 000-default default-ssl

Puis rechargement de la configuration du serveur web :

sudo systemctl reload apache2

Certificat SSL

Installation de Let's Encrypt :

sudo apt install letsencrypt

Modification du fichier /etc/apache2/mods-available/proxy.conf comme suit :

# Permet d'effectuer les challenges acme sur le port 666
<IfModule mod_proxy.c>
            ProxyPass "/.well-known/acme-challenge/" "http://127.0.0.1:666/.well-known/acme-challenge/" retry=1
            ProxyPassReverse "/.well-known/acme-challenge/" "http://127.0.0.1:666/.well-known/acme-challenge/"
            <Location "/.well-known/acme-challenge/">
                ProxyPreserveHost On
                Order allow,deny
                Allow from all
                Require all granted
            </Location>
      </IfModule>

Activation des modules nécessaires :

sudo a2enmod proxy proxy_http ssl

Redémarrer le serveur web apache2 :

sudo systemctl restart apache2

Edition de la crontab pour le renouvellement automatique du certificat :

sudo crontab -e

Indiquer un renouvellement tous les dimanche à 5h00 du matin :

# Autorenew let's encrypt cert
00 05 * * 0 letsencrypt renew --standalone --preferred-challenges http-01 --http-01-port 666

Générer le certificat :

sudo letsencrypt certonly -d "monsite.example.org" --standalone --preferred-challenges http-01 --http-01-port 666 -m monadresse@email.org --agree-tos -n

Au préalable, un enregistrement DNS correspondant à mon site.example.org a été fait dans la zone DNS example.org.

Configuration vhost

Création du fichier /etc/apache2/sites-available/monsite.example.org.conf :

# Example pour le site : monsite.example.org
# DirectoryRoot : /var/www/monsite.example.org/www/
# Les logs seront dans /var/log/apache2/
<VirtualHost *:80>
  ServerName monsite.example.org
  Redirect Permanent / https://monsite.example.org/
</VirtualHost>
<VirtualHost *:443>
  ServerName monsite.example.org

  LogLevel warn 
  ErrorLog "|/usr/bin/rotatelogs -lc /var/log/apache2/error.monsite.example.org.%Y.%m.%d 86400"
  CustomLog "|/usr/bin/rotatelogs -lc /var/log/apache2/access.monsite.example.org.%Y.%m.%d 86400" combined

  SSLEngine on
  SSLCertificateFile      /etc/letsencrypt/live/monsite.example.org/cert.pem
  SSLCertificateKeyFile   /etc/letsencrypt/live/monsite.example.org/privkey.pem
  SSLCertificateChainFile  /etc/letsencrypt/live/monsite.example.org/chain.pem

  DocumentRoot /var/www/monsite.example.org/www
  <Directory /var/www/monsite.example.org/www/>

    Require all granted 

    AllowOverride All
    DirectoryIndex index.html

   </Directory>
</VirtualHost>
SSLProtocol             -all +TLSv1.2
SSLCipherSuite      +HIGH:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305-D:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305-D:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305-D:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA
SSLHonorCipherOrder     on
SSLCompression          off
SSLSessionTickets       off

Création de l'arborescence du site :

sudo mkdir -p /var/www/monsite.example.org/www/

Déplacer le fichier index.html de base à des fins de test :

sudo mv /var/www/html/index.html /var/www/monsite.example.org/www/

Attribuer les droits pour www-data :

sudo chown -R www-data:www-data /var/www/

Activation du site monsite.example.org :

sudo a2ensite monsite.example.org

Recharger le serveur web apache2 :

sudo systemctl reload apache2

Vérification

Si tout c'est bien passé, le site monsite.example.org doit être accessible à l'adresse https://monsite.example.org sans erreur de certificat.

L'URL http://monsite.example.org doit rediriger vers https://monsite.example.org

Pour tester le renouvellement du certificat SSL sur le port 666 :

sudo letsencrypt renew --standalone --preferred-challenges http-01 --http-01-port 666 --dry-run

Sujet non abordé

  • Les règles de pare-feu
Les commentaires sont fermés.