Alors que tout le monde est de plus en plus conscient de la sécurité en ligne et que les grandes sociétés Internet promeuvent la vulgarisation du HTTPS, le HTTPS SSL est désormais devenu la norme pour la création de sites Web. Grâce aux certificats SSL gratuits fournis par Let's Encrypt, Digicert, TrustAsia, Symantec, etc., le coût d'utilisation du HTTPS est désormais négligeable qu'il s'agisse d'un site Web personnel ou d'un site Web d'entreprise.
Pour des raisons de sécurité, nous devons utiliser HTTPS, mais l'activation de SSL augmentera la surcharge de mémoire, de processeur et de bande passante réseau. Par rapport à http, en utilisant la négociation à trois voies TCP pour établir une connexion, le client et le serveur doivent échanger 3 paquets. En plus des trois paquets TCP, https a également besoin de 9 paquets requis pour la négociation SSL, pour un total de 12. paquets. Par conséquent, si HTTPS est beaucoup optimisé, il est susceptible de ralentir les performances.
Bien sûr, certaines personnes peuvent penser que la surcharge accrue du serveur due à HTTPS et SSL ne se fait pratiquement pas sentir, car le trafic du site Web est relativement faible et la configuration des performances du serveur est suffisante pour prendre en charge le trafic actuel. Mais pour les grands sites Web, tels que Baidu, Google et les applications populaires, il reste très utile d'optimiser les performances HTTPS et de réduire la consommation de ressources.
Cet article partagera une certaine expérience dans l'optimisation de l'utilisation de HTTPS et SSL. Il existe d'autres didacticiels d'expérience sur les certificats SSL et HTTPS :
- Collecte et résumé des certificats SSL gratuits - ajoutez gratuitement un accès crypté sécurisé HTTPS au site Web
- Dix conseils d'accélération CDN gratuits CloudFlare que vous ne connaissez peut-être pas -SSLDDOSCache
- Activez HSTS et rejoignez la liste de préchargement HSTS pour rendre l'accès HTTPS au site Web plus sécurisé - avec une méthode pour supprimer HSTS
PS : Mis à jour le 6 septembre 2018, si vous souhaitez utiliser un service de résolution DNS payant, voici deux services DNS moins chers et plus adaptés aux particuliers : Deux produits DNS adaptés à un usage personnel : ClouDNS et DNS Résolution de nom de domaine simplifiée.
PS : mis à jour le 15 janvier 2019 Si vous souhaitez que l'accès SSL bénéficie d'une vitesse plus rapide et de performances supérieures, vous pouvez essayer la compression TLSV1.3 et Brotli : accélération de l'optimisation du site Web – activez la compression TLSV1.3 et Brotli -Oneinstack, LNMP, panneau Pagode.
1. Comment choisir un certificat SSL gratuit ?
Il est recommandé de choisir Let's Encrypt. Bien que le certificat SSL gratuit de Let's Encrypt ne dure que 90 jours, il peut être renouvelé indéfiniment et prend en charge le renouvellement manuel et automatique. Let's Encrypt SSL est reconnu par tous les principaux navigateurs et constitue le premier choix pour les certificats SSL gratuits. Tutoriel : Let's Encrypt Wildcard, application en un clic de certificat SSL de nom de domaine gratuit et didacticiel d'utilisation de SSL.
Let's Encrypt convient aux hôtes dotés d'adresses IP indépendantes telles que VPS. Sinon, vous ne pouvez utiliser que certaines applications de certificat SSL en ligne développées à l'aide de l'API Let's Encrypt. Bien entendu, si vous disposez d'une certaine solidité financière, il est plus envisageable de choisir un certificat SSL payant. Pour plus de certificats SSL, voir : Collection et récapitulatif des certificats SSL gratuits.
2. Activez HSTS sur le serveur
Les sites Web qui utilisent le protocole HSTS garantiront que le navigateur se connecte toujours à la version HTTPS du site Web, sans obliger les utilisateurs à saisir manuellement une adresse cryptée contenant https://
dans la barre d'adresse URL. J'utilise le serveur Nginx. Il me suffit d'éditer le fichier de configuration Nginx (tel que : /usr/local/nginx/conf/nginx.conf) et d'ajouter les lignes suivantes au bloc serveur de la configuration HTTPS :
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
Pour connaître les méthodes détaillées d'activation de HSTS pour Apache, Lighttpd, etc., voir : Activer HSTS sur le serveur.
3. Ajoutez le nom de domaine au plan de liste de préchargement HSTS
Bien que le protocole HSTS soit activé ci-dessus pour garantir que les utilisateurs accèdent toujours aux connexions HTTPS, les utilisateurs qui visitent le site Web pour la première fois entreront généralement des noms de domaine non https, ce qui conduit au problème du détournement http lors de la première visite du site Web. temps. Le plan de liste de préchargement HSTS vise à résoudre ce problème. Il s'agit d'une liste intégrée aux navigateurs tels que chromeFirefoxEdge.
Comment rejoindre la liste de préchargement HSTS : activez HSTS et rejoignez la liste de préchargement HSTS pour rendre l'accès HTTPS au site Web plus sécurisé. Vous trouverez ci-joint la méthode de suppression de HSTS. À l'heure actuelle, wzfou.com a été ajouté avec succès à la liste de préchargement HSTS. Si vous utilisez Chrome ou Firefox, la première fois que vous visiterez ce site, vous utiliserez HTTPS pour vous connecter par défaut.
Activez l'agrafage OCSP dans Nginx. (ssl_trusted_certificate peut être omis si la directive ssl_certificate spécifie la chaîne complète de certificats)
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/certs/chained.pem;
Activer l'agrafage OCSP dans Apache :
Dans <VirtualHost></VirtualHost>
ajoutez :
SSLUseStapling on
En dehors de <VirtualHost></VirtualHost>
ajoutez :
SSLStaplingCache shmcb:/tmp/stapling_cache(128000)
5. Utilisez les doubles certificats ECC et RSA
Par défaut, nous utiliserons tous des certificats RSA car les certificats RSA ont la compatibilité la plus large. Cependant, le certificat ECC présente les caractéristiques d'une petite taille, d'une vitesse de calcul rapide et d'une sécurité élevée (la clé ECC
de 256 bits peut fournir une sécurité équivalente à la clé RSA
de 3 072 bits). Il peut fournir des performances HTTPS dans une certaine mesure.
Let's Encrypt prend déjà en charge la génération de certificats ECC. Utilisez acme.sh pour émettre des certificats SSL. Spécifiez --keylength ec-256
pour modifier le type de certificat en ECC :
acme.sh --issue -w /data/wwwroot/wzfou.com -d wzfou.com -d www.wzfou.com --keylength ec-256
Il convient de noter que ECC n'est pas compatible sur Windows XP. Pour le moment, nous penserons à utiliser des certificats doubles. Autrement dit, lorsque le certificat ECC n'est pas pris en charge, Nginx affichera automatiquement le certificat RSA à l'utilisateur. Si la version de nginx est supérieure à 1.11
, vous pouvez directement écrire les chemins des doubles certificats ECC et RSA dans le fichier de configuration wzfou.com le démontre comme suit :
#ECC
ssl_certificate /root/.acme.sh/wzfou.com_ecc/fullchain.cer;
ssl_certificate_key /root/.acme.sh/wzfou.com_ecc/wzfou.com.key;
#RSA
ssl_certificate /usr/local/nginx/conf/ssl/wzfou.com.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/wzfou.com.key;
Redémarrez Nginx Lorsque des utilisateurs tels que XP qui ne prennent pas en charge les certificats ECC accèdent au site Web, le certificat RSA s'affiche.
D'autres utilisateurs préfèrent utiliser des certificats ECC.
Si vous constatez qu'ECC ne s'affiche pas de manière préférentielle, vérifiez si ssl_prefer_server_ciphers
est activé et si ssl_ciphers
est configuré correctement. Voici la configuration utilisée par wzfou.com :
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
De plus, vous pouvez choisir l’une des trois options suivantes (à des fins de test uniquement) :
ssl_ciphers 'EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5';
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-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:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
6. Activer DNS CAA
La fonction du DNS CAA est de permettre uniquement à l'autorité de certification répertoriée dans l'enregistrement d'émettre des certificats pour le nom de domaine (ou le nom de sous-domaine) afin d'empêcher quelqu'un de falsifier des certificats SSL. Dans le même temps, l'enregistrement CAA peut contrôler l'émission d'un seul domaine. nommer les certificats SSL et peut également contrôler le certificat Wildcard. Pour des méthodes détaillées, voir : Paramètres DNS JD Cloud CAA.
Problème :L'activation de DNS CAA entraîne une erreur : Vérifiez l'erreur : enregistrement CAA pour l'émission *.wzfou.comprevents. La solution consiste à ajouter l'enregistrement issuewild
: 0 issuewild "letsencrypt.org"
. De plus, deux sites Internet sont proposés pour vérifier si la configuration CAA est correcte :
- HTTPS://CAA test.co.UK/
- HTTPS://Amis du Nouvel An.IO/labs/CAA-validator
7. Mettez automatiquement à jour régulièrement les certificats SSL
Si vous souhaitez mettre à jour manuellement :
# RSA
$ acme.sh --renew -d wzfou.com –d www.wzfou.com --force
# ECC
acme.sh --renew -d wzfou.com –d www.wzfou.com --force --ecc
Généralement, acme.sh a automatiquement ajouté des tâches planifiées pour mettre à jour régulièrement le certificat Let's Encrypt. Si vous constatez que le certificat n'est pas mis à jour régulièrement, vérifiez si votre tâche Cron est correcte. Vous pouvez également essayer de forcer une mise à jour :
"/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" --force
8. Vérifiez la configuration du certificat SSL
Les sites Web de tests couramment utilisés incluent :
- HTTPS://wuwuwu.SSL labs.com/SSL test/analyze.HTML
- https://nokill.com/
Il est fortement recommandé d'utiliser ssllabs.com. Les résultats des tests sont toujours très précis, comme suit :
9. Complet
Sur la base des stratégies d'optimisation ci-dessus, l'optimisation spécifique du fichier de configuration Nginx est la suivante :
server {
listen 443 ssl http2;
#使用HTTP/2,需要Nginx1.9.7以上版本
add_header Strict-Transport-Security "max-age=6307200; includeSubdomains; preload";
#开启HSTS,并设置有效期为“6307200秒”(6个月),包括子域名(根据情况可删掉),预加载到浏览器缓存(根据情况可删掉)
add_header X-Frame-Options DENY;
#禁止被嵌入框架
add_header X-Content-Type-Options nosniff;
#防止在IE9、Chrome和Safari中的MIME类型混淆攻击
ssl_certificate /usr/local/nginx/conf/vhost/sslkey/www.linpx.com.crt;
ssl_certificate_key /usr/local/nginx/conf/vhost/sslkey/www.linpx.com.key;
#SSL证书文件位置
ssl_trusted_certificate /usr/local/nginx/conf/vhost/sslkey/chaine.pem;
#OCSP Stapling的证书位置
ssl_dhparam /usr/local/nginx/conf/vhost/sslkey/dhparam.pem;
#DH-Key交换密钥文件位置
#SSL优化配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#只允许TLS协议
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
#加密套件,这里用了CloudFlare's Internet facing SSL cipher configuration
ssl_prefer_server_ciphers on;
#由服务器协商最佳的加密算法
ssl_session_cache builtin:1000 shared:SSL:10m;
#Session Cache,将Session缓存到服务器,这可能会占用更多的服务器资源
ssl_session_tickets on;
#开启浏览器的Session Ticket缓存
ssl_session_timeout 10m;
#SSL session过期时间
ssl_stapling on;
#OCSP Stapling开启,OCSP是用于在线查询证书吊销情况的服务,使用OCSP Stapling能将证书有效状态的信息缓存到服务器,提高TLS握手速度
ssl_stapling_verify on;
#OCSP Stapling验证开启
resolver 8.8.8.8 8.8.4.4 valid=300s;
#用于查询OCSP服务器的DNS
resolver_timeout 5s;
#查询域名超时时间
···
}
Lors de l'utilisation réelle, il s'avère que les « optimisations » individuelles doivent être déterminées en fonction de ses propres besoins. Voici la configuration Nginx actuellement utilisée par wzfou.com, à titre de référence uniquement :
listen 80;
listen 443 ssl http2;
#ECC
ssl_certificate /root/.acme.sh/wzfou.com_ecc/fullchain.cer;
ssl_certificate_key /root/.acme.sh/wzfou.com_ecc/wzfou.com.key;
#RSA
ssl_certificate /usr/local/nginx/conf/ssl/wzfou.com.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/wzfou.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_timeout 10m;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_buffer_size 1400;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
ssl_stapling on;
ssl_stapling_verify on;
PS : Mis à jour le 5 août 2018 Merci à xiaoz pour le rappel Voici un site de génération de configuration SSL en ligne, de Mozilla, qui est très référençable :
- https://Mozilla.GitHub.IO/server-dead-torres/ratings-config-generator/