diff --git a/HowtoSSL.md b/HowtoSSL.md index 0b0fe156..97ed7184 100644 --- a/HowtoSSL.md +++ b/HowtoSSL.md @@ -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*). - +* +* ## 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 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 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 ~~~