security.txt für Nuxt 3 einrichten

Schritt-für-Schritt-Anleitung: Kontaktdatei für Sicherheitsforscher in Nuxt 3 anlegen — Nitro serviert die Datei automatisch aus public/.

Nuxt 3 · Schritt für Schritt

security.txt in Nuxt 3

security.txt (RFC 9116) ist eine standardisierte Kontaktdatei, die Sicherheitsforschern den Meldeweg für entdeckte Schwachstellen aufzeigt. Sie definiert, an wen und wie Sicherheitsprobleme gemeldet werden sollen. Mit 2 von 166 Punkten ist security.txt ein Faktor im Wolf-Agents Web Security Check und ein klares Signal für professionelles Security-Management.

In Nuxt 3 legen Sie die Datei unter public/.well-known/security.txt ab. Nitro serviert alle Dateien aus dem public/-Verzeichnis automatisch als statische Assets — kein zusätzlicher Code nötig. Alternativ können Sie eine dynamische Nitro API Route verwenden, die das Expires-Datum automatisch berechnet. Ein häufiger Irrtum: useHead() setzt nur HTML-Meta-Tags, nicht den Dateipfad der security.txt.

1 Schritt 1 von 3

security.txt erstellen

Erstellen Sie die Datei public/.well-known/security.txt in Ihrem Nuxt-Projekt. Die Felder Contact und Expires sind Pflicht nach RFC 9116. Das Verzeichnis .well-known muss manuell angelegt werden — Nuxt erstellt es nicht automatisch.

public/.well-known/security.txt Statisch
# public/.well-known/security.txt
# RFC 9116 — Pflichtfelder: Contact, Expires
Contact: mailto:security@ihre-domain.de
Expires: 2027-03-29T00:00:00.000Z
Encryption: https://ihre-domain.de/.well-known/pgp-key.txt
Preferred-Languages: de, en
Canonical: https://ihre-domain.de/.well-known/security.txt
Policy: https://ihre-domain.de/security-policy
Hiring: https://ihre-domain.de/karriere

Für Projekte mit automatischer Expires-Berechnung verwenden Sie eine dynamische Nitro Server Route. Diese hat in Nuxt 3 Vorrang über die statische Datei im public/-Verzeichnis. Wählen Sie nur eine der beiden Methoden.

server/routes/.well-known/security.txt.get.ts Dynamisch
// server/routes/.well-known/security.txt.get.ts
// Dynamische security.txt — z.B. für automatische Expires-Berechnung
export default defineEventHandler((event) => {
  const expires = new Date();
  expires.setFullYear(expires.getFullYear() + 1);

  setHeader(event, 'Content-Type', 'text/plain; charset=utf-8');
  setHeader(event, 'Cache-Control', 'public, max-age=86400');

  return [
    'Contact: mailto:security@ihre-domain.de',
    `Expires: ${expires.toISOString()}`,
    'Encryption: https://ihre-domain.de/.well-known/pgp-key.txt',
    'Preferred-Languages: de, en',
    'Canonical: https://ihre-domain.de/.well-known/security.txt',
    'Policy: https://ihre-domain.de/security-policy',
  ].join('\n');
})
nuxt.config.ts routeRules
// nuxt.config.ts — Content-Type für .txt korrekt setzen
export default defineNuxtConfig({
  routeRules: {
    '/.well-known/security.txt': {
      headers: {
        'Content-Type': 'text/plain; charset=utf-8',
        'Cache-Control': 'public, max-age=86400',
      },
    },
  },
})
SSR vs. SSG

Die statische Variante (public/) funktioniert in beiden Modi. Die dynamische Nitro-Route funktioniert nur im SSR-Modus. Bei nuxt generate (SSG) wird die Route nicht serviert — verwenden Sie dann die statische Datei.

2 Schritt 2 von 3

PGP-Signatur hinzufügen

Eine PGP-signierte security.txt beweist Authentizität. Sicherheitsforscher können verifizieren, dass die Kontaktdaten tatsächlich von Ihnen stammen und nicht manipuliert wurden. Die Signatur schützt vor Social-Engineering-Angriffen, bei denen Angreifer gefälschte Kontaktadressen einschleusen.

Terminal GPG
# security.txt mit GPG signieren (Clearsign)
gpg --clearsign public/.well-known/security.txt
mv public/.well-known/security.txt.asc public/.well-known/security.txt

# Öffentlichen Schlüssel als separate Datei bereitstellen
gpg --export --armor security@ihre-domain.de > public/.well-known/pgp-key.txt

# Signatur verifizieren
gpg --verify public/.well-known/security.txt
Signatur-Pflege automatisieren

Integrieren Sie die GPG-Signierung in Ihre CI/CD-Pipeline. Bei jedem Deployment wird die security.txt automatisch neu signiert. So bleibt die Signatur immer aktuell, wenn sich Kontaktdaten oder das Expires-Datum ändern.

3 Schritt 3 von 3

Erreichbarkeit verifizieren

Erstellen Sie einen Production-Build und prüfen Sie die Erreichbarkeit unter dem standardisierten Pfad. Der Dev-Server kann statische Dateien anders behandeln als der Produktiv-Build. Testen Sie immer mit nuxi build.

Terminal Verifizieren
# Production-Build erstellen und starten
npx nuxi build
node .output/server/index.mjs

# security.txt prüfen
curl -s https://ihre-domain.de/.well-known/security.txt

# Erwartete Ausgabe:
# Contact: mailto:security@ihre-domain.de
# Expires: 2027-03-29T00:00:00.000Z
# Encryption: https://ihre-domain.de/.well-known/pgp-key.txt
# Preferred-Languages: de, en
# Canonical: https://ihre-domain.de/.well-known/security.txt
# Policy: https://ihre-domain.de/security-policy

# Content-Type prüfen
curl -sI https://ihre-domain.de/.well-known/security.txt | grep -i content-type

# Erwartete Ausgabe:
# Content-Type: text/plain; charset=utf-8
Leeren Sie nach dem Verifizieren den Cache: npx nuxi cleanup && npx nuxi dev. Gecachte Builds können veraltete statische Assets ausliefern.

Häufige Fehler

Expires-Datum abgelaufen

Ein abgelaufenes Expires-Feld signalisiert mangelnde Wartung. RFC 9116 empfiehlt maximal ein Jahr. Setzen Sie einen Kalender-Reminder oder nutzen Sie die dynamische Variante mit automatischer Berechnung.

Falsche Verzeichnisstruktur im Nuxt-Projekt

Die Datei muss unter public/.well-known/security.txt liegen, nicht unter public/security.txt oder assets/.well-known/. Nur das public/-Verzeichnis wird von Nitro als statisches Asset serviert.

API-Route und statische Datei gleichzeitig

Wenn sowohl public/.well-known/security.txt als auch server/routes/.well-known/security.txt.get.ts existieren, hat die API-Route Vorrang. Nutzen Sie nur eine der beiden Methoden, um Verwirrung zu vermeiden.

Canonical-URL stimmt nicht überein

Das Canonical-Feld muss exakt auf die URL zeigen, unter der die security.txt erreichbar ist. Wenn Ihre Domain ohne www erreichbar ist, darf die Canonical-URL kein www enthalten. Inkonsistente URLs führen zu Validierungsfehlern.

Compliance-Relevanz

ISO 27001 (Annex A.5.5) fordert einen definierten Prozess für die Meldung und Behandlung von Sicherheitsvorfällen. security.txt dokumentiert den Meldeweg transparent. NIS2 (Artikel 21) verlangt Incident-Response-Prozesse einschließlich Meldemechanismen. BSI IT-Grundschutz (ORP.1) empfiehlt klare Kommunikationswege für Sicherheitsmeldungen. DSGVO (Artikel 33) fordert einen Prozess zur Meldung von Datenschutzverletzungen — security.txt erleichtert den Erstkontakt. Der Wolf-Agents Web Security Check bewertet die Datei mit bis zu 2 Punkten.

Wie steht Ihre Domain bei security.txt?

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