Nginx SSL Administration
Komplet guide til SSL/TLS-certifikatopsætning i Nginx på Linux med OCSP stapling, sikre cipher suites og HTTP til HTTPS redirect.
Oversigt
Nginx er en af de mest populære webservere og reverse proxyer i verden. Denne guide dækker hele SSL/TLS-opsætningsprocessen: fra CSR-generering med OpenSSL, over certifikatinstallation og kædebundling, til en sikker konfiguration med moderne TLS-indstillinger, OCSP stapling og HSTS.
Forudsætninger
- Nginx 1.18+ installeret (ældre versioner understøtter muligvis ikke TLS 1.3)
- OpenSSL installeret på serveren
- Root- eller sudo-adgang
- Et domænenavn der peger på serverens IP-adresse
- Et SSL-certifikat fra FairSSL (DV, OV eller EV)
Trin 1: Generer privat nøgle og CSR med OpenSSL
# Opret mappe til certifikatfiler
sudo mkdir -p /etc/nginx/ssl/eksempel.dk
# Generer 2048-bit RSA-noegle og CSR
sudo openssl req -new -newkey rsa:2048 -nodes \
-keyout /etc/nginx/ssl/eksempel.dk/privkey.key \
-out /etc/nginx/ssl/eksempel.dk/eksempel.csr \
-subj "/C=DK/ST=Hovedstaden/L=Koebenhavn/O=Eksempel A\/S/CN=www.eksempel.dk"
# Saet restriktive tilladelser paa den private noegle
sudo chmod 600 /etc/nginx/ssl/eksempel.dk/privkey.key
sudo chown root:root /etc/nginx/ssl/eksempel.dk/privkey.keyIndsend indholdet af CSR-filen i dit FairSSL kontrolpanel for at bestille certifikatet.
Trin 2: Forbered certifikatfiler og kædebundling
Når FairSSL har udstedt certifikatet, modtager du typisk:
- Domænecertifikat:
eksempel_dk.crt - Intermediate/CA Bundle:
ca-bundle.crt
Nginx kræver at certifikat og intermediate-certifikat kombineres i en enkelt fil (fullchain). Rækkefølgen er vigtig -- dit certifikat først, derefter intermediate:
# Opret fullchain-fil (certifikat + intermediate)
cat eksempel_dk.crt ca-bundle.crt | sudo tee /etc/nginx/ssl/eksempel.dk/fullchain.crt > /dev/null
# Kopier den private noegle (hvis den ikke allerede ligger der)
sudo cp privkey.key /etc/nginx/ssl/eksempel.dk/privkey.key
# Saet korrekte tilladelser
sudo chmod 644 /etc/nginx/ssl/eksempel.dk/fullchain.crt
sudo chmod 600 /etc/nginx/ssl/eksempel.dk/privkey.keyVigtigt: Inkluder ikke rod-certifikatet i fullchain-filen. Browsere har allerede rod-certifikater forudinstalleret.
Trin 3: Konfigurer Nginx server block for HTTPS
Opret eller rediger din server block-konfiguration (typisk i /etc/nginx/sites-available/):
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.eksempel.dk eksempel.dk;
# Certifikat og noegle
ssl_certificate /etc/nginx/ssl/eksempel.dk/fullchain.crt;
ssl_certificate_key /etc/nginx/ssl/eksempel.dk/privkey.key;
# TLS-protokoller (kun TLS 1.2 og 1.3)
ssl_protocols TLSv1.2 TLSv1.3;
# Cipher suites (moderne og sikre)
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
# SSL session caching
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# HSTS (HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# Document root og oevrig konfiguration
root /var/www/eksempel.dk/public;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}Trin 4: HTTP til HTTPS redirect
Tilføj en separat server block der omdirigerer al HTTP-trafik til HTTPS:
server {
listen 80;
listen [::]:80;
server_name www.eksempel.dk eksempel.dk;
# Redirect al trafik til HTTPS
return 301 https://$host$request_uri;
}Trin 5: Aktiver OCSP Stapling
OCSP stapling forbedrer TLS-handshake-hastigheden ved at servere certifikatets gyldighedsstatus direkte:
# Tilfoej i server-blokken (inden for ssl-konfigurationen):
ssl_stapling on;
ssl_stapling_verify on;
# Peg paa intermediate-certifikatet for OCSP-verifikation
ssl_trusted_certificate /etc/nginx/ssl/eksempel.dk/fullchain.crt;
# DNS resolver (brug din udbyder eller offentlige resolvere)
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 5s;Trin 6: Test og genstart
# Test Nginx-konfigurationen for syntaksfejl
sudo nginx -t
# Genindlaes konfigurationen (uden nedetid)
sudo systemctl reload nginx
# Eller fuld genstart
sudo systemctl restart nginx
# Verificer at Nginx lytter paa port 443
sudo ss -tlnp | grep 443Test certifikatet:
# Vis certifikatinfo og kaede
openssl s_client -connect www.eksempel.dk:443 -servername www.eksempel.dk < /dev/null 2>/dev/null | openssl x509 -noout -subject -dates -issuer
# Test OCSP stapling
openssl s_client -connect www.eksempel.dk:443 -servername www.eksempel.dk -status < /dev/null 2>/dev/null | grep -A 5 "OCSP Response"
# Test med curl
curl -vI https://www.eksempel.dk 2>&1 | grep -E "SSL|TLS|subject|issuer"Brug også FairSSLs SSL-scanner eller Qualys SSL Labs for en fuld online evaluering af din TLS-konfiguration.
Fejlsøgning
- "nginx: [emerg] cannot load certificate": Certifikatfilen er tom, beskadiget eller i forkert format. Kontroller at fullchain.crt indeholder gyldige PEM-blokke (begyndende med
-----BEGIN CERTIFICATE-----). - "PEM routines:get_name:no start line": Filen indeholder ugyldige tegn eller har forkert encoding. Sørg for at filen er i UTF-8/ASCII uden BOM.
- Browser viser "Not Secure": Fullchain-filen mangler intermediate-certifikatet. Genskab filen med
cat cert.crt intermediate.crt > fullchain.crt. - OCSP stapling virker ikke: Det kan tage et par minutter efter genstart, før Nginx henter OCSP-svar. Tjek med
openssl s_client -status. Kontroller også at resolver er konfigureret korrekt. - ERR_SSL_PROTOCOL_ERROR: Kontroller at port 443 er åben i firewallen (
sudo ufw allow 443) og atlisten 443 ssler korrekt konfigureret. - Certifikat udløbet: Sæt en påmindelse eller overvågning. Tjek udløbsdato med
openssl x509 -enddate -noout -in /etc/nginx/ssl/eksempel.dk/fullchain.crt.
Styrk din TLS-sikkerhed
Brug Mozilla SSL Configuration Generator til at generere en sikker TLS-konfiguration med moderne cipher suites og protokolindstillinger.
Mozilla SSL Configuration Generator guide