Sécurisation SSL / TLS de apache

De Linux Server Wiki
Sauter à la navigation Sauter à la recherche


1 NB :

  • il semblerait que sslprotocol ne puisse pas être défini dans une vhost (pour être exact, seul le premier sslprotocol lu par apache est pris en compte. Le mieux est de le définir dans /etc/apache2/mods-enabled/ssl.conf
  • SSLCipherSuite peut lui être défini plusieurs fois à condition d'aller du moins sécurisé (celui avec le plus de ciphers autorisés) au plus sécurisé (celui avec les ciphers les plus restrictifs) (le moins sécurisé dans ssl.conf, le plus sécurisé dans la vhost)
  • l'ordre des autorités intermédiaires dans le fichier de chaine de certification : du plus proche du certificat au plus éloigné. En gros : cat signing_ca.pem intermediate_ca.pem root_ca.pem > cachain.pem

2 DH et ECDH

2.1 DH

Par défaut, apache utilise les paramètres DH définis dans la RFC 3526 en utilisant une taille de paramètre de la même taille que la clé privé utilisé par le site qui est sécurisé.
vous pouvez cependant forcer un paramètre dh personnalisé pour chaque site https en ajoutant le paramètre DH après le certificat ssl défini par la directive SSLCertificateFile :

openssl dhparam 4096 -out /etc/ssl/private/dh4096.pem
cat /etc/ssl/private/dh4096.pem >> /etc/ssl/votresite.tld.pem


A partir de apache 2.4.8 et openssl 1.0.2, on peut définir un paramètre dh personnalisé global (pour tous les sites https géré par le serveur apache) avec la directive suivante :

SSLOpenSSLConfCmd DHParameters /etc/ssl/private/dh4096.pem

2.2 ECDH

Par défaut, apache utilise ECC 256 bits (secp256r1 aussi parfois nommé prime256v1) quelque soit la taille de la clé rsa utilisé.
Vous pouvez cependant forcer l'utilisation d'une courbe ECC plus grande en l'ajoutant après le certificat ssl défini par la directive SSLCertificateFile (il faudra donc le faire pour chaque site que vous sécurisez en ssl ...) :

openssl ecparam -name secp384r1 -out /etc/ssl/private/ecdhsecp384r1.pem
cat /etc/ssl/private/ecdhsecp384r1.pem >> /etc/ssl/votresite.tld.pem

pour voir la liste des courbes disponibles :

openssl ecparam -list_curves

A l'heure ou j'écris ces lignes :

  • firefox 52 supporte les courbes x25519, secp256r1, secp384r1 et secp521r1
  • chrome 57 supporte les courbes tls_grease_8a8a, x25519, secp256r1 et secp384r1
  • vous pouvez vous faire une idée des courbes supportés pour chaque navigateur ici : https://www.ssllabs.com/ssltest/clients.html


On peut aussi vérifier la courbe utilisé :

openssl ecparam -in /etc/ssl/private/ecdhsecp384r1.pem -text -noout

Dès Apache 2.4.8 et OpenSSL 1.0.2, on peut dire a apache quelle courbe utiliser de manière globale par ordre de priorité et ce pour tous les sites (plus de necessité de le faire dans chaque fichier .pem) :

SSLOpenSSLConfCmd Curves sect571r1:secp521r1:secp384r1:prime256v1
SSLOpenSSLConfCmd ECDHParameters Automatic

La première directive donne la liste des courbes utilisables, la seconde défini le mode automatique qui choisira la courbe la plus solide disponible a la fois sur le client et le serveur lors de la négociation TLS.

Notez que contrairement à DH, pour ECDH on précise simplement quelle courbe utiliser et non pas un fichier.

3 SSLCipherSuite

3.1 Non vulnérable a l'attaque RC4, mais vulnérable a BEAST

SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4 !EXPORT"

3.2 non vulnérable a BEAST, vulnérable a l'attaque RC4

SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !EXPORT"

3.3 Configuration recommandée pour une sécurité maximum

SSLProtocol             all -SSLv2 -SSLv3 -TLSv1
SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK

Accessoirement, mozilla a publié | un guide ainsi qu'un | générateur de configuration plutôt efficace.

4 tests

openssl s_client -connect yoursite.tld:443 -ssl3
openssl s_client -connect yoursite.tld:443 -tls1
openssl s_client -connect yoursite.tld:443 -tls1_1
openssl s_client -connect yoursite.tld:443 -tls1_2
nmap --script ssl-cert,ssl-enum-ciphers -p 443,465,993,995 yoursite.tld

https://ssllabs.com
https://tls.imirhil.fr

5 HSTS, HPKP et DANE/TLSA