GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Abilita correttamente HTTPS su Nginx con Let's Encrypt su Ubuntu

Questo tutorial ti mostra come abilitare correttamente HTTPS su Nginx con Let's Encrypt su Ubuntu. Google Chrome e Firefox hanno già iniziato a contrassegnare le pagine Web non crittografate con la casella di immissione della password come non sicure. Alla fine tutte le pagine Web HTTP verranno contrassegnate come non sicure. HTTPS diventerà predefinito per qualsiasi sito Web. È anche un requisito se desideri utilizzare il protocollo HTTP/2 per velocizzare il tuo sito web.

Let's Encrypt è un'autorità di certificazione gratuita, automatizzata e aperta. La documentazione ufficiale descrive i semplici passaggi che puoi seguire per abilitare HTTPS con Let's Encrypt, ma c'è di più. Se segui il documento ufficiale, ottieni un punteggio A sul test SSL Labs. Se segui i miei passaggi, otterrai A+ punto. Se hai già distribuito un certificato Let's Encrypt in precedenza, puoi comunque seguire questo tutorial per rinnovare e sostituire il tuo certificato esistente.

Questo tutorial è diviso in 3 parti.

  1. La prima parte riguarda il record CAA intestazioni di sicurezza e Pinzatura OCSP . Queste cose sono ciò che può aiutarti a ottenere A+ .
  2. La seconda parte riguarda il reindirizzamento del dominio www a un dominio non www e viceversa.
  3. Ti mostrerò come gestire il servizio CloudFlare CDN nella terza parte.

Nota:questo tutorial funziona su tutte le versioni correnti di Nginx e Ubuntu (incluse 16.04, 18.04 e 20.04).

Creazione di un record CAA per il tuo nome di dominio

L'autorizzazione dell'autorità di certificazione (CAA) è un record di risorse DNS che specifica quali autorità di certificazione (CA) sono autorizzate a emettere certificati per un particolare nome di dominio. A partire da settembre 2017, tutte le CA sono obbligate a controllare i record CAA prima di emettere il certificato per un particolare nome di dominio. Se non viene trovato alcun record CAA per un nome di dominio, qualsiasi CA può emettere un certificato per quel nome di dominio. Se una CA non è elencata nel tuo record CAA, tale CA non può emettere un certificato per il tuo nome di dominio.

Per creare un record CAA che consenta a Let's Encrypt di emettere un certificato per il tuo nome di dominio, aggiungi la seguente voce nel tuo server DNS o gestore DNS.

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

Puoi anche usare iodef per segnalare una richiesta di rilascio di certificato dannoso da parte di una CA al tuo indirizzo email.

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

Il formato dei record di cui sopra è per i file di zona. Di seguito sono riportati alcuni suggerimenti per te.

  • Puoi utilizzare SSLMate CAA Record Helper per generare record CCA per il tuo nome di dominio.
  • Se stai utilizzando GoDaddy DNS, segui questo post per aggiungere il record CAA.

Puoi utilizzare il seguente comando dig per controllare il tuo record CAA.

dig example.com CAA

Tieni presente che i browser Web non controllano i record CAA.

Intestazioni di sicurezza

Le intestazioni di sicurezza sono importanti quanto il protocollo HTTPS, ma solo una piccola percentuale di siti abilitati per HTTPS presta attenzione alle intestazioni di sicurezza. Sebbene una discussione completa sulle intestazioni di sicurezza vada oltre lo scopo di questo tutorial, parlerò di upgrade-insecure-requests e HSTS intestazioni, perché puoi abilitarle facilmente con Let's Encrypt per aumentare la sicurezza del tuo sito web.

Aggiorna richieste non sicure

Ci sono momenti in cui un sito ha abilitato HTTPS, ma alcuni CSS, immagini o JavaScript sono ancora serviti su HTTP. In questo caso, il lucchetto verde all'inizio della barra degli indirizzi del browser scomparirà. In Google Chrome, è sostituito da un'icona di informazioni; In Firefox, è sostituito da un lucchetto grigio con un triangolo giallo. Ti consigliamo di mostrare un lucchetto verde ai visitatori del sito il più spesso possibile e il modo più semplice per risolvere questo problema è abilitare le richieste di aggiornamento non sicure header, che costringerà i browser Web a utilizzare https:// per ogni http:// risorsa.

Per abilitare questa intestazione, aggiungi semplicemente --uir flag quando si emette certbot comando. Tieni presente che questa intestazione funziona su risorse ospitate sul tuo dominio e risorse su domini di terze parti che supportano HTTPS. Se la tua pagina web include risorse su server di terze parti che non sono disponibili tramite HTTPS, tali risorse verranno bloccate dai browser web, ma l'utilizzo di questa intestazione assicura che le tue pagine web ricevano sempre un lucchetto verde.

HSTS (HTTP Strict Transport Security)

L'intestazione HSTS indica ai browser Web che tutte le comunicazioni con il tuo sito Web devono essere eseguite tramite HTTPS. Si difende dallo striping SSL, che è un attacco per il downgrade da HTTPS a HTTP. Per abilitare questa intestazione, aggiungi semplicemente --hsts flag quando si emette certbot comando.

Pinzatura OCSP

Quando un browser Web si connette a un sito Web HTTPS, invia una richiesta OCSP (Online Certificate Status Protocol) all'autorità di certificazione (CA) per interrogare lo stato di revoca del certificato SSL del sito Web. Questo può ritardare il caricamento della pagina di 1-3 secondi, secondo i dati di telemetria di Firefox.

Per migliorare le prestazioni, il proprietario del sito Web può abilitare la pinzatura OCSP, nel qual caso il server Web stesso recupera la risposta OCSP firmata da CA a intervalli regolari. Quando un browser Web si connette al sito, Nginx può inviare la risposta OCSP memorizzata nella cache al browser Web, eliminando così la necessità che il browser Web contatti il ​​server OCSP.

Per abilitare la pinzatura OCSP, aggiungi semplicemente --staple-ocsp flag quando si emette certbot comando.

OCSP deve pinzare

Se un hacker crea un sito Web falso e duplicato, disattiva la graffetta OCSP e blocca anche l'accesso del browser Web al server OCSP, il browser Web presumerà che sia OK e procederà al sito Web dannoso. Per risolvere questo problema, puoi abilitare OCSP deve pinzare sul tuo sito Web, che indica ai browser Web che la risposta OCSP deve essere presentata dal tuo sito Web durante la connessione HTTPS. Pertanto, quando i browser Web si connettono a un sito Web falso che non dispone di OCSP, la connessione interromperà.

Per abilitare OCSP deve essere pinzata, aggiungi --must-staple flag quando si emette certbot comando.

Installazione del client Let's Encrypt (Certbot) su Ubuntu

Ora è il momento di sporcarsi le mani. A partire da Ubuntu 16.04, il client Let's Encrypt (Certbot) è incluso nel repository di Ubuntu, quindi puoi installarlo con il seguente comando. Python3-certbot-nginx è il plug-in Certbot Nginx.

sudo apt install certbot python3-certbot-nginx

Per controllare il numero di versione, esegui

certbot --version

Esempio di output:

certbot 0.31.0

Se desideri utilizzare l'ultima versione, puoi installare Certbot dallo Snap Store.

sudo apt install snapd

sudo snap install --classic certbot

Nota :Se vuoi usare la versione Snap, devi usare il percorso binario completo:/snap/bin/certbot .

Utilizzo del plug-in Certbot Nginx per abilitare HTTPS

Se il tuo sito Web non utilizza il servizio CDN, ti consigliamo di utilizzare il plug-in Nginx per abilitare HTTPS sul server Web Nginx, poiché può ottenere automaticamente il certificato SSL/TLS e configurarlo per te. Esegui il seguente comando sul tuo server Ubuntu.

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

Dove:

  • --nginx :usa l'autenticatore e il programma di installazione Nginx
  • --agree-tos :Accetto i termini di servizio di Let's Encrypt
  • --redirect :aggiungi reindirizzamento 301.
  • --uir :aggiungi l'intestazione "Content-Security-Policy:upgrade-insecure-requests" a ogni risposta HTTP.
  • --hsts :aggiungi l'intestazione Strict-Transport-Security a ogni risposta HTTP.
  • --staple-ocsp :Abilita la pinzatura OCSP.
  • --must-staple :aggiunge l'estensione OCSP Must Staple al certificato.
  • -d flag è seguito da un elenco di nomi di dominio, separati da virgola. Puoi aggiungere fino a 100 nomi di dominio.
  • --email :Email utilizzata per la registrazione e il contatto di recupero.

Ti verrà chiesto se desideri ricevere e-mail da EFF (Electronic Frontier Foundation). Dopo aver scelto Y o N, il tuo certificato SSL verrà automaticamente ottenuto e configurato per te, come indicato dal messaggio sottostante.

  • /etc/letsencrypt/live/example.com/fullchain.pem :la catena completa del certificato CA radice, del certificato CA intermedio e del certificato del server.
  • /etc/letsencrypt/live/example.com/privkey.pem :la chiave privata del tuo server

Ora se visiti il ​​tuo sito web, puoi vedere che HTTP viene automaticamente reindirizzato alla connessione HTTPS. Si scopre che il plugin Nginx attualmente non supporta --uir bandiera. Per aggiungere manualmente l'intestazione delle richieste di aggiornamento non sicure, modifica il file di blocco del server Nginx.

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

Aggiungi la seguente riga nel blocco del server SSL.

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

Inoltre è una buona idea aggiungere un resolver DNS nel blocco del server SSL.

resolver 8.8.8.8;

Se non aggiungi un risolutore, potresti visualizzare il seguente messaggio nel registro degli errori di Nginx.

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

Salva e chiudi il file. Quindi ricarica Nginx per rendere effettive le modifiche.

sudo systemctl reload nginx

Suggerimento per la risoluzione dei problemi

Se visualizzi i seguenti messaggi di errore durante l'esecuzione del comando certbot, devi semplicemente eseguire nuovamente il comando certbot, poiché si tratta di un errore temporaneo nella risoluzione 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

Test del tuo certificato SSL

Vai su ssllabs.com per testare il tuo certificato SSL e la configurazione. Come ho promesso, ottieni A+ . Puoi anche verificare se il tuo nome di dominio ha abilitato il record CAA, se il tuo server ha abilitato HSTS, la pinzatura OCSP e la pinzatura OCSP.

Reindirizzamento da WWW a non WWW (o viceversa)

Abbiamo già abilitato il reindirizzamento da HTTP a HTTPS, ciò che resta da fare è reindirizzare www a non www o viceversa. Se stai usando WordPress, allora è molto facile. Vai semplicemente su WordPress Dashboard> Impostazioni> Generale e imposta la tua versione preferita (www o non www) in Indirizzo WordPress e Indirizzo sito .

Se segui quella strada, ti ritroverai con quello che è noto come doppio reindirizzamento 301. Innanzitutto, il server Nginx reindirizza HTTP a HTTPS, quindi WordPress reindirizza al dominio www o non www. Alcuni potrebbero obiettare che il doppio reindirizzamento 301 può danneggiare la SEO del tuo sito. Se sei preoccupato per questo, puoi utilizzare il metodo seguente per fare in modo che tutte le versioni del dominio vadano direttamente alla destinazione finale.

Modifica il blocco del tuo server Nginx.

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

Il client CertBot ha aggiunto le seguenti righe al file per reindirizzare HTTP a HTTPS.

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

Puoi eliminare quelle 3 righe e modificare le configurazioni del blocco del server come lo screenshot qui sotto per reindirizzare non www al dominio www.

  • Il primo blocco del server è in ascolto sulla porta 80. Contiene un reindirizzamento 301 per reindirizzare da HTTP a HTTPS.
  • Il secondo blocco del server è in ascolto sulla porta 443. Contiene un reindirizzamento 301 per reindirizzare il dominio non www al dominio www.

Se desideri reindirizzare www a un dominio non www, cambia

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

a

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

E cambia il server_name direttiva nei blocchi del server SSL.

Salva e chiudi il file. Testa le configurazioni di Nginx.

sudo nginx -t

Se il test ha esito positivo, ricarica Nginx per rendere effettive le modifiche.

sudo systemctl reload nginx

Se utilizzi WordPress, assicurati di impostare la versione del dominio preferita in Indirizzo WordPress e Indirizzo sito prima di modificare il file di configurazione del blocco del server Nginx. Se le impostazioni di WordPress sono in contraddizione con la configurazione di Nginx, il tuo sito sarà in un ciclo di reindirizzamento.

Come abilitare il protocollo HTTP/2

Per abilitare il protocollo HTTP/2 in Nginx, apri semplicemente il tuo file host virtuale Nginx e trova la riga seguente.

listen 443 ssl;

Aggiungi http2 alla fine.

listen 443 ssl http2;

Salva e chiudi il file. Quindi ricarica Nginx.

sudo systemctl reload nginx

Come disabilitare TLSv1 e TLSv1.1

TLSv1 e TLSv1.1 non sono più considerati sicuri. A partire dal 31-01-2020, SSL Labs sta limitando i server che supportano TLS 1.0 o TLS 1.1 a B grado. Per disabilitarli, modifica il file di configurazione delle opzioni Let's Encrypt SSL.

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

Trova la riga seguente.

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Rimuovere le versioni TLS eliminate.

ssl_protocols TLSv1.2

Salva e chiudi il file. Quindi riavvia Nginx.

sudo systemctl restart nginx

Come abilitare TLS 1.3

Si prega di leggere il seguente articolo:

  • Come abilitare facilmente TLS 1.3 in Nginx su Ubuntu 20.04, 18.04, 16.04

Come abilitare IPv6 in Nginx

Se il tuo server ha un indirizzo IPv6 e il tuo nome di dominio ha un record AAAA, dovresti abilitare IPv6 in Nginx. Aggiungi la seguente riga nel blocco del server HTTP.

listen [::]:80;

E aggiungi la seguente riga nel blocco del server HTTPS.

listen [::]:443 ssl http2;

Salva e chiudi il file. Ricarica Nginx e il gioco è fatto.

sudo systemctl reload nginx

Rinnovo automatico del certificato

Per rinnovare automaticamente il certificato Let's Encrypt, modifica semplicemente il file crontab dell'utente root.

sudo crontab -e

Quindi aggiungi la seguente riga in basso.

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

--quiet flag sopprime l'output standard. Se vuoi ricevere un errore standard, aggiungi la seguente riga all'inizio del file crontab.

MAILTO=[email protected]

È necessario ricaricare Nginx per presentare il nuovo certificato ai client.

Impostazione PERCORSO in Crontab

A volte Cron mi invia il seguente messaggio, che può essere visualizzato anche in /var/log/letsencrypt/letsencrypt.log file.

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 causa di questo errore è che per impostazione predefinita il PATH in Cron è impostato su

PATH=/usr/bin:/bin

Ma il binario nginx si trova in /usr/sbin/nginx , Cron non riesce a trovarlo con il PERCORSO predefinito. Per correggere questo errore, aggiungi la seguente riga all'inizio del file Crontab.

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

CDN CloudFlare

Se desideri installare il certificato Let's Encrypt sul tuo server e allo stesso tempo utilizzare il servizio CDN di CloudFlare, dovrai abilitare Universal SSL di CloudFlare sul tuo sito, il che significa

  • Le connessioni tra i visitatori del sito e il server perimetrale CloudFlare sono crittografate utilizzando il certificato SSL universale CloudFlare
  • Le connessioni tra il tuo server di origine e il server perimetrale CloudFlare sono crittografate utilizzando il certificato emesso da Let's Encrypt.

Se installi il certificato Let's Encrypt sul tuo server di origine e reindirizzi HTTPS a HTTPS, ma disattivi CloudFlare Universal SSL, i browser Web si lamenteranno del fatto che il tuo sito Web è in un ciclo di reindirizzamento infinito perché CloudFlare reindirizza HTTPS a HTTP quando Universal SSL non è abilitato.

La seconda cosa che devi sapere è che se vuoi abilitare il record CAA mentre usi CloudFlare Universal SSL, devi anche creare il seguente record CAA.

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

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

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

Segui questo post per aggiungere il record CAA per il certificato CloudFlare Universal SSL.

Quindi, come procedi con l'installazione del certificato Let's Encrypt con CloudFlare? Bene, ci sono due scenari.

  1. Hai già installato il certificato Let's Encrypt utilizzando i passaggi precedenti, ora vuoi abilitare il servizio CloudFlare CDN.
  2. Il tuo sito Web utilizza il servizio CDN CloudFlare, ora desideri installare il certificato Let's Encrypt sul tuo server di origine.

Il primo scenario

Se sei nel primo scenario, puoi andare avanti e abilitare il servizio CloudFlare CDN e anche abilitare CloudFlare Universal SSL nel dashboard CloudFlare andando su Crypto> SSL e scegliendo Completo (rigoroso) . Il tuo sito funzionerà senza problemi.

Il secondo scenario

Se utilizzi CloudFlare CDN e ora desideri installare Let's Encrypt sul tuo server di origine, esegui il comando seguente per ottenere e installare il certificato 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]

Dopo aver ottenuto e installato il certificato sul tuo server, vai alla dashboard di Cloudflare e abilita CloudFlare Universal SSL.

Passaggio successivo

Spero che questo tutorial ti abbia aiutato a abilitare HTTPS su Nginx con Let's Encrypt su Ubuntu . Potresti anche voler configurare il firewall dell'applicazione Web ModSecurity per proteggere il tuo sito WordPress dall'hacking.

  • Come configurare ModSecurity con Nginx su Debian/Ubuntu

Come sempre, se hai trovato utile questo post, iscriviti alla nostra newsletter gratuita per ricevere altri suggerimenti e trucchi. Abbi cura di 🙂


Ubuntu
  1. Come proteggere Nginx con Lets Encrypt su Ubuntu 20.04 / 18.04

  2. SSL gratuito per Nginx su Centos di Let's encrypt

  3. Installa il certificato Let's Encrypt usando Certbot in Ubuntu 20.04 - Come farlo sul server web Nginx?

  4. Proteggi Nginx con Let's Encrypt su Ubuntu 18.04 - Come farlo?

  5. Come proteggere Nginx con Let's Encrypt su Ubuntu 20.04

Come installare Nginx con Let's Encrypt SSL su Ubuntu 20.04 LTS

Proteggi Nginx con Let's Encrypt SSL Certificate su Ubuntu 18.04

Come proteggere Nginx con Let's Encrypt certificato SSL

Come proteggere il server LEMP con Let's Encrypt Free SSL su Ubuntu 18.04 VPS

Come proteggere Nginx con Let's Encrypt su Ubuntu 20.04

Come proteggere Apache con Let's Encrypt su Ubuntu 20.04