Aller au contenu

Apache/HTTPS

Un livre de Wikilivres.

Généralités

[modifier | modifier le wikicode]

Contrairement au protocole HTTP, HTTPS garantit la confidentialité et l'intégrité des données échangées entre un serveur web et ses clients, et par conséquent il convient mieux aux transactions sensibles comme les flux bancaires. En effet il permet de se prémunir de l'attaque de l'homme du milieu en cryptant les communications.

Pour mettre en place ce protocole, il faut juste activer l'extension Apache et ajouter une directive pour le port 443[1] avec un certificat électronique.

Un certificat électronique (.crt) est issu d'une demande d'identification (.csr pour Certificate Signing Request[2]). Ce dernier est généralement payant, à renouveler chaque année, car délivré par une autorité de certification, mais :

Avertissement à accepter par les visiteurs en cas de certificat autosigné.
  • Il est possible de le créer soi-même[3], ce qui aura pour effet d'afficher un avertissement d'exception de sécurité aux visiteurs comme celui de l'image ci-contre. D'ailleurs sur Ubuntu, il existe déjà /etc/ssl/private/ssl-cert-snakeoil.key, mais l'avertissement sera le même. Pour en générer une nouvelle du même type, se reporter aux paragraphes ci-après.
  • Certains sites comme GeoTrust en propose un valide, mais valable seulement 30 jours[4].
  • La meilleure solution gratuite est Let's Encrypt[5], car elle permet de créer et configurer (ou renouveler) des sites HTTPS en une minute seulement, avec possibilité d'un renouvellement automatique par cron, grâce à https://certbot.eff.org/.

Ajouter le module SSL à Apache 2[6] :

commande nécessitant les privilèges root
# a2enmod ssl

Ajouter Listen 443 à /etc/apache2/ports.conf

commande nécessitant les privilèges root
# echo "Listen 443" >> /etc/apache2/ports.conf

Générer un certificat autosigné :

commande nécessitant les privilèges root
# apache2-ssl-certificate

Si la commande est introuvable :

commande nécessitant les privilèges root
# apt-get install ssl-cert
# /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem
 Cette étape peut aussi être réalisée avec OpenSSL.

On configure un site en SSL :

 sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/ssl
 sudo ln -s /etc/apache2/sites-available/ssl /etc/apache2/sites-enabled/ssl 

Éditez le fichier de configuration /etc/apache2/sites-enabled/ssl pour qu'il accepte les connexions sur le port 443 :

 NameVirtualHost *:443
 <VirtualHost *:443>
 (...les répertoires et autres configurations si désiré)

Éditez le fichier de configuration /etc/apache2/sites-available/default pour qu'il accepte les connexions sur le port 80 :

 NameVirtualHost *:80
 <VirtualHost *:80>
 (...les répertoires et autres configurations si désiré)

et dans le milieu du fichier /etc/apache2/sites-available/ssl ajoutez :

 SSLEngine On
 SSLCertificateFile /etc/apache2/ssl/apache.pem

Puis redémarrez apache :

 sudo /etc/init.d/apache2 restart


Pour rendre possible la connexion en SSL, la configuration Apache suivante :

 vim /etc/apache2/apache2.conf
# ou
 vim /etc/apache2/sites-available/default-ssl
 a2ensite default-ssl

doit comprendre dans chaque vhost concerné :

 Fichier : le fichier de configuration
 <VirtualHost *:443>
   SSLEngine on
   #SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
   #SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
   SSLCertificateFile /etc/apache2/ssl/apache.crt
   SSLCertificateKeyFile /etc/apache2/ssl/apache.key
   ...

Puis on relance Apache :

service apache2 reload

Pour tester :

curl https://monURL

Si la clé nécessite un mot de passe :

 SSLPassPhraseDialog exec:/etc/ssl/nomdedomaine.fr.pwd

Personnalisation

[modifier | modifier le wikicode]

Pour personnaliser les directives (ex : ajouter SuexecUserGroup), il suffit de copier le contenu de :

vim /etc/apache2/apache2.conf

dans

vim /etc/apache2/sites-available/default-ssl.conf

en remplaçant :80 par :443.

Ajouter le module SSL en décommentant la ligne suivante de httpd.conf :

#LoadModule ssl_module modules/mod_ssl.so

La directive sur le port 443 s'effectue ensuite dans le fichier suivant (vide par défaut), selon le logiciel :

  • C:\Program Files (x86)\EasyPHP\binaries\apache\conf\inc_virtual_hosts.conf
  • C:\Program Files (x86)\WAMP\bin\apache\Apache2.2.21\conf\extra\httpd-vhosts.conf

Mais httpd.conf contient un commentaire avec : #<VirtualHost _default_:443>.

Il faut y renseigner l'emplacement du ssl.crt ci-dessous à créer avant de décommenter, sous peine d'erreur Apache.

Création du certificat autosigné

[modifier | modifier le wikicode]

Lancer une console DOS :

>cd "C:\Program Files (x86)\EasyPHP\binaries\apache\bin"
>openssl req -config "C:\Program Files (x86)\EasyPHP\binaries\php\php_runningversion\extras\ssl\openssl.cnf" -new -out Certificat_1.csr
WARNING: can't open config file: c:/openssl-1.0.1e/ssl/openssl.cnf
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
..........++++++
.........++++++
writing new private key to 'privkey.pem'
Enter PEM pass phrase:
...
>openssl rsa -in privkey.pem -out Certificat_1.key
>openssl x509 -in Certificat_1.csr -out Certificat_1.cert -req -signkey Certificat_1.key -days 365

Cela a généré les fichiers à renseigner dans la directive :

  • C:\Program Files (x86)\EasyPHP\binaries\apache\bin\Certificat_1.csr.
  • C:\Program Files (x86)\EasyPHP\binaries\apache\bin\Certificat_1.key.
  • C:\Program Files (x86)\EasyPHP\binaries\apache\bin\Certificat_1.cert.

Le CSR n'a pas besoin d'être renseigné dans les directives, le certificat fichier expire après 365 jours[7].

Autres aspects de sécurité

[modifier | modifier le wikicode]

Le module headers[8] peut assurer la protection contre le XSS[9] et le clickjacking. Exemple :

  <IfModule mod_headers.c>
        # Filtre sur les provenances des scripts, séparées par des espaces
        Header set Content-Security-Policy "default-src 'self' *.nomdedomaine.fr *.nomdedomaine.com"
        # Indication anti-XSS pour les navigateurs
        Header always set X-XSS-Protection "1; mode=block" 
        # Anti-clickjacking             
        Header always set X-FRAME-OPTIONS "SAMEORIGIN"
        # Antivol de cookie         
        Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
  </IfModule>

Logo

Cela bloque les iFrames.

Pour tester une configuration, mieux vaut commencer par un .html plutôt que de la déployer sur tout le serveur en le redémarrant puis de faire machine arrière. Si en définissant la règle la plus permissive Firefox bloque tout de même quelque chose (Content Security Policy: Les paramètres de la page ont empêché le chargement d'une ressource à self ), il s'agit d'un bug connu qui n'affecte pas les autres navigateurs :

<head>
    <meta http-equiv="Content-Security-Policy" content="default-src *">
</head>

Par ailleurs, des sites d'audit gratuits peuvent ensuite révéler s'il reste des failles.

Rediriger le flux HTTP vers HTTPS

[modifier | modifier le wikicode]

Entrer la configuration suivante dans le fichier https.conf :

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Pour le webhosting, le réglage doit être effectué à l'aide d'un fichier .htaccess, avec la configuration suivante :

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}