TLS für Express.js konfigurieren

Schritt-für-Schritt-Anleitung: HTTPS-Server mit https.createServer einrichten, TLS-Optionen konfigurieren und warum ein Reverse Proxy die bessere Wahl für Produktivumgebungen ist.

Express.js · Schritt für Schritt

TLS in Express.js — direkt oder über Reverse Proxy

Express.js unterstützt TLS über Node.js' eingebautes https-Modul. Für Produktivumgebungen ist ein Reverse Proxy (Nginx, Caddy) jedoch die bessere Wahl: TLS-Terminierung, Zertifikatsmanagement und HTTP/2 sind dort einfacher zu verwalten und der Express-Prozess muss nicht als root laufen.

TLS bringt 4 von 166 Punkten im Wolf-Agents Web Security Check. Diese Anleitung zeigt beide Wege: direktes HTTPS in Express mit minVersion TLSv1.2 und sicheren Cipher Suites, sowie die empfohlene Reverse-Proxy-Konfiguration mit Nginx. Das Ergebnis: TLS 1.3 aktiv, TLS 1.0/1.1 deaktiviert, Forward Secrecy sichergestellt.

1 Schritt 1 von 4

HTTPS-Server mit https.createServer erstellen

Node.js' https-Modul umhüllt die Express-App mit TLS-Unterstützung. Zertifikat und Schlüssel werden mit fs.readFileSync geladen. Ein separater HTTP-Server auf Port 80 leitet alle Anfragen auf HTTPS um.

server.js https.createServer
// server.js — Express mit HTTPS
const express = require('express');
const https   = require('https');
const http    = require('http');
const fs      = require('fs');

const app = express();

// Zertifikat und Schlüssel laden
const tlsOptions = {
  cert: fs.readFileSync('/etc/letsencrypt/live/ihre-domain.de/fullchain.pem'),
  key:  fs.readFileSync('/etc/letsencrypt/live/ihre-domain.de/privkey.pem'),
};

// HTTPS-Server starten
https.createServer(tlsOptions, app).listen(443, () => {
  console.log('HTTPS-Server läuft auf Port 443');
});

// HTTP auf HTTPS umleiten
http.createServer((req, res) => {
  res.writeHead(301, { Location: `https://${req.headers.host}${req.url}` });
  res.end();
}).listen(80);
Port 443 und root-Privilegien

Ports unter 1024 erfordern unter Linux root-Rechte. Alternativen: setcap cap_net_bind_service=+ep $(which node) oder Nginx als Reverse Proxy auf Port 443, Express intern auf Port 3000.

2 Schritt 2 von 4

TLS-Optionen konfigurieren

Das tls-Optionsobjekt von Node.js erlaubt vollständige Kontrolle über TLS-Version und Cipher Suites. minVersion: 'TLSv1.2' deaktiviert TLS 1.0 und 1.1. honorCipherOrder: true erzwingt die Server-Präferenz für TLS 1.2 Cipher Suites.

server.js TLS-Optionen
// TLS-Optionen für maximale Sicherheit
const tlsOptions = {
  cert: fs.readFileSync('/etc/letsencrypt/live/ihre-domain.de/fullchain.pem'),
  key:  fs.readFileSync('/etc/letsencrypt/live/ihre-domain.de/privkey.pem'),

  // TLS 1.2 als Minimum (TLS 1.0/1.1 deaktiviert)
  minVersion: 'TLSv1.2',

  // Cipher Suites: ECDHE für Forward Secrecy, GCM/ChaCha für AEAD
  ciphers: [
    'ECDHE-ECDSA-AES256-GCM-SHA384',
    'ECDHE-RSA-AES256-GCM-SHA384',
    'ECDHE-ECDSA-CHACHA20-POLY1305',
    'ECDHE-RSA-CHACHA20-POLY1305',
    'ECDHE-ECDSA-AES128-GCM-SHA256',
    'ECDHE-RSA-AES128-GCM-SHA256',
  ].join(':'),

  // Server-Cipher-Präferenz für TLS 1.2 erzwingen
  honorCipherOrder: true,

  // ECDH-Kurven (X25519 für beste Performance)
  ecdhCurve: 'X25519:P-256:P-384',
};
TLS 1.3 in Node.js: TLS 1.3 ist ab Node.js 12 mit OpenSSL 1.1.1+ standardmäßig unterstützt und aktiv — kein explizites Setzen nötig. Prüfen Sie Ihre Version mit node --version und openssl version.
3 Schritt 3 von 4

Reverse Proxy — empfohlen für Produktion

Nginx als Reverse Proxy übernimmt TLS-Terminierung, Zertifikatsmanagement und HTTP/2-Upgrade. Express läuft intern auf Port 3000 ohne TLS — einfacher, sicherer und performanter. Mit app.set('trust proxy', 1) werden X-Forwarded-* Header korrekt ausgewertet.

/etc/nginx/conf.d/express-app.conf Reverse Proxy
# Empfehlung: Nginx als Reverse Proxy vor Express
# /etc/nginx/conf.d/express-app.conf

server {
    listen 443 ssl http2;
    server_name ihre-domain.de;

    ssl_certificate     /etc/letsencrypt/live/ihre-domain.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ihre-domain.de/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;

    # Express intern auf Port 3000 (kein TLS nötig)
    location / {
        proxy_pass       http://127.0.0.1:3000;
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    }
}

# Express: trust proxy aktivieren (für req.secure, req.ip)
# app.set('trust proxy', 1);
trust proxy und Sicherheit: app.set('trust proxy', 1) vertraut dem ersten Proxy in der Kette. Setzen Sie diesen Wert nur, wenn Sie einen kontrollierten Reverse Proxy betreiben — bei öffentlichem Internet würde ein Angreifer beliebige X-Forwarded-For-Header einschleusen können.
4 Schritt 4 von 4

Konfiguration verifizieren

Nach dem Start prüfen Sie mit openssl s_client, ob TLS 1.3 aktiv ist und TLS 1.0/1.1 abgelehnt wird. Testen Sie zusätzlich den HTTP-zu-HTTPS-Redirect und prüfen Sie die Node.js TLS-Version.

Terminal Verifizierung
# 1. TLS 1.3 prüfen
openssl s_client -connect ihre-domain.de:443 -tls1_3 2>&1 | grep -E "Protocol|Cipher"

# Erwartete Ausgabe:
#   Protocol  : TLSv1.3
#   Cipher    : TLS_AES_256_GCM_SHA384

# 2. TLS 1.0/1.1 muss abgelehnt werden
openssl s_client -connect ihre-domain.de:443 -tls1 2>&1 | grep "alert"
# Erwartete Ausgabe: alert handshake failure

# 3. HTTP → HTTPS Redirect prüfen
curl -sI http://ihre-domain.de | grep -i location
# Location: https://ihre-domain.de/

# 4. Node.js TLS-Version prüfen
node -e "const tls = require('tls'); console.log(tls.DEFAULT_MAX_VERSION);"
# TLSv1.3
Wolf-Agents Web Security Check

Der Scanner prüft TLS-Version, Cipher Suites und Zertifikatskette als Teil der 166 Prüfpunkte — mit konkreten Empfehlungen und Scoring nach Note A+ bis F.

Wie steht Ihre Domain bei TLS-Konfiguration?

Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.

Häufig gestellte Fragen

Soll ich TLS direkt in Express.js oder über einen Reverse Proxy einrichten?

Für Produktivumgebungen empfehlen wir einen Reverse Proxy (Nginx, Caddy, Traefik). Vorteile: TLS-Terminierung ist von der Anwendungslogik getrennt, der Proxy übernimmt Zertifikatsmanagement, HTTP/2 ist einfacher zu aktivieren, und der Express-Prozess muss nicht als root laufen (Port 443 erfordert Privilegien). Direktes TLS in Express eignet sich für interne Services oder Entwicklungsumgebungen.

Welches Node.js-Modul brauche ich für HTTPS in Express?

Das eingebaute https-Modul aus der Node.js Standard Library. Kein npm-Paket nötig: const https = require('https'). Kombiniert mit dem tls-Modul für erweiterte Konfiguration. Express selbst bleibt unverändert — https.createServer(options, app) umhüllt die Express-App.

Wie aktiviere ich TLS 1.3 in Node.js?

TLS 1.3 ist in Node.js 12+ mit OpenSSL 1.1.1+ standardmäßig unterstützt. Setzen Sie maxVersion: 'TLSv1.3' oder lassen Sie es weg (dann werden alle unterstützten Versionen ≥ minVersion akzeptiert). Mit minVersion: 'TLSv1.2' und ohne maxVersion nutzen moderne Clients automatisch TLS 1.3.

Was bedeutet honorCipherOrder in Node.js?

honorCipherOrder: true erzwingt die Cipher-Suite-Präferenz des Servers statt der des Clients. Sinnvoll für TLS 1.2, um schwächere Client-Präferenzen zu überstimmen. Bei TLS 1.3 hat diese Option keine Wirkung — alle 5 TLS-1.3-Cipher-Suites sind sicher.

Wie lade ich Let's Encrypt Zertifikate in Express.js?

Lesen Sie die Zertifikatsdateien mit fs.readFileSync: cert: fs.readFileSync('/etc/letsencrypt/live/ihre-domain.de/fullchain.pem') und key: fs.readFileSync('/etc/letsencrypt/live/ihre-domain.de/privkey.pem'). Für automatische Erneuerung ohne Prozess-Neustart können Sie tls.createSecureContext() bei jedem Request neu erstellen (mit Caching).

Wie kann Express auf Port 443 hören ohne root?

Option 1: setcap cap_net_bind_service=+ep $(which node) — gibt Node.js das Recht, privilegierte Ports zu öffnen. Option 2: Nginx als Reverse Proxy auf Port 443, Express intern auf Port 3000. Option 3: Port 8443 + DNS/Firewall-Weiterleitung. Empfehlung: Reverse Proxy ist die produktionssicherste Lösung.

Wie teste ich TLS in meiner Express-Anwendung lokal?

Für lokale Entwicklung nutzen Sie mkcert (mkcert -install && mkcert localhost) für lokal vertrauenswürdige Zertifikate. Für Produktionstests: openssl s_client -connect ihre-domain.de:443 -tls1_3 oder der Wolf-Agents Web Security Check — beide prüfen TLS-Version, Cipher Suites und Zertifikatskette.