GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Activer correctement HTTPS sur Nginx avec Let's Encrypt sur Ubuntu

Ce tutoriel vous montre comment activer correctement HTTPS sur Nginx avec Let's Encrypt sur Ubuntu. Google Chrome et Firefox ont déjà commencé à marquer les pages Web non cryptées avec une zone de saisie de mot de passe comme étant non sécurisées. Finalement, toutes les pages Web HTTP seront marquées comme non sécurisées. HTTPS deviendra la valeur par défaut pour n'importe quel site Web. C'est également une exigence si vous souhaitez utiliser le protocole HTTP/2 pour accélérer votre site Web.

Let's Encrypt est une autorité de certification gratuite, automatisée et ouverte. La documentation officielle décrit les étapes simples que vous pouvez suivre pour activer HTTPS avec Let's Encrypt, mais il y a plus que cela. Si vous suivez la doc officielle, vous obtenez un score A au test SSL Labs. Si vous suivez mes étapes, vous obtiendrez A+ score. Si vous avez déjà déployé un certificat Let's Encrypt auparavant, vous pouvez toujours suivre ce tutoriel pour renouveler et remplacer votre certificat existant.

Ce tutoriel est divisé en 3 parties.

  1. La première partie concerne le dossier CAA, en-têtes de sécurité et agrafage OCSP . Ces choses sont ce qui peut vous aider à obtenir A+ .
  2. La deuxième partie concerne la redirection du domaine www vers un domaine non www et vice versa.
  3. Je vais vous montrer comment gérer le service CDN CloudFlare dans la troisième partie.

Remarque :Ce didacticiel fonctionne sur toutes les versions actuelles de Nginx et Ubuntu (y compris 16.04, 18.04 et 20.04).

Création d'un enregistrement CAA pour votre nom de domaine

L'autorisation d'autorité de certification (CAA) est un enregistrement de ressource DNS qui spécifie quelles autorités de certification (CA) sont autorisées à émettre un certificat pour un nom de domaine particulier. Depuis septembre 2017, toutes les autorités de certification sont mandatées pour vérifier les enregistrements CAA avant de délivrer un certificat pour un nom de domaine particulier. Si aucun enregistrement CAA n'est trouvé pour un nom de domaine, n'importe quelle autorité de certification peut émettre un certificat pour ce nom de domaine. Si une autorité de certification n'est pas répertoriée dans votre enregistrement CAA, cette autorité de certification ne peut pas délivrer de certificat pour votre nom de domaine.

Pour créer un enregistrement CAA permettant à Let's Encrypt d'émettre un certificat pour votre nom de domaine, ajoutez l'entrée suivante dans votre serveur DNS ou votre gestionnaire DNS.

example.com. IN CAA 0 issue "letsencrypt.org"

Vous pouvez également utiliser iodef pour que l'autorité de certification signale une demande de problème de certificat malveillant à votre adresse e-mail.

example.com. IN CAA 0 iodef "mailto:your-email-address"

Le format des enregistrements ci-dessus est pour les fichiers de zone. Voici quelques conseils pour vous.

  • Vous pouvez utiliser SSLMate CAA Record Helper pour générer un enregistrement CCA pour votre nom de domaine.
  • Si vous utilisez GoDaddy DNS, suivez ce message pour ajouter un enregistrement CAA.

Vous pouvez utiliser la commande dig suivante pour vérifier votre enregistrement CAA.

dig example.com CAA

Notez que les navigateurs Web ne vérifient pas les enregistrements CAA.

En-têtes de sécurité

Les en-têtes de sécurité sont aussi importants que le protocole HTTPS, mais seul un petit pourcentage de sites compatibles HTTPS prêtent attention aux en-têtes de sécurité. Bien qu'une discussion complète sur les en-têtes de sécurité dépasse le cadre de ce didacticiel, je parlerai des upgrade-insecure-requests et HSTS en-têtes, car vous pouvez facilement les activer avec Let's Encrypt pour augmenter la sécurité de votre site Web.

Mettre à niveau les requêtes non sécurisées

Il y a des moments où un site a activé HTTPS, mais certains CSS, images ou JavaScripts sont toujours servis via HTTP. Dans ce cas, le cadenas vert au début de la barre d'adresse du navigateur disparaîtra. Dans Google Chrome, il est remplacé par une icône d'informations ; Dans Firefox, il est remplacé par un cadenas gris avec un triangle jaune. Vous voudrez montrer un cadenas vert aux visiteurs du site aussi souvent que possible et le moyen le plus simple de résoudre ce problème est d'activer les upgrade-insecure-requests header, qui forcera les navigateurs Web à utiliser https:// pour chaque http:// ressource.

Pour activer cet en-tête, ajoutez simplement --uir indicateur lors de l'émission de certbot commande. Notez que cet en-tête fonctionne sur les ressources hébergées sur votre propre domaine et les ressources sur des domaines tiers qui prennent en charge HTTPS. Si votre page Web inclut des ressources sur des serveurs tiers qui ne sont pas disponibles via HTTPS, ces ressources seront bloquées par les navigateurs Web, mais l'utilisation de cet en-tête garantit que vos pages Web obtiennent toujours un cadenas vert.

HSTS (HTTP Strict Transport Security)

L'en-tête HSTS indique aux navigateurs Web que toutes les communications avec votre site Web doivent être effectuées via HTTPS. Il se défend contre SSL Striping, qui est une attaque pour rétrograder de HTTPS à HTTP. Pour activer cet en-tête, ajoutez simplement --hsts indicateur lors de l'émission de certbot commande.

Agrafage OCSP

Lorsqu'un navigateur Web se connecte à un site Web HTTPS, il envoie une requête OCSP (Online Certificate Status Protocol) à l'autorité de certification (CA) afin d'interroger l'état de révocation du certificat SSL du site Web. Cela peut retarder le chargement de la page de 1 à 3 secondes, selon les données de télémétrie de Firefox.

Pour améliorer les performances, le propriétaire du site Web peut activer l'agrafage OCSP, auquel cas le serveur Web récupère lui-même la réponse OCSP signée par CA à intervalles réguliers. Lorsqu'un navigateur Web se connecte au site, Nginx peut envoyer la réponse OCSP mise en cache au navigateur Web, éliminant ainsi la nécessité pour le navigateur Web de contacter le serveur OCSP.

Pour activer l'agrafage OCSP, ajoutez simplement --staple-ocsp indicateur lors de l'émission de certbot commande.

OCSP doit agrafer

Si un pirate informatique crée un faux site Web en double, désactive l'agrafe OCSP et bloque également l'accès du navigateur Web au serveur OCSP, le navigateur Web supposera que tout va bien et passera au site Web malveillant. Pour résoudre ce problème, vous pouvez activer OCSP doit agrafer sur votre site Web, qui indique aux navigateurs Web que la réponse de base OCSP doit être présentée par votre site Web lors de la connexion HTTPS. Ainsi, lorsque les navigateurs Web se connectent à un faux site Web qui n'a pas de base OCSP, il arrête la connexion.

Pour activer OCSP doit agrafer, ajoutez --must-staple indicateur lors de l'émission de certbot commande.

Installer Let's Encrypt Client (Certbot) sur Ubuntu

Il est maintenant temps de vous salir les mains. À partir d'Ubuntu 16.04, le client Let's Encrypt (Certbot) est inclus dans le référentiel Ubuntu, vous pouvez donc l'installer avec la commande suivante. Python3-certbot-nginx est le plugin Certbot Nginx.

sudo apt install certbot python3-certbot-nginx

Pour vérifier le numéro de version, exécutez

certbot --version

Exemple de sortie :

certbot 0.31.0

Si vous souhaitez utiliser la dernière version, vous pouvez installer Certbot à partir de la boutique Snap.

sudo apt install snapd

sudo snap install --classic certbot

Remarque  :Si vous souhaitez utiliser la version Snap, vous devez utiliser le chemin binaire complet :/snap/bin/certbot .

Utilisation du plug-in Certbot Nginx pour activer HTTPS

Si votre site Web n'utilise pas le service CDN, il est recommandé d'utiliser le plug-in Nginx pour activer HTTPS sur le serveur Web Nginx, car il peut automatiquement obtenir un certificat SSL/TLS et le configurer pour vous. Exécutez la commande suivante sur votre serveur Ubuntu.

sudo certbot --nginx --agree-tos --redirect --uir --hsts --staple-ocsp --must-staple -d www.example.com,example.com --email [email protected]

Où :

  • --nginx  :Utilisez l'authentificateur et le programme d'installation Nginx
  • --agree-tos  :Acceptez les conditions d'utilisation de Let's Encrypt
  • --redirect  :Ajoutez une redirection 301.
  • --uir  :Ajoutez l'en-tête "Content-Security-Policy :upgrade-insecure-requests" à chaque réponse HTTP.
  • --hsts  :Ajoutez l'en-tête Strict-Transport-Security à chaque réponse HTTP.
  • --staple-ocsp  :Active l'agrafage OCSP.
  • --must-staple :Ajoute l'extension OCSP Must Staple au certificat.
  • -d flag est suivi d'une liste de noms de domaine, séparés par une virgule. Vous pouvez ajouter jusqu'à 100 noms de domaine.
  • --email :E-mail utilisé pour l'enregistrement et le contact de récupération.

Il vous sera demandé si vous souhaitez recevoir des e-mails de l'EFF (Electronic Frontier Foundation). Après avoir choisi O ou N, votre certificat SSL sera automatiquement obtenu et configuré pour vous, ce qui est indiqué par le message ci-dessous.

  • /etc/letsencrypt/live/example.com/fullchain.pem  :La chaîne complète du certificat de l'autorité de certification racine, du certificat de l'autorité de certification intermédiaire et de votre certificat de serveur.
  • /etc/letsencrypt/live/example.com/privkey.pem :La clé privée de votre serveur

Maintenant, si vous visitez votre site Web, vous pouvez voir que HTTP est automatiquement redirigé vers la connexion HTTPS. Il s'avère que le plugin Nginx ne prend actuellement pas en charge --uir drapeau. Pour ajouter manuellement l'en-tête upgrade-insecure-requests, modifiez le fichier de blocage de votre serveur Nginx.

sudo nano /etc/nginx/conf.d/example.com.conf

Ajoutez la ligne suivante dans le bloc du serveur SSL.

add_header Content-Security-Policy upgrade-insecure-requests;

C'est aussi une bonne idée d'ajouter un résolveur DNS dans le bloc du serveur SSL.

resolver 8.8.8.8;

Si vous n'ajoutez pas de résolveur, le message suivant peut s'afficher dans le journal des erreurs Nginx.

[warn] 559#559: no resolver defined to resolve ocsp.int-x3.letsencrypt.org while requesting certificate status, responder: ocsp.int-x3.letsencrypt.org

Enregistrez et fermez le fichier. Rechargez ensuite Nginx pour que les modifications prennent effet.

sudo systemctl reload nginx

Astuce de dépannage

Si vous voyez les messages d'erreur suivants lors de l'exécution de la commande certbot, il vous suffit de réexécuter la commande certbot, car il s'agit d'un échec temporaire de la résolution DNS.

An unexpected error occurred:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 159, in _new_conn
    conn = connection.create_connection(
  File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 61, in create_connection
    for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
  File "/usr/lib/python3.8/socket.py", line 918, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -3] Temporary failure in name resolution

Tester votre certificat SSL

Accédez à ssllabs.com pour tester votre certificat SSL et votre configuration. Comme promis, vous obtenez A+ . Vous pouvez également vérifier si votre nom de domaine a activé l'enregistrement CAA, si votre serveur a activé HSTS, l'agrafage OCSP et l'OCSP doit agrafer.

Redirection WWW vers Non-WWW (Ou Vice-Versa)

Nous avons déjà activé la redirection HTTP vers HTTPS, il ne reste plus qu'à rediriger www vers non-www, ou vice versa. Si vous utilisez WordPress, c'est très simple. Accédez simplement au tableau de bord WordPress> Paramètres> Général et définissez votre version préférée (www ou non-www) dans WordPress Address et Adresse du site .

Si vous suivez cette voie, vous vous retrouverez avec ce que l'on appelle la double redirection 301. Tout d'abord, le serveur Nginx redirige HTTP vers HTTPS, puis WordPress redirige vers le domaine www ou non-www. Certains diront que la double redirection 301 peut nuire au référencement de votre site. Si cela vous inquiète, vous pouvez utiliser la méthode ci-dessous pour que toutes les versions de domaine aillent directement à la destination finale.

Modifiez votre bloc de serveur Nginx.

sudo nano /etc/nginx/conf.d/example.com.conf

Le client CertBot a ajouté les lignes suivantes au fichier pour rediriger HTTP vers HTTPS.

if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot

Vous pouvez supprimer ces 3 lignes et modifier les configurations de bloc de votre serveur comme la capture d'écran ci-dessous pour rediriger le domaine non-www vers le domaine www.

  • Le premier bloc de serveur écoute sur le port 80. Il contient une redirection 301 pour rediriger HTTP vers HTTPS.
  • Le deuxième bloc de serveur écoute sur le port 443. Il contient une redirection 301 pour rediriger le domaine non www vers le domaine www.

Si vous souhaitez rediriger www vers un domaine autre que www, modifiez

return 301 https://www.example.com$request_uri;

à

return 301 https://example.com$request_uri;

Et changez le server_name directive dans les blocs du serveur SSL.

Enregistrez et fermez le fichier. Testez les configurations Nginx.

sudo nginx -t

Si le test réussit, rechargez Nginx pour que les modifications prennent effet.

sudo systemctl reload nginx

Si vous utilisez WordPress, assurez-vous de définir votre version de domaine préférée dans WoredPress Address et Adresse du site avant de modifier le fichier de configuration du bloc de serveur Nginx. Si les paramètres de WordPress contredisent la configuration de Nginx, votre site sera dans une boucle de redirection.

Comment activer le protocole HTTP/2

Pour activer le protocole HTTP/2 dans Nginx, ouvrez simplement votre fichier d'hôte virtuel Nginx et recherchez la ligne suivante.

listen 443 ssl;

Ajouter http2 à la fin.

listen 443 ssl http2;

Enregistrez et fermez le fichier. Rechargez ensuite Nginx.

sudo systemctl reload nginx

Comment désactiver TLSv1 et TLSv1.1

TLSv1 et TLSv1.1 ne sont plus considérés comme sécurisés. Depuis le 31/01/2020, SSL Labs limite les serveurs prenant en charge TLS 1.0 ou TLS 1.1 à B grade. Pour les désactiver, modifiez le fichier de configuration des options SSL de Let's Encrypt.

sudo nano /etc/letsencrypt/options-ssl-nginx.conf

Trouvez la ligne suivante.

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Supprimez les versions TLS supprimées.

ssl_protocols TLSv1.2

Enregistrez et fermez le fichier. Redémarrez ensuite Nginx.

sudo systemctl restart nginx

Comment activer TLS 1.3

Veuillez lire l'article suivant :

  • Comment activer facilement TLS 1.3 dans Nginx sur Ubuntu 20.04, 18.04, 16.04

Comment activer IPv6 dans Nginx

Si votre serveur a une adresse IPv6 et que votre nom de domaine a un enregistrement AAAA, vous devez activer IPv6 dans Nginx. Ajoutez la ligne suivante dans le bloc du serveur HTTP.

listen [::]:80;

Et ajoutez la ligne suivante dans le bloc du serveur HTTPS.

listen [::]:443 ssl http2;

Enregistrez et fermez le fichier. Rechargez Nginx et vous avez terminé.

sudo systemctl reload nginx

Renouvellement automatique du certificat

Pour renouveler automatiquement le certificat Let's Encrypt, modifiez simplement le fichier crontab de l'utilisateur root.

sudo crontab -e

Ajoutez ensuite la ligne suivante en bas.

@daily certbot renew --quiet && systemctl reload nginx

--quiet flag supprimera la sortie standard. Si vous souhaitez recevoir une erreur standard, ajoutez la ligne suivante au début du fichier crontab.

MAILTO=[email protected]

Le rechargement de Nginx est nécessaire pour qu'il présente le nouveau certificat aux clients.

Définir PATH dans Crontab

Parfois, Cron m'envoie le message suivant, qui peut également être vu dans /var/log/letsencrypt/letsencrypt.log fichier.

Could not choose appropriate plugin for updaters: The nginx plugin is not working; there may be problems with your existing configuration.
The error was: NoInstallationError()

La cause de cette erreur est que par défaut le PATH dans Cron est défini sur

PATH=/usr/bin:/bin

Mais le binaire nginx est situé dans /usr/sbin/nginx , Cron ne peut pas le trouver avec le PATH par défaut. Pour corriger cette erreur, ajoutez la ligne suivante au début du fichier Crontab.

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

CDN CloudFlare

Si vous souhaitez installer le certificat Let's Encrypt sur votre serveur et utiliser en même temps le service CDN de CloudFlare, vous devrez activer le SSL universel de CloudFlare sur votre site, ce qui signifie

  • Les connexions entre les visiteurs du site et le serveur périphérique CloudFlare sont cryptées à l'aide du certificat SSL universel CloudFlare
  • Les connexions entre votre serveur d'origine et le serveur périphérique CloudFlare sont chiffrées à l'aide du certificat émis par Let's Encrypt.

Si vous installez le certificat Let's Encrypt sur votre serveur d'origine et redirigez HTTP vers HTTPS, mais désactivez CloudFlare Universal SSL, les navigateurs Web se plaindront que votre site Web est dans une boucle de redirection infinie car CloudFlare redirige HTTPS vers HTTP lorsque Universal SSL n'est pas activé. /P>

La deuxième chose que vous devez savoir est que si vous souhaitez activer l'enregistrement CAA tout en utilisant CloudFlare Universal SSL, vous devez également créer l'enregistrement CAA suivant.

example.com. IN CAA 0 issue "comodoca.com"

example.com. IN CAA 0 issue "digicert.com"

example.com. IN CAA 0 issue "globalsign.com

Suivez ce message pour ajouter un enregistrement CAA pour le certificat CloudFlare Universal SSL.

Alors, comment procédez-vous pour installer le certificat Let's Encrypt avec CloudFlare ? Eh bien, il y a deux scénarios.

  1. Vous avez déjà installé le certificat Let's Encrypt en suivant les étapes ci-dessus, vous souhaitez maintenant activer le service CloudFlare CDN.
  2. Votre site Web utilise le service CDN CloudFlare, vous souhaitez maintenant installer le certificat Let's Encrypt sur votre serveur d'origine.

Le premier scénario

Si vous êtes dans le premier scénario, vous pouvez continuer et activer le service CloudFlare CDN et également activer CloudFlare Universal SSL dans le tableau de bord CloudFlare en allant sur Crypto> SSL et en choisissant Complet (Strict) . Votre site fonctionnera correctement sans problème.

Le deuxième scénario

Si vous utilisez CloudFlare CDN et que vous souhaitez maintenant installer Let's Encrypt sur votre serveur d'origine, exécutez la commande suivante pour obtenir et installer le certificat Let's Encrypt TLS.

sudo certbot --nginx --agree-tos --redirect --uir --hsts --staple-ocsp --must-staple -d www.example.com,example.com --email [email protected]

Une fois le certificat obtenu et installé sur votre serveur, accédez au tableau de bord Cloudflare et activez CloudFlare Universal SSL.

Étape suivante

J'espère que ce tutoriel vous a aidé à activer HTTPS sur Nginx avec Let's Encrypt sur Ubuntu . Vous pouvez également configurer le pare-feu d'application Web ModSecurity pour protéger votre site WordPress contre le piratage.

  • Comment configurer ModSecurity avec Nginx sur Debian/Ubuntu

Comme toujours, si vous avez trouvé cet article utile, abonnez-vous à notre newsletter gratuite pour obtenir plus de conseils et astuces. Prenez soin de vous 🙂


Ubuntu
  1. Comment sécuriser Nginx avec Lets Encrypt sur Ubuntu 20.04 / 18.04

  2. SSL gratuit pour Nginx sur Centos par Let's encrypt

  3. Installez le certificat Let's Encrypt à l'aide de Certbot dans Ubuntu 20.04 - Comment le faire sur le serveur Web Nginx ?

  4. Sécuriser Nginx avec Let's Encrypt sur Ubuntu 18.04 - Comment faire ?

  5. Comment sécuriser Nginx avec Let's Encrypt sur Ubuntu 20.04

Comment installer Nginx avec Let's Encrypt SSL sur Ubuntu 20.04 LTS

Sécurisez Nginx avec le certificat SSL Let's Encrypt sur Ubuntu 18.04

Comment sécuriser Nginx avec le certificat SSL Let's Encrypt

Comment sécuriser le serveur LEMP avec Let's Encrypt Free SSL sur Ubuntu 18.04 VPS

Comment sécuriser Nginx avec Let's Encrypt sur Ubuntu 20.04

Comment sécuriser Apache avec Let's Encrypt sur Ubuntu 20.04