Come Creare e Utilizzare SSL autofirmato in Nginx

0
227

Se avete solo bisogno di crittografia per server interno delle connessioni o non-utente verso siti, firma i propri certificati SSL è un modo semplice per evitare di dover trattare con un esterno di autorità di certificazione. Ecco come impostare il tutto in nginx.

Se siete più interessati a ricevere gratuitamente i certificati SSL, è possibile utilizzare sempre LetsEncrypt, che è più adatto per i server pubblici con l’utente di fronte a siti web, in quanto esso verrà visualizzato come provenienti da un’autorità di certificazione riconosciuta, nel manuale di browser. Tuttavia, non può essere utilizzato per crittografare privati indirizzi IP, che è il motivo per cui è necessario firmare un cert te.

Generare e Firmare un Certificato SSL

Per fare ciò, dobbiamo utilizzare openssl utilità. Probabilmente questo già installato, in quanto è una dipendenza di Nginx. Ma se è in qualche modo mancante, è possibile installarlo dal vostro gestore di pacchetti della distro. Per i sistemi basati su Debian, come Ubuntu, che sarebbe:

sudo apt-get install openssl

Dopo openssl è installato, è possibile generare il certificato con il seguente comando:

sudo openssl req -x509 -nodi -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx.key-out /etc/ssl/certs/nginx.crt

Vi verrà chiesto alcune informazioni sulla vostra organizzazione. Perché questo è il self-signed, l’unico che conta veramente è il “Nome Comune”, che dovrebbe essere impostato il nome del dominio o l’indirizzo IP del server.

Il Nome del paese (codice a 2 lettere) []:
Stato o Provincia Nome (nome completo) []:
Località Nome (ad esempio, città) []:
Il Nome dell’organizzazione (ad esempio, società) []:
Nome Unità organizzativa (ad esempio, la sezione) []:
Nome comune (ad esempio, nome host completo) []: your_ip_address
Indirizzo E-Mail []:

Questo richiederà un secondo per generare una nuova chiave privata RSA, utilizzato per firmare il certificato, e conservarlo in /etc/ssl/private/nginx.chiave. Il certificato viene memorizzato in /etc/ssl/certs/nginx.crt, ed è valida per un intero anno.

Potremo anche decidere di creare un gruppo Diffie-Hellman. Questo è utilizzato per perfect forward secrecy, che genera effimera chiavi di sessione per garantire che le precedenti comunicazioni non possono essere decifrati se la chiave di sessione viene compromessa. Questo non è del tutto necessario per le comunicazioni interne, ma se vuoi essere più sicuro possibile non si deve ignorare questo passaggio.

sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096

Questo prendere un po ‘ —circa un’ora, a seconda di quanto velocemente il vostro server. Afferrare il pranzo, e tornare al vostro terminale un po ‘ per configurare Nginx.

Configurare Nginx per Utilizzare la Chiave Privata e Il Certificato SSL

Per rendere le cose facili, ci metterò tutta la configurazione in un frammento di file che possiamo inserire nel nostro server nginx blocchi. Creare un nuovo frammento di configurazione di nginx gli snippet directory:

touch /etc/nginx/snippets/auto-firmato.conf

Aprirlo in un editor di testo e incollare il seguente:

ssl_certificate /etc/ssl/certs/nginx.crt;
ssl_certificate_key /etc/ssl/private/nginx.chiave;

ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers su;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_session_timeout 10m;
ssl_session_cache condivisa:SSL:10m;
ssl_session_tickets off;
ssl_stapling su;
ssl_stapling_verify su;
resolver 8.8.8.8 8.8.4.4 valido=300;
resolver_timeout 5s;
add_header X-Frame-Options NEGARE;
add_header X-Content-Type-Opzioni nosniff;
add_header X-XSS-Protezione “1; mode=block”;

ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ecdh_curve secp384r1;

Le prime due righe di questo frammento di configurare nginx di utilizzare il nostro self-made certificato e la nostra chiave privata. Il blocco successivo è generale impostazioni SSL, e, infine, le ultime due righe configurare nginx di utilizzare il nostro gruppo Diffie-Hellman per inoltrare la sicurezza. È possibile omettere questo se non hai voglia di aspettare.

L’unica altra cosa per abilitare HTTP Strict Transport Security, che configura il tuo sito per sempre l’utilizzo di SSL. Questo richiederebbe un redirect permanente da HTTP a HTTPS, così si dovrebbe verificare che funziona SSL prima di attivarla.

Ora, è possibile modificare il primario di configurazione di nginx (di solito si trova in /etc/nginx/nginx.conf per singoli siti, o sotto il vostro nome di dominio in /etc/nginx/sites-available for multi-server del sito), e l’origine del frammento:

server {
listen 443 ssl;
ascoltare [::]:443 ssl;

includere frammenti/auto-firmato.conf;

server_name example.com www.example.com;
. . .
}

Potrai anche voler impostare un redirect da HTTP a HTTPS, che si può fare con un ulteriore blocco del server in ascolto sulla porta 80:

server {
listen 80;
ascoltare [::]:80;

server_name example.com www.example.com;

ritorno 302 https://$nome$request_uri;
}

Questo è un reindirizzamento 302, che è solo temporanea. Avrai voglia di passare questo a 301 se tutto funziona correttamente.

Prova la tua configurazione, riavviare il server nginx.:

sudo service nginx riavviare

Perché il traffico HTTPS utilizza la porta 443, è necessario configurare il firewall per consentire il trasporto su quella porta. Se si utilizza iptables o UFW, è necessario aprire le porte dalla linea di comando. Se si utilizza un servizio di hosting come AWS che è dotato di un firewall, è necessario aprire anche la loro interfaccia web.

Se il servizio è operativo interamente all’interno della vostra LAN, si potrebbe desiderare di aggiornare il vostro specifico subnet di indirizzi IP per disabilitare l’accesso dall’esterno della LAN, e accedere al tuo server tramite una connessione VPN.

Se tutto funziona correttamente, si dovrebbe ora essere in grado di accedere al server attraverso il protocollo HTTPS. Il tuo browser potrebbe visualizzare un messaggio di avviso simile a questo:

Non preoccupatevi, questo è previsto, e il motivo per cui non è possibile utilizzare questi certificati client-di fronte a siti web. Manuale confermare la fiducia ai server per l’accesso.

Il messaggio di avviso visualizzato qui è un po ‘ fuorviante—il vostro sito è sicuro fintanto che la chiave privata non è compromessa, ed è perfettamente sicuro se si imposta lo scambio di chiavi Diffie-Hellman forward secrecy. Il problema risiede nell’identità, come Chrome non può verificare che il tuo server è chi dice di essere, perché hai firmato la cert te.

Una volta che hai verificato che non ci siano problemi di SSL, è possibile passare il reindirizzamento HTTP per un redirect 301:

ritorno 301 https://$nome$request_uri;

E riavviare nginx per applicare le modifiche.