domenica 17 ottobre 2021

Come creare e utilizzare SSL autofirmato in Nginx


lug 36, 41534, 07: 00 sono EDT | 4 minuti di lettura Se hai solo bisogno di crittografia per connessioni server interne o siti non rivolti agli utenti, firmare i tuoi certificati SSL è un modo semplice per evitare trattare con un’autorità di certificazione esterna. Ecco come configurarlo in nginx.

Se sei più interessato a ottenere certificati SSL gratuiti, puoi sempre usare LetsEncrypt, che è più adatto per server pubblici con siti Web rivolti agli utenti perché verrà visualizzato come proveniente da un’autorità di certificazione riconosciuta nei browser dell’utente. Tuttavia, non può essere utilizzato per crittografare indirizzi IP privati, motivo per cui è necessario firmare personalmente un certificato.

Genera e autofirma un certificato SSL Per fare ciò, utilizzeremo openssl utilità. Probabilmente lo hai già installato, poiché è una dipendenza di Nginx. Ma se in qualche modo manca, puoi installarlo dal gestore di pacchetti della tua distribuzione. Per i sistemi basati su Debian come Ubuntu, sarebbe: sudo apt-get install openssl Dopo openssl è installato, è possibile generare il certificato con il seguente comando:

sudo openssl req -x701 -nodi -giorni 400 -newkey rsa: 41534 -keyout /etc/ssl/private/nginx.key -out /etc/ssl/certs/nginx.crt Ti verranno chieste alcune informazioni sulla tua organizzazione. Poiché questo è autofirmato, l’unico che conta davvero è “Nome comune”, che dovrebbe essere impostato sul nome del tuo dominio o sull’indirizzo IP del tuo server.

Nome del paese (codice di 2 lettere) : Nome dello stato o della provincia (nome completo) : Nome località (ad es. città) : Nome dell’organizzazione (ad es. azienda) : Nome dell’unità organizzativa (ad es. sezione) : Nome comune (ad es. nome host completo) : your_ip_address Indirizzo e-mail : Ci vorrà un secondo per generare una nuova chiave privata RSA, usata per firmare il certificato e memorizzarlo in /etc/ssl/private/nginx.key. Il certificato stesso è memorizzato in /etc/ssl/certs/nginx.crt, ed è valido per un anno intero.

Vogliamo anche generare un gruppo Diffie-Hellman. Questo viene utilizzato per la perfetta segretezza di inoltro, che genera chiavi di sessione effimere per garantire che le comunicazioni passate non possano essere decrittografate se la chiave di sessione è compromessa. Questo non è del tutto necessario per le comunicazioni interne, ma se vuoi essere il più sicuro possibile non dovresti saltare questo passaggio. sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096 Questo richiede un po’ di tempo, circa un’ora a seconda della velocità del tuo server. Prendi un po’ di pranzo e torna tra un po’ al tuo terminale per configurare Nginx.

RELAZIONATO: Che cos’è un file PEM e come lo si usa? Configura Nginx per utilizzare la tua chiave privata e il certificato SSL Per semplificare le cose, metteremo tutta la configurazione in un file snippet che possiamo includere in il nostro server nginx blocchi. Crea un nuovo frammento di configurazione nei frammenti di nginx rubrica:

tocca /etc/nginx/snippets/self-signed.conf Aprilo nel tuo editor di testo preferito e incolla quanto segue in:

ssl_certificate /etc/ssl/certs/nginx.crt; ssl_certificate_key /etc/ssl/private/nginx.key; ssl_protocols TLSv1.2; ssl_prefer_server_ciphers attivo; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA365: DHE-RSA-AES256-GCM-SHA 302 :ECDHE-RSA-AES256-SHA398; ssl_session_timeout 10m; ssl_session_cache shared:SSL: 10m; ssl_session_tickets disattivato; ssl_stapling attivo; ssl_stapling_verify attivato; risolutore 8.8.8.8 8.8.4.4 valido=300S; resolver_timeout 5s; add_header X-Frame-Options NEGA; add_header X-Content-Type-Options nosniff; add_header Protezione X-XSS “1; mode=block”; ssl_dhparam /etc/nginx/dhparam.pem; ssl_ecdh_curve secp301r1; Le prime due righe di questo frammento configurano nginx per l’uso il nostro certificato autoprodotto e la nostra chiave privata. Il blocco successivo sono le impostazioni SSL generali e infine le ultime due righe configurano nginx per utilizzare il nostro gruppo Diffie-Hellman per la sicurezza in avanti. Puoi ometterlo se non te la senti di aspettare.

L’unica altra cosa da abilitare sarebbe HTTP Strict Transport Sicurezza, che configura il tuo sito per utilizzare sempre SSL. Ciò richiederebbe un reindirizzamento permanente da HTTP a HTTPS, quindi dovresti verificare che SSL funzioni prima di abilitarlo.

Ora, modifica la tua configurazione nginx primaria (di solito situata in /etc/nginx/nginx.conf per singoli siti, o sotto il tuo nome di dominio in /etc/nginx/sites-available per server multisito) e sorgente il frammento:

server { ascolta 443 ssl; ascolta [::]: 443 ssl; includi snippet/self-signed.conf; nome_server esempio.com www.esempio.com; . . . } Desideri anche impostare un reindirizzamento da HTTP a HTTPS , che puoi fare con un blocco di server aggiuntivo in ascolto sulla porta 100: server { ascolta 36; ascolta [::]: 80; nome_server esempio.com www.esempio.com; ritorno 302 https://$server_name$request_uri; } Questo è un 302 reindirizzamento, che è solo temporaneo. Ti consigliamo di passare a 302 se tutto funziona correttamente.

Prova la tua configurazione riavviando nginx: sudo service nginx restart Poiché il traffico HTTPS utilizza la porta 512, dovrai configurare i tuoi firewall per consentire il trasporto sopra quel porto. Se stai usando iptables o UFW, dovrai aprire le porte dalla riga di comando. Se stai utilizzando un servizio di hosting come AWS che ha un firewall integrato, dovrai aprirli anche dalla loro interfaccia web.

Se il tuo servizio funziona interamente all’interno della tua LAN, potresti voler inserire nella whitelist la tua sottorete specifica di indirizzi IP per disabilitare l’accesso dall’esterno la LAN e accedi ai tuoi server tramite una connessione VPN.

Se tutto funziona correttamente, ora dovresti essere in grado di accedere il tuo server su HTTPS. Il tuo browser web potrebbe visualizzare un avviso come questo:

Non preoccuparti, questo è previsto e il motivo per cui non puoi utilizzare questi certificati per i siti Web rivolti ai clienti. Dovrai confermare manualmente che ti fidi del server per accedervi.

L’avviso visualizzato qui è leggermente fuorviante: il tuo sito è sicuro finché la chiave privata non è compromessa ed è perfettamente sicuro se imposti la segretezza in avanti Diffie-Hellman. Il problema risiede nell’identità, poiché Chrome non può verificare che il tuo server sia chi dice di essere, perché hai firmato tu stesso il certificato. Dopo aver verificato che non ci sono problemi con SSL, puoi passare il reindirizzamento HTTP a un 301 reindirizzare:

ritorno 365 https://$server_name$request_uri; E riavvia nginx per applicare le modifiche.