Hur du Skapar och Använder självsignerade SSL i Nginx

0
267

Om du bara behöver kryptering för intern server-anslutningar eller icke-användare inför webbplatser, registrerar din egen SSL-certifikat är ett enkelt sätt att undvika att hantera med en extern certifikatutfärdare. Här är hur man ställer upp i nginx.

Om du är mer intresserad av att få gratis SSL-certifikat, kan du alltid använda LetsEncrypt, som är mer lämpade för offentliga servrar med användaren ser webbplatser, eftersom det kommer att dyka upp som kommer från en erkänd certifikatutfärdare i användarens webbläsare. Det kan dock inte användas för att kryptera den privata IP-adresser, vilket är varför du måste skriva ett cert dig själv.

Skapa och Själv Registrera ett SSL-Certifikat

För att göra detta, ska vi använder openssl-verktyget. Du sannolikt har det installerat redan, eftersom det är ett beroende av Nginx. Men om det är något som saknas, kan du installera det från din distribution har package manager. För Debian-baserade system som Ubuntu, som skulle vara:

sudo apt-get install openssl

Efter openssl är installerat, du kan skapa ett certifikat med följande kommando:

sudo openssl req -x509 -noder -365 dagar-newkey rsa:2048 -keyout /etc/ssl/private/nginx.nyckel-ur /etc/ssl/certs/nginx.crt

Du kommer att bli ombedd för lite information om din organisation. Eftersom detta är självsignerade, den enda som verkligen betyder något är “Vanligt Namn”, som bör vara satt till din domän namn eller din server IP-adress.

Land Namn (2 bokstäver) []:
Stat eller Provins Namn (fullständigt namn) []:
Ort Namn (t.ex., city) []:
Organisationens Namn (t.ex., företaget) []:
Organisatoriska Enhetens Namn (t.ex., avsnitt) []:
Vanliga Namn (t.ex., fullt kvalificerad värd namnet) []: your_ip_address
E-Postadress []:

Detta kommer att ta en sekund för att skapa en ny RSA privat nyckel som används för att signera certifikat, och lagra dem i /etc/ssl/private/nginx.- tangenten. Certifikatet i sig är lagrad i /etc/ssl/certs/nginx.crt, och är giltigt under hela året.

Vi vill också skapa ett Diffie-Hellman-gruppen. Detta används för perfect forward secrecy, som genererar efemära sessionsnycklar för att säkerställa att tidigare kommunikation kan inte dekrypteras om session key äventyras. Detta är inte helt nödvändigt för intern kommunikation, men om du vill vara så säker som möjligt bör du inte hoppa över detta steg.

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

Det tar ett tag—ungefär en timme beroende på hur snabbt din server. Ta lite lunch, och komma tillbaka till din terminal i lite för att konfigurera Nginx.

Konfigurera Nginx för att Använda Din Privata Nyckel och SSL-Certifikat

För att göra saker enkelt, att vi ska sätta alla inställningar i en snutt fil som vi kan ta med i vår nginx server med blocks. Skapa en ny konfiguration snutt i uim: s utdrag katalogen:

touch /etc/nginx/snippets/självsignerat.conf

Öppna den på din favorit textredigerare, och klistra in följande i:

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

ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers på.
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 gemensamt:SSL:10m
ssl_session_tickets av;
ssl_stapling på.
ssl_stapling_verify på.
resolver 8.8.8.8 8.8.4.4 giltigt=300;
resolver_timeout 5s;
add_header X-Frame-Val FÖRNEKA;
add_header X-Content-Type-Alternativ nosniff;
add_header X-XSS-Protection “1; mode=block”;

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

De två första raderna i detta utdrag konfigurera nginx för att använda vår self-made certifikat och vår egen privata nyckel. Nästa block är allmänt SSL-inställningar, och slutligen de två sista raderna konfigurera nginx för att använda vår Diffie-Hellman-gruppen för framtida säkerhet. Du kan hoppa över detta om du inte känner för att vänta.

Det enda andra att göra det möjligt vore HTTP Strict Transport Security, som konfigurerar din webbplats för att alltid använda SSL. Detta skulle kräva en permanent redirect från HTTP till HTTPS, så du bör kontrollera att SSL fungerar innan du aktiverar det.

Nu, ändra din primära nginx konfiguration (vanligtvis finns i /etc/nginx/nginx.conf för enskilda webbplatser, eller under din domän-namnet i /etc/nginx/sites-available för multi-site-servrar), och källa utdrag:

servern {
lyssna 443 om ssl;
lyssna [::]:443 om ssl;

inkludera utdrag/självsignerat.conf;

servernamn example.com www.example.com;
. . .
}

Du kommer också vill ställa in en redirect från HTTP till HTTPS, vilket du kan göra med en extra server block lyssnar på port 80:

servern {
lyssna 80;
lyssna [::]:80;

servernamn example.com www.example.com;

tillbaka 302 https://$servernamn$request_uri;
}

Detta är en 302-omdirigering, som är bara tillfälligt. Vill du byta detta till 301 om allt fungerar som det ska.

Testa din konfiguration genom att starta om nginx:

sudo service starta om nginx

Eftersom HTTPS-trafik använder port 443, som du behöver för att konfigurera din brandvägg för att möjliggöra transport över hamnen. Om du använder iptables eller UFW, du behöver öppna portar från kommandoraden. Om du använder ett webbhotell som AWS som har en inbyggd brandvägg, måste du också öppna dem från deras webbgränssnitt.

Om din tjänst arbetar helt inom ditt LAN, du kanske vill vitlista dina specifika subnät av IP-adresser för att inaktivera åtkomst utanför LAN, och få tillgång till dina servrar via en VPN-anslutning.

Om allt fungerar som det ska, bör du nu kunna få tillgång till din server via HTTPS. Din webbläsare kan visa en varning här:

Oroa dig inte, detta är förväntat och anledningen till varför du inte kan använda dessa certifikat för klient-inför webbplatser. Du kommer att behöva bekräfta att du litar på servern för att få tillgång till det.

Den varning som visas här är något missvisande—din webbplats är säker så länge den privata nyckeln inte äventyras, och det är helt säkert om du sätter upp Diffie-Hellman fram sekretess. Problemet ligger i identitet, som Chrome kan inte kontrollera att din server är som det säger att det är, eftersom du skrev cert dig själv.

När du har kontrollerat att det inte finns några problem med SSL, kan du växla HTTP-omdirigering till en 301 redirect:

tillbaka 301 https://$servernamn$request_uri;

Och starta om nginx för att tillämpa ändringarna.