Apache/HTTPS
Généralités
modifierContrairement 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.
Types de clé
modifierUn 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 :
- 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/.
Linux
modifierMod SSL
modifierAjouter le module SSL à Apache 2[6] :
# a2enmod ssl
Ajouter Listen 443 à /etc/apache2/ports.conf
# echo "Listen 443" >> /etc/apache2/ports.conf
Générer un certificat autosigné :
# apache2-ssl-certificate
Si la commande est introuvable :
# apt-get install ssl-cert # /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem
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é :
<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
modifierPour 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
.
Windows
modifierPrérequis
modifierAjouter 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é
modifierLancer 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é
modifierLe 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>
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
modifierEntrer 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}
Références
modifier- ↑ https://www.startssl.com/?app=21
- ↑ https://www.isicca.info/certificat-ssl-generer-son-certificat/
- ↑ http://doc.ubuntu-fr.org/tutoriel/comment_creer_un_certificat_ssl
- ↑ https://www.ssl247.fr/certificat-ssl-gratuit
- ↑ https://letsencrypt.org/
- ↑ http://doc.ubuntu-fr.org/tutoriel/securiser_apache2_avec_ssl
- ↑ http://www.finalclap.com/faq/414-certificat-ssl-https
- ↑ https://httpd.apache.org/docs/trunk/fr/mod/mod_headers.html
- ↑ http://content-security-policy.com/