Sécurisation SSL / TLS de apache
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
DH et ECDH
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
ECDH
Par défaut, apache utilise ECC 256 bits (secp256r1) 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, chrome ne supporte que les courbes NIST P-256 et P-384 (pas P-521)
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.
SSLCipherSuite
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"
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"
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.
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