améliorations sur la config d'un serveur HTTPS

This commit is contained in:
gcolpart 2016-10-27 02:38:14 +02:00
parent 63adcdedfe
commit 61ad9b6d54

View file

@ -7,7 +7,8 @@ SSL (*Secure Sockets Layer*) est un protocole de sécurisation des échanges ré
Cela se base sur un principe de clé privée et clé publique (certificat) signée par une autorité de certification. Cela se base sur un principe de clé privée et clé publique (certificat) signée par une autorité de certification.
On parle désormais de **SSL/TLS** car les normes récentes ont renommé SSL en TLS (*Transport Layer Security*). On parle désormais de **SSL/TLS** car les normes récentes ont renommé SSL en TLS (*Transport Layer Security*).
<https://www.openssl.org/docs/> * <https://www.openssl.org/docs/>
* <https://wiki.mozilla.org/Security/Server_Side_TLS>
## Gestion clé privée / certificat ## Gestion clé privée / certificat
@ -286,6 +287,7 @@ L'avantage de StartSSL est que pour 150 EUR/an, vous pouvez obtenir la validatio
Plusieurs failles de sécurité ont touché SSL/TLS ou le logiciel OpenSSL ces dernières années, Plusieurs failles de sécurité ont touché SSL/TLS ou le logiciel OpenSSL ces dernières années,
il convient donc de traiter avec attention la question de la configuration au sein des différents logiciels. il convient donc de traiter avec attention la question de la configuration au sein des différents logiciels.
Nous détaillons ci-dessous quelques failles célèbres, une liste de toutes les failles étant [disponible sur le wiki de Mozilla](https://wiki.mozilla.org/Security/Server_Side_TLS#Attacks_on_SSL_and_TLS).
#### Faille PODDLE #### Faille PODDLE
@ -313,66 +315,60 @@ Debian [a corrigé cette faille en janvier2015](https://security-tracker.debian.
### Avoir A+ sur SSL LABS ### Avoir A+ sur SSL LABS
L'outil https://www.ssllabs.com/ssltest/analyze.html permet d'avoir une note symbolique sur la configuration de son serveur HTTPS. L'outil <https://www.ssllabs.com/ssltest/analyze.html> permet d'avoir une note **symbolique** sur la configuration d'un serveur HTTPS.
Voici les principaux critères sur une installation classique : Voici quelques critères pour avoir une bonne note :
- Il faut que le certificat et le certificat intermédiaire soit signé en SHA256, le SHA1 est déprécié ; - la taille de la clé privée est d'au moins 2048 bits (4096 bits est recommandé mais cela impacte les performances) ;
- le certificat et le(s) certificat(s) intermédiaire(s) utilisent des fonctions de hashage en SHA-2 (et non plus en SHA-1 qui est déprécié) ;
- le serveur HTTPS n'autorise pas l'utilisation d'algorithmes de chiffrement « faibles » avec le client (comme RC4, MD5, etc.) ;
- pour implémenter le principe de *Forward Secrecy*, le serveur HTTPS utilise des [paramètres DH (Diffie-Hellman) d'au moins 2048 bits](https://weakdh.org/) (ou 4096 bits si c'est la taille de la clé privée) ;
- le serveur HTTPS autorise le protocole TLS 1.2 ;
- le serveur HTTPS permet la [réutilisation des sessions SSL](https://vincent.bernat.im/fr/blog/2011-sessions-ssl-rfc5077.html) ;
- le serveur HTTPS support l'*OCSP stapling* ;
- un entête *Strict-Transport-Security* indique que le site n'est consultable qu'en HTTPS pendant un certain temps.
Astuce pour StartSSL, le certificat intermédiaire signé en SHA256 est disponible ici : https://www.startssl.com/certs/class1/sha2/pem/sub.class1.server.sha2.ca.pem (class1) ou https://www.startssl.com/certs/class2/sha2/pem/sub.class2.server.sha2.ca.pem (class2) Plus généralement, on utilisera la documentation de référence <https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations> et notamment le [générateur de configuration SSL de Mozilla](https://mozilla.github.io/server-side-tls/ssl-config-generator/).
- Il faut désactiver les chiffrements dits « faibles », et ajouter un header Strict-Transport-Security pour indiquer que le site n'est consultable qu'en HTTPS.
- paramètres DH au moins 2048 (impossible en Debian 7/Apache)
- Activer le cache pour la reprise de session.
- Avoir un certificat de >=4096 bits, ou un DH de >=4096 bits.
Générer le dhparam.pem ainsi (attention ça prend un temps fou) :
~~~
# openssl dhparam -out /etc/ssl/dhparam.pem 4096
~~~
#### Configuration Apache #### Configuration Apache
En pratique avec Apache : En pratique avec Apache (sous Debian 8), voici une configuration SSL avancée :
~~~{.apache} ~~~{.apache}
SSLCipherSuite AES128+EECDH:AES128+EDH
SSLProtocol All -SSLv2 -SSLv3 SSLProtocol All -SSLv2 -SSLv3
SSLCipherSuite AES128+EECDH:AES128+EDH
SSLHonorCipherOrder On SSLHonorCipherOrder On
SSLCompression off SSLCompression off
#Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains" SSLSessionTickets off
SSLSessionCache shm:/var/log/apache2/ssl_gcache_data(512000) ??? SSLSessionCache shmcb:/var/log/apache2/ssl_sessioncache(10240000)
SSLSessionCacheTimeout 600 ??? SSLUseStapling yes
~~~ SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:/var/log/apache2/ssl_staplingcache(2048000)
Si votre Apache est trop vieux????, mettre le SSLCipherSuite suivant : Header always set Strict-Transport-Security "max-age=2592000"
~~~
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA128:DHE-RSA-AES128-GCM-SHA384:DHE-RSA-AES128-GCM-SHA128:ECDHE-RSA-AES128-SHA384:ECDHE-RSA-AES128-SHA128:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA384:AES128-GCM-SHA128:AES128-SHA128:AES128-SHA128:AES128-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4
~~~ ~~~
#### Configuration Nginx #### Configuration Nginx
En pratique avec Nginx : En pratique avec Nginx (sous Debian 8), voici une configuration SSL avancée :
~~~ ~~~
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "AES128+EECDH:AES128+EDH"; ssl_ciphers "AES128+EECDH:AES128+EDH";
ssl_prefer_server_ciphers on;
ssl_session_tickets off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=2592000";
ssl_dhparam /etc/ssl/dhparam.pem; ssl_dhparam /etc/ssl/dhparam.pem;
#add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
ssl_session_cache shared:SSL:10m; ???
~~~ ~~~
avec : Note : il faut générer ses propres paramètres Diffie-Hellman ; pour des paramètres de 2048 bits, on fera:
~~~ ~~~{.bash}
$ openssl dhparam -out /etc/ssl/dhparam.pem 2048 $ openssl dhparam -out /etc/ssl/dhparam.pem 2048
~~~ ~~~