Fehler bei der Lizenzaktivierung auf Self-Hosted n8n

Problem/Fehler/Frage beschreiben

Ich habe Probleme beim Aktivieren meiner Registered Community-Lizenz auf einer selbstgehosteten Instanz. Bei dem Versuch, die Aktivierung über die Web-UI oder mit einer Umgebungsvariable durchzuführen, schlägt die Aktivierung mit einem Validierungsfehler bezüglich des Geräte-Fingerprints fehl.

Das CLI-Tool im Container zeigt jedoch, dass ein gültiger Fingerprint generiert wird. Es gibt einen Unterschied: Der Hintergrund-Webprozess/die SDK scheint einen leeren oder abgeschnittenen Fingerprint-String an eure Lizenzierungsserver zu übergeben.

Wenn ich zum ersten Mal auf das Terminal des Containers zugreife und manuell n8n license:info ausführe, wird ein vollständiger, gültiger 64-Zeichen-Fingerprint erfolgreich generiert und ist sichtbar:

\~ $ n8n license:info
Puppeteer node: Container detected via .dockerenv file
\[license SDK\] Skipping renewal on init: license cert is not initialized
## CONSUMER CONFIG ##
tenantId: 1
productIdentifier: n8n-2.26.7
deviceFingerprint: a11f905a58a7525ef325c7a4a4fc27d1bde9a2ef695a19d4264672a3bbc62997
autoRenewalEnabled: true
autoRenewalOffset: 259200 (= 72h 0m 0s)
--
## LICENSE CERT ##
version: <n/a>
tenantId: <n/a> (!)
consumerId: <n/a>
deviceFingerprint: <n/a> (!)
createdAt: <n/a>
issuedAt: <n/a>
expiresAt: <n/a>
terminatesAt: <n/a>
isEphemeral: <n/a>
isValid: false (!)
isRenewalDue: false
detachedEntitlementsCount: <n/a>
entitlements: 0

Verlauf

  1. Ich konnte Debug in Editor nicht zum Laufen bringen – es sagte, ich müsse registriert sein. Das sollte ich eigentlich bereits sein. In der Vergangenheit war das der Fall – ich habe keine Ahnung, warum sich das geändert hat.

  2. Ich sah dies in meinen Logs:
    [license SDK] cert is invalid because it has expired: (autorenewalsEnabled: true, expiredAt: Sat May 09 2026 15:29:44 GMT-0400 (Eastern Daylight Time), issuedAt: Wed Apr 29 2026 15:29:44 GMT-0400 (Eastern Daylight Time))

  3. Ich habe TZ=America/New_York und einen 32-Bit N8N_ENCRYPTION_KEY, der sich nicht geändert hat. Der Verschlüsselungsschlüssel befindet sich sowohl in der Umgebung als auch in der .n8n/config-Datei.

  4. Ich führte dies aus und sah:

\~ $ n8n license:info
Puppeteer node: Container detected via .dockerenv file
[license SDK] attempting license renewal
[license SDK] license successfully renewed
## CONSUMER CONFIG ##
tenantId: 1
productIdentifier: n8n-2.26.7
deviceFingerprint: a11f905a58a7525ef325c7a4a4fc27d1bde9a2ef695a19d4264672a3bbc62997
autoRenewalEnabled: true
autoRenewalOffset: 259200 (= 72h 0m 0s)
--
## LICENSE CERT ##
version: 2
tenantId: 1
consumerId: 84ac80cc-574f-4841-b0f3-2df3c875080f
deviceFingerprint: a11f905a58a7525ef325c7a4a4fc27d1bde9a2ef695a19d4264672a3bbc62997
createdAt: Fri May 09 2025 18:15:12 GMT-0400 (Eastern Daylight Time)
issuedAt: Thu Jun 18 2026 15:51:04 GMT-0400 (Eastern Daylight Time)
expiresAt: Sun Jun 28 2026 15:51:04 GMT-0400 (Eastern Daylight Time)
terminatesAt: Tue May 03 2050 18:15:12 GMT-0400 (Eastern Daylight Time)
isEphemeral: false
isValid: true
isRenewalDue: false
detachedEntitlementsCount: 0
entitlements: 1
--

## ENTITLEMENT 1 ##
id: 7a862864-5aab-4dac-a6fe-e1ea891a6459
productId: 031ebde1-0ebe-47b8-802a-29c084a2a4c3
validFrom: Fri May 09 2025 18:15:12 GMT-0400 (Eastern Daylight Time)
validTo: Sat May 05 2040 18:15:12 GMT-0400 (Eastern Daylight Time)
features: {„planName":„Registered Community",„feat:folders":true,„feat:debugInEditor":true,„feat:workflowHistory":true,„feat:insights:viewSummary":true,„feat:workflowHistoryPrune":true,„quota:workflowHistoryPrune":24,„feat:advancedExecutionFilters":true,„quota:evaluations:maxWorkflows":1,„quota:insights:retention:maxAgeDays":180,„quota:insights:retention:pruneIntervalDays":24}
featureOverrides: {}
  1. Wenn ich versuche, auf den Button in der Aktivierungs-E-Mail zu klicken oder ihn einzufügen, bekomme ich dasselbe:
UI:
Aktivierungsschlüssel hat das falsche Format

Log:
[license SDK] license activation failed: request/body/deviceFingerprint must NOT have fewer than 32 characters
  1. Ich führte n8n license:clear aus und startete dann neu. Jetzt erhalte ich dies im Log:
    [license SDK] Skipping renewal on init: license cert is not initialized

und das ist das, was ich in der Shell erhalte:

\~ $ n8n license:info
Puppeteer node: Container detected via .dockerenv file
\[license SDK\] Skipping renewal on init: license cert is not initialized
## CONSUMER CONFIG ##
tenantId: 1
productIdentifier: n8n-2.26.7
deviceFingerprint: a11f905a58a7525ef325c7a4a4fc27d1bde9a2ef695a19d4264672a3bbc62997
autoRenewalEnabled: true
autoRenewalOffset: 259200 (= 72h 0m 0s)
--
## LICENSE CERT ##
version: <n/a>
tenantId: <n/a> (!)
consumerId: <n/a>
deviceFingerprint: <n/a> (!)
createdAt: <n/a>
issuedAt: <n/a>
expiresAt: <n/a>
terminatesAt: <n/a>
isEphemeral: <n/a>
isValid: false (!)
isRenewalDue: false
detachedEntitlementsCount: <n/a>
entitlements: 0
  1. Ich habe versucht, statt der Cloudflare-URL die LAN-IP zu verwenden – http://192.168.200.12:5678/settings/usage?key=03329154-96a6-4bac-89f0-xxxxxxxxxxxx . Gibt mir dieselben Fehler.

  2. Dies funktionierte früher auf diesem Docker-Image einwandfrei (frühere Builds vor Monaten).

  3. Ich habe auch versucht, den Schlüssel direkt an den Container über N8N_LICENSE_ACTIVATION_KEY zu übergeben, was zum selben Log-Fehler führte.

Ich habe 3 verschiedene KIs zur Behebung dieses Problems genutzt, und wir haben alle Ideen aufgebraucht :slight_smile:

Was kann ich tun?

Welche Fehlermeldung wird angezeigt (falls vorhanden)?

Bei dem Versuch, die Aktivierung über die UI oder mit N8N_LICENSE_ACTIVATION_KEY durchzuführen, zeigen die Container-Logs:
[license SDK] Skipping renewal on init: license cert is not initialized
[license SDK] license activation failed: request/body/deviceFingerprint must NOT have fewer than 32 characters
Could not activate license

Informationen zu eurem n8n-Setup

  • n8n-Version: 2.26.7 (tritt auch bei früheren Versionen auf)
  • Datenbank (Standard: SQLite): Postgres
  • n8n EXECUTIONS_PROCESS-Einstellung (Standard: own, main):
  • n8n wird ausgeführt über (Docker, npm, n8n cloud, Desktop-App): Synology Docker
  • Betriebssystem: Synology

@jmaver Dein CLI-Lauf hat es bereits erneuert, der zweite license:info zeigt jetzt isValid true (expires Jun 28). Der Lizenzzustand wird in der DB gespeichert, also ist das Zertifikat dort behoben, aber dein laufender Prozess hält immer noch das abgelaufene Zertifikat, das er beim Start gecacht hat. Starten Sie den n8n-Container neu, er lädt das gültige Zertifikat aus der DB neu und Registered + Debug im Editor funktionieren wieder. Es ist abgelaufen, weil die Community-Lizenz ungefähr alle 10 Tage license.n8n.io/v1 erreichen muss, um sich zu erneuern, also stelle sicher, dass der ausgehende Traffic nicht von einem Proxy oder einer Firewall blockiert wird.

Leider ist das nicht der Fall.

Ich habe viele Male neu gestartet. Bei jedem Hochfahren mit der Aktivierungs-Umgebungsvariable tritt derselbe Fehler auf, das manuelle Hinzufügen des Aktivierungscodes schlägt immer noch fehl, und ich kann immer noch nicht im Editor debuggen.

@jmaver ja, das ist der Device-Fingerprint-Mismatch. Dein Zertifikat ist an einen Fingerprint gebunden, aber die Instanz präsentiert bei jedem Boot einen anderen, weshalb es ihn immer ablehnt, egal wie oft du neu startest. Deshalb bleibt auch license.cert nicht erhalten. Entferne zuerst die N8N_LICENSE_ACTIVATION_KEY Umgebungsvariable. Wenn du sie drin lässt, wird bei jedem Boot die Aktivierung neu ausgeführt und der Mismatch erneut ausgelöst, anstatt einfach zu laden, was in der Datenbank gespeichert ist. Da die Bindung selbst kaputt ist, besteht die echte Lösung darin, help@n8n.io zu schreiben, um den Schlüssel zurückzusetzen. Der Community-Schlüssel wird gegen den alten Fingerprint verbraucht und nur sie können ihn freigeben, damit er sich an deine aktuelle Instanz rebindet.

Hallo @jmaver

Wenn du n8n license:info in der Shell ausführst, läufst du wahrscheinlich als Benutzer (oft root oder der Standard-Node-Benutzer), der vollen Zugriff auf die Systemidentifizierer hat, die zur Generierung des Fingerabdrucks verwendet werden. Der Hauptprozess von n8n – der die Web-Benutzeroberfläche und den N8N_LICENSE_ACTIVATION_KEY verwaltet – kann denselben Fingerabdruck jedoch nicht auflösen, sendet eine leere oder null-wertige Zeichenkette an den Lizenzierungsserver, was dann die Validierungsfehlermeldung „weniger als 32 Zeichen

nein, das scheint keinen Unterschied gemacht zu haben. Ich sehe es in /etc im Container, aber nichts darüber in den Logs und der gleiche Aktivierungsfehler

Führen Sie den folgenden Befehl in der Container-Shell aus

ls -l /etc/machine-id /var/lib/dbus/machine-id

was zeigt es an?

/etc $ ls -al /etc/machine-id
-rwxr-xr-x 1 1024 100 32 Jun 22 11:57 /etc/machine-id
/etc $ ls -l /etc/machine-id /var/lib/dbus/machine-id
ls: /var/lib/dbus/machine-id: Datei oder Verzeichnis nicht gefunden

Überprüfen Sie Ihren N8N_ENCRYPTION_KEY. Ist er genau 32 Zeichen lang?

Führen Sie diesen Befehl in Ihrem Container-Terminal aus

ps aux | grep n8n

Was wird angezeigt?

/etc $ echo “${#N8N_ENCRYPTION_KEY}”
32

/etc $ ps aux | grep n8n
6 node 0:40 {MainThread} node /usr/local/bin/n8n start

Das Wichtigste hier ist, dass n8ns Fingerprint-Generierung sowohl /etc/machine-id ALS AUCH /var/lib/dbus/machine-id prüft - da der zweite Pfad in deinem Container fehlt, kann die ID möglicherweise immer noch nicht korrekt aufgelöst werden, auch wenn der erste gemappt ist.

Füge einen zweiten Volume-Mount zu deiner docker-compose hinzu:

- /var/lib/dbus/machine-id:/var/lib/dbus/machine-id:ro

Wenn du diese Datei auf dem Host nicht hast, erstelle sie zunächst: cat /etc/machine-id | sudo tee /var/lib/dbus/machine-id. Starten Sie dann den Container neu und versuchen Sie die Lizenzaktivierung erneut.

@jmaver der machine-id-Pfad ist eine Sackgasse, deine CLI erstellt bereits einen vollständigen 64-Zeichen-Fingerprint aus /etc/machine-id, also funktioniert die Auflösung einwandfrei, das ist es nicht. Der leere Fingerprint erscheint nur in der Aktivierungsanfrage, das ist der echte Bug – activate sendet den Fingerprint nicht, den deine Instanz eindeutig berechnet. Und dein früheres license:info hat ein gültiges Zertifikat erneuert (isValid: true), also funktioniert die Erneuerung und nur die Aktivierung ist kaputt, was bedeutet, dass license:clear der falsche Schritt war – es hat das gute Zertifikat gelöscht und dich auf den kaputten Aktivierungspfad gestoßen. Ein erneutes Versuchen der Aktivierung oder der env-Schlüssel hilft jetzt nicht mehr. Die einfachste Wiederherstellung ist das Wiederherstellen der license.cert-Zeile in der settings-Tabelle aus einem DB-Snapshot, der vor dem Clear erstellt wurde. Kein Snapshot vorhanden, dann ist dies ein sauberer reproduzierbarer Aktivierungsbug – schreib diese license:info-Ausgabe an help@n8n.io, damit sie es gegen deinen Fingerprint neu initialisieren.

~ $ ls -l /etc/machine-id /var/lib/dbus/machine-id
-rwxr-xr-x 1 1024 100 32 Jun 22 11:57 /etc/machine-id
-rwxr-xr-x 1 1024 100 32 Jun 22 11:57 /var/lib/dbus/machine-id

gleiche Ergebnisse. Hier ist die Debug-Version des Protokolls, aber es scheint nichts hinzuzufügen:


- 2026-06-22T19:29:18.132Z | debug | [license SDK] initializing for deviceFingerprint n8n-j {"scopes":["license"],"file":"LicenseManager.js","function":"log"}

- 2026-06-22T19:29:18.137Z | info | [license SDK] Skipping renewal on init: license cert is not initialized {"scopes":["license"],"file":"LicenseManager.js","function":"log"}

- 2026-06-22T19:29:18.138Z | debug | License initialized {"scopes":["license"],"file":"license.js","function":"init"}

- 2026-06-22T19:29:18.141Z | debug | Attempting license activation {"file":"base-command.js","function":"initLicense"}

- 2026-06-22T19:29:18.335Z | warn | [license SDK] license activation failed: request/body/deviceFingerprint must NOT have fewer than 32 characters {"scopes":["license"],"file":"LicenseManager.js","function":"log"}

- 2026-06-22T19:29:18.574Z | error | Could not activate license {"error":{"name":"Error","message":"license activation failed: request/body/deviceFingerprint must NOT have fewer than 32 characters","stack":"Error: license activation failed: request/body/deviceFingerprint must NOT have fewer than 32 characters\n at v.activate (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/@n8n_io+license-sdk@2.25.0/node_modules/@n8n_io/license-sdk/src/LicenseManager.ts:461:17)\n at processTicksAndRejections (node:internal/process/task/queues:104:5)\n at License.activate (/usr/local/lib/node_modules/n8n/src/license.ts:208:3)\n at Start.initLicense (/usr/local/lib/node_modules/n8n/src/commands/base-command.ts:318:5)\n at Start.init (/usr/local/lib/node_modules/n8n/src/commands/start.ts:239:3)\n at CommandRegistry.execute (/usr/local/lib/node_modules/n8n/src/command-registry.ts:82:4)\n at /usr/local/lib/node_modules/n8n/bin/n8n:63:2"},"file":"base-command.js","function":"initLicense"}

@jmaver richtig, beide Dateien sind jetzt da und es schlägt immer noch fehl, also machine-id ist vollständig ausgeschlossen. aber schau dir diese Debug-Zeile an, der Server initialisiert mit deviceFingerprint „n8n-j…

Führen Sie dies in Ihrem Terminal aus

su - node -c "n8n license:info"

Was wird angezeigt?

sudo docker exec -it n8n n8n license:info

## CONSUMER CONFIG ##
tenantId: 1
productIdentifier: n8n-2.26.7
deviceFingerprint: a11f905a58a7525ef325c7a4a4fc27d1bde9a2ef695a19d4264672a3bbc62997
autoRenewalEnabled: true
autoRenewalOffset: 259200 (= 72h 0m 0s)
--
## LICENSE CERT ##
version: <n/a>
tenantId: <n/a> (!)
consumerId: <n/a>
deviceFingerprint: <n/a> (!)
createdAt: <n/a>
issuedAt: <n/a>
expiresAt: <n/a>
terminatesAt: <n/a>
isEphemeral: <n/a>
isValid: false (!)
isRenewalDue: false
detachedEntitlementsCount: <n/a>
entitlements: 0

Hier ist meine Compose-Datei:

name: n8n
services:
n8n:
image: n8n-with-puppeteer:${N8N_VERSION}
build:
context: git@gitea:jmaver/docker-stacks.git#main
dockerfile: stacks/n8n/setup/n8n-with-puppeteer-dockerfile
args:
N8N_VERSION: "${N8N_VERSION}"

container_name: n8n

volumes:
- /volume1/docker/n8n/data:/home/node/.n8n
- /volume1/docker/n8n/machine-id:/etc/machine-id
- /volume1/docker/n8n/machine-id:/var/lib/dbus/machine-id:ro

environment:
# Öffentliche URLs / Basiskonfiguration
DOMAIN_NAME: [xxxx.com](http://xxxx.com)
SUBDOMAIN: n8n-j
N8N_HOST: [n8n-j.xxxx.com](http://n8n-j.xxxx.com)
N8N_PORT: 5678
N8N_PROTOCOL: http
N8N_EDITOR_BASE_URL: [https://n8n-j.xxxx.com/](https://n8n-j.xxxx.com/)
WEBHOOK_URL: [https://n8n-j.xxxx.com/](https://n8n-j.xxxx.com/)
GENERIC_TIMEZONE: America/New_York
TZ: America/New_York
PGID: 100
PUID: 1030

# Kernverhalten
N8N_INSTANCE_ID: n8n-j
N8N_LOG_LEVEL: debug
N8N_PROXY_HOPS: 1
N8N_SECURE_COOKIE: false
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: true
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY:?set in env}
N8N_LICENSE_ACTIVATION_KEY: ${N8N_LICENSE_ACTIVATION_KEY:?set in env}
N8N_LICENSE_AUTO_RENEW_ENABLED: true
N8N_PAYLOAD_SIZE_MAX: 64

#fehlende Pakete beheben
N8N_REINSTALL_MISSING_PACKAGES: "true"

# Erlaube Code-Knoten, auf Umgebungsvariablen zuzugreifen (deine Präferenz)
N8N_BLOCK_ENV_ACCESS_IN_NODE: "false"

# Queue-Modus aus
EXECUTIONS_MODE: regular
N8N_CONCURRENCY_PRODUCTION_LIMIT: 5

# Externe Task Runner (Broker lebt hier)
N8N_RUNNERS_MODE: external
N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0
N8N_RUNNERS_AUTH_TOKEN: ${N8N_RUNNERS_AUTH_TOKEN:?set in env}
N8N_RUNNERS_TASK_REQUEST_TIMEOUT: 300
N8N_NATIVE_PYTHON_RUNNER: "false"
N8N_NATIVE_JAVASCRIPT_RUNNER: "false"

# Telemetrie / Diagnose
N8N_DIAGNOSTICS_ENABLED: "false"
N8N_DIAGNOSTICS_ENABLE_HEALTHCHECK: "false"
N8N_VERSION_NOTIFICATIONS_ENABLED: "false"
N8N_TEMPLATES_ENABLED: "false"
EXTERNAL_FRONTEND_HOOKS_URLS: ""
N8N_DIAGNOSTICS_CONFIG_FRONTEND: ""
N8N_DIAGNOSTICS_CONFIG_BACKEND: ""
N8N_ONBOARDING_FLOW_DISABLED: "true"

# Datenbank
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: xxxx
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: ${POSTGRES_DB:?set in env}
DB_POSTGRESDB_USER: ${POSTGRES_USER:?set in env}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD:?set in env}

# Puppeteer / Chromium
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: "true"
PUPPETEER_EXECUTABLE_PATH: /usr/bin/chromium

ports:
- '5678:5678'
networks:
- infra

command: [ "start" ]

restart: unless-stopped

healthcheck:
test: [ "CMD-SHELL", "wget -q --spider [http://127.0.0.1:5678/healthz](http://127.0.0.1:5678/healthz) || exit 1" ]
interval: 60s
timeout: 5s
retries: 5
start_period: 60s

cap_add:
- SYS_ADMIN

cpu_shares: 1800
mem_limit: 4g
shm_size: 3gb

security_opt:
- seccomp:unconfined

Korrektur zu meiner letzten Antwort – ich hatte den Mechanismus falsch verstanden, ignoriere also den Teil mit dem Hostname. Der Lizenz-Fingerprint von n8n ist die instanceId (aus dem Source, deviceFingerprint: () => instanceId), nicht der Hostname. Deine CLI zeigt eine gültige 64-Zeichen-instanceId (a11f905a…) an, aber die Aktivierungsanfrage wird abgelehnt, weil sie eine unter 32 Zeichen sendet, also nimmt der activate-Pfad keine gültige instanceId auf, obwohl eindeutig eine existiert.

Ich habe keine verifizierten Grundursachen dafür, warum sie nur im activate-Flow zu kurz ausfällt. Da dein früherer license:info bereits ein gültiges Zertifikat erneuert hat, ist der zuverlässigste Weg, diese license.cert-Zeile aus einem DB-Snapshot wiederherzustellen, der vor der Ausführung von license:clear erstellt wurde, oder n8n Support die neu seeden zu lassen, anstatt weitere machine-id- oder Hostname-Änderungen vorzunehmen.

Ok, danke – ich werde ihnen eine E-Mail schreiben

Hey @jmaver, ich hab’s in deinem Compose gefunden, du hast:

N8N_INSTANCE_ID: n8n-j

Das sind nur 5 Zeichen. Das License SDK von n8n leitet den deviceFingerprint direkt von der Instance ID ab, und der Lizenzserver erfordert mindestens 32 Zeichen. Also wird n8n-j als Fingerprint gesendet, und das ist genau der Grund, warum du den Fehler „must NOT have fewer than 32 characters