A previous version of this tutorial was written by Sergey Zhukaev.
Introductie
Nginx is een snelle en betrouwbare open-source webserver. Het heeft zijn populariteit te danken aan zijn lage geheugenverbruik, hoge schaalbaarheid, eenvoudige configuratie en ondersteuning voor een breed scala aan protocollen.
HTTP/2 is een nieuwere versie van het Hypertext Transport Protocol, dat op het web wordt gebruikt om pagina’s van de server naar de browser te verzenden. HTTP/2 is de eerste grote update van HTTP in bijna twee decennia: HTTP1.1 werd geïntroduceerd bij het publiek in 1999 toen webpagina’s veel kleiner waren in omvang. Het internet is sindsdien drastisch veranderd, en we worden nu geconfronteerd met de beperkingen van HTTP 1.1. Het protocol beperkt de potentiële overdrachtssnelheden voor de meeste moderne websites omdat het delen van een pagina in een wachtrij downloadt – het vorige deel moet volledig worden gedownload voordat de download van het volgende deel begint – en een gemiddelde moderne webpagina tientallen individuele CSS-, javascript- en afbeeldingsbestanden downloadt.
HTTP/2 lost dit probleem op omdat het een paar fundamentele veranderingen met zich meebrengt:
- Alle verzoeken worden parallel gedownload, niet in een wachtrij
- HTTP-headers worden gecomprimeerd
- Pagina’s worden overgedragen als een binair bestand, niet als een tekstbestand, wat efficiënter is
- Servers kunnen gegevens “pushen” zelfs zonder het verzoek van de gebruiker, wat de snelheid verbetert voor gebruikers met een hoge latentie.
Hoewel HTTP/2 geen versleuteling vereist, hebben ontwikkelaars van de twee meest populaire browsers, Google Chrome en Mozilla Firefox, verklaard dat ze HTTP/2 alleen zullen ondersteunen voor HTTPS-verbindingen om veiligheidsredenen. Daarom, als je besluit servers met HTTP/2-ondersteuning op te zetten, moet je ze ook beveiligen met HTTPS.
Deze handleiding zal je helpen bij het opzetten van een snelle en beveiligde Nginx-server met HTTP/2-ondersteuning.
Vereisten
Voordat je begint, heb je een paar dingen nodig:
- Een Ubuntu 22.04-server die is ingesteld door de handleiding voor het initiële serverinstellingen voor Ubuntu 22.04 te volgen, inclusief een sudo niet-rootgebruiker en een firewall.
- Nginx geïnstalleerd op je server, wat je kunt doen door Hoe Nginx te installeren op Ubuntu 22.04 te volgen.
- A domain name configured to point to your server. You can purchase one on Namecheap or get one for free on Freenom. You can learn how to point domains to DigitalOcean Droplets by following the documentation on How To Manage Your Domain With DigitalOcean.
- A TLS/SSL certificate configured for your server. You have two options:
- Je kunt een gratis certificaat krijgen van Let’s Encrypt door Hoe Nginx te beveiligen met Let’s Encrypt op Ubuntu 22.04 te volgen.
- U kunt ook een zelfondertekend certificaat genereren en configureren door Hoe maak je een zelfondertekend SSL-certificaat voor Nginx in Ubuntu 22.04 te volgen.
- Nginx geconfigureerd om verkeer van poort
80
naar poort443
om te leiden, wat zou moeten worden gedekt door de vorige vereisten. - Nginx geconfigureerd om een Ephemeral Diffie-Hellman (DHE) sleutel van 2048 bits of hoger te gebruiken, wat ook zou moeten worden gedekt door de vorige vereisten.
Stap 1 — Het inschakelen van HTTP/2-ondersteuning
Als u de serverblokinstallatiestap in de Nginx-installatietutorial heeft gevolgd, zou u een serverblok voor uw domein moeten hebben op /etc/nginx/sites-available/uw_domein
met de juiste instelling voor de server_name
-richtlijn. De eerste wijziging die we zullen aanbrengen, is om het serverblok van uw domein te wijzigen om HTTP/2 te gebruiken.
Open het configuratiebestand voor uw domein met nano
of uw voorkeurseditor:
Zoek in het bestand de listen
-variabelen die zijn gekoppeld aan poort 443
:
...
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
...
De eerste is voor IPv6-verbindingen. De tweede is voor alle IPv4-verbindingen. We zullen HTTP/2 inschakelen voor beide.
Wijzig elke listen
-instructie om http2
op te nemen:
...
listen [::]:443 ssl http2 ipv6only=on;
listen 443 ssl http2;
...
Dit vertelt Nginx om HTTP/2 te gebruiken met ondersteunde browsers.
Sla het configuratiebestand op en verlaat de teksteditor. Als je nano
gebruikt, druk dan op Ctrl+X
, vervolgens, wanneer gevraagd, Y
en dan Enter.
Telkens wanneer je wijzigingen aanbrengt in Nginx-configuratiebestanden, moet je de configuratie controleren op fouten, met behulp van de -t
-vlag, die de ingebouwde syntaxiscontroleopdracht van Nginx uitvoert:
Als de syntaxis foutloos is, ontvang je output zoals het volgende:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Vervolgens configureer je je Nginx-server om een meer restrictieve lijst van ciphers te gebruiken om de beveiliging van je server te verbeteren.
Stap 2 — Verwijderen van oude en onveilige cipher suites
HTTP/2 heeft een blokkeerlijst van oude en onveilige ciphers die vermeden moeten worden. Cipher suites zijn cryptografische algoritmen die beschrijven hoe de overgedragen gegevens moeten worden versleuteld.
De methode die je gebruikt om de ciphers te definiëren, is afhankelijk van hoe je je TLS/SSL-certificaten voor Nginx hebt geconfigureerd.
Als je Certbot hebt gebruikt om je certificaten te verkrijgen, heeft het ook het bestand /etc/letsencrypt/options-ssl-nginx.conf
aangemaakt dat ciphers bevat die niet veilig genoeg zijn voor HTTP/2. Het aanpassen van dit bestand zal echter voorkomen dat Certbot in de toekomst updates toepast, dus we vertellen Nginx gewoon om dit bestand niet te gebruiken en we zullen onze eigen lijst met ciphers specificeren.
Open het serverblok configuratiebestand voor je domein:
sudo nano /etc/nginx/sites-enabled/your_domain
Zoek de regel die het bestand options-ssl-nginx.conf
inclusief en commentaar het uit door een #
karakter aan het begin van de regel toe te voegen:
# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
Voeg onder die regel deze regel toe om de toegestane ciphers te definiëren:
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
Sla het bestand op en sluit de editor af.
Als je zelfondertekende certificaten hebt gebruikt of een certificaat van een derde partij hebt gebruikt en het volgens de vereisten hebt geconfigureerd, open dan het bestand /etc/nginx/snippets/ssl-params.conf
in je teksteditor:
Zoek de volgende regel:
...
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;
...
Wijzig het om de volgende lijst met ciphers te gebruiken:
...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
Sla het bestand op en sluit je editor af.
Controleer opnieuw de configuratie op syntaxfouten met het commando nginx -t
:
Als je fouten tegenkomt, los ze dan op en test opnieuw.
Zodra je configuratie de syntaxiscontrole doorstaat, herstart Nginx met behulp van het systemctl
commando:
Nadat de server opnieuw is opgestart, laten we controleren of alles werkt.
Stap 3 — Controleren of HTTP/2 is ingeschakeld
Laten we ervoor zorgen dat de server draait en werkt met HTTP/2.
Gebruik het curl
-commando om een verzoek naar je site te maken en de headers te bekijken:
Je ontvangt output zoals het volgende:
HTTP/2 200
**Server**: nginx/1.18.0 (Ubuntu)
**Date**: Tue, 21 Jun 2022 22:19:09 GMT
**Content-Type**: text/html
**Content-Length**: 612
**Last-Modified**: Tue, 21 Jun 2022 22:17:56 GMT
**Connection**: keep-alive
**ETag**: "62b24394-264"
**Accept-Ranges**: bytes
Je kunt ook controleren of HTTP/2 wordt gebruikt in Google Chrome. Open Chrome en ga naar https://je_domein
. Open de Chrome-ontwikkelaarstools (Weergave -> Ontwikkelaar -> Ontwikkelaarstools) en vernieuw de pagina (Weergave -> Deze pagina opnieuw laden). Ga naar het Netwerk-tabblad, klik met de rechtermuisknop op de tabelkoprij die begint met Naam en selecteer de Protocol-optie uit het popupmenu.
Je hebt nu een nieuwe Protocol-kolom die h2
bevat (wat staat voor HTTP/2), wat aangeeft dat HTTP/2 werkt.
Op dit punt ben je klaar om inhoud te serveren via het HTTP/2-protocol. Laten we de beveiliging en prestaties verbeteren door HSTS in te schakelen.
Stap 4 — Het inschakelen van HTTP Strict Transport Security (HSTS)
Zelfs als uw HTTP-verzoeken worden omgeleid naar HTTPS, kunt u HTTP Strict Transport Security (HSTS) inschakelen om te voorkomen dat u die omleidingen moet doen. Als de browser een HSTS-header vindt, zal deze gedurende een bepaalde periode niet proberen verbinding te maken met de server via regulier HTTP. Ongeacht wat, zal het gegevens uitwisselen met alleen versleutelde HTTPS-verbinding. Deze header beschermt ons ook tegen protocol downgrade-aanvallen.
Open opnieuw het serverblokconfiguratiebestand voor uw domein:
sudo nano /etc/nginx/your_domain
Voeg deze regel toe aan hetzelfde blok van het bestand dat de SSL-cijfers bevat om HSTS in te schakelen:
server {
...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
add_header Strict-Transport-Security "max-age=15768000" always;
}
...
De max-age
is ingesteld in seconden. De waarde 15768000
komt overeen met 6 maanden.
Standaard wordt deze header niet toegevoegd aan subdomeinverzoeken. Als u subdomeinen heeft en wilt dat HSTS op allemaal van toepassing is, moet u de variabele includeSubDomains
toevoegen aan het einde van de regel, zoals deze:
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
Sla het bestand op en sluit de editor af.
Controleer nogmaals de configuratie op syntaxisfouten:
Herstart tot slot de Nginx-server om de wijzigingen toe te passen.
Conclusie
Je Nginx-server serveert nu HTTP/2-pagina’s. Als je de sterkte van je SSL-verbinding wilt testen, bezoek dan Qualys SSL Lab en voer een test uit tegen je server. Als alles correct geconfigureerd is, zou je een A+ beoordeling voor beveiliging moeten krijgen.
Om meer te weten te komen over hoe Nginx serverblokregels analyseert en implementeert, probeer dan Understanding Nginx Server and Location Block Selection Algorithms te lezen.