19
0
Fork 0

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
1 changed files with 32 additions and 36 deletions

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.
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
@ -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,
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
@ -313,66 +315,60 @@ Debian [a corrigé cette faille en janvier2015](https://security-tracker.debian.
### 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)
- 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
~~~
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/).
#### Configuration Apache
En pratique avec Apache :
En pratique avec Apache (sous Debian 8), voici une configuration SSL avancée :
~~~{.apache}
SSLCipherSuite AES128+EECDH:AES128+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLCipherSuite AES128+EECDH:AES128+EDH
SSLHonorCipherOrder On
SSLCompression off
#Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
SSLSessionCache shm:/var/log/apache2/ssl_gcache_data(512000) ???
SSLSessionCacheTimeout 600 ???
~~~
Si votre Apache est trop vieux????, mettre le SSLCipherSuite suivant :
~~~
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
SSLSessionTickets off
SSLSessionCache shmcb:/var/log/apache2/ssl_sessioncache(10240000)
SSLUseStapling yes
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:/var/log/apache2/ssl_staplingcache(2048000)
Header always set Strict-Transport-Security "max-age=2592000"
~~~
#### 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_prefer_server_ciphers on;
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;
#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
~~~