Zurück zum Blog

SSH Permission denied (publickey): der echte Fix

18. September 2026

Um 02:10 starb ein Deploy an einer Zeile, die ich tausendmal getippt habe: ssh deploy@stagingPermission denied (publickey). Der Schlüssel war in Ordnung. Das Angebot war es nicht.

TL;DR: Permission denied (publickey) heißt, jeder vom Client angebotene Schlüssel wurde vom Server abgelehnt — ein Verhandlungsurteil, kein Passwort-Tippfehler. Diagnostiziere mit ssh -vvv (welche Schlüssel angeboten wurden) und dem Serverlog journalctl -u ssh (welche abgelehnt wurden, und warum). Dann behebe eine der vier Ursachen: falscher User, Schlüssel fehlt in authorized_keys, zu offene Rechte, oder ein ssh-rsa-Schlüssel, den OpenSSH 8.8+ ablehnt. ssh-copy-id verhindert die meisten Wiederholungen.

$ ssh -T [email protected]
[email protected]: Permission denied (publickey).

Der Fehler ist ein Urteil, kein Hinweis: Alles im Angebot wurde abgelehnt.

Warum zeigt SSH „Permission denied (publickey)“?

Public-Key-Auth ist eine Angebot-und-Ablehnung-Verhandlung. Der Client bietet jeden Schlüssel an, den er finden kann — Identitäten vom Agenten, aus deiner ~/.ssh/config, Standard-Dateinamen (id_ed25519, id_rsa) und alles, was per -i übergeben wird. Der Server gleicht jedes Angebot mit den ~/.ssh/authorized_keys des Zielaccounts ab. Passt nichts, und Passwort-Auth ist deaktiviert oder aufgebraucht, druckt der Client die eine Zeile, die jeder Devops-Ingenieur auswendig kennt.

Zwei Fakten zählen beim Debuggen. Erstens: Die Meldung sagt nicht, welchen User du getroffen hast — in der Hälfte der Fälle liegt ein tadellos guter Schlüssel in den authorized_keys des falschen Accounts. Zweitens hat der Server den Grund längst gesagt: sshd loggt jede abgelehnte Offerierung. Der Stacktrace, den niemand bestellt und jeder braucht, ist -vvv.

Wie sehe ich, welchen Schlüssel SSH wirklich anbietet?

ssh -vvv deploy@staging 2>&1 | grep -iE "offering|identity|denied|authentications"
# debug1: Offering public key: /home/you/.ssh/id_ed25519 RSA-SHA256 (explicit)
# debug1: Authentications that can continue: publickey
# deploy@staging: Permission denied (publickey).

Drei Zeilen lesen: Offering public key (was der Client vorgeschlagen hat), Authentications that can continue (was der Server noch akzeptiert — fehlt password, kommt nie eine Passwortabfrage) und das Schlussurteil. Taucht dein Schlüssel nie in der Angebotsliste auf, liegt das Problem beim Client: falscher -i-Pfad, ein vergessener IdentityFile in ~/.ssh/config, oder ein Agent (ssh-add -l), der mit einer veralteten Identität zuerst antwortet.

Was sind die vier echten Ursachen?

UrsacheIndizFix
Falscher UserSchlüssel klappt für root@host, scheitert für deploy@hostSchlüssel muss in die ~/.ssh/authorized_keys dieses Users
Schlüssel nicht installiertServerlog zeigt Failed publickey für jedes Angebotssh-copy-id user@host
Rechte zu offenClient: WARNING: UNPROTECTED PRIVATE KEY FILE — Schlüssel wird übersprungen, nie angebotenchmod 700 ~/.ssh; chmod 600 ~/.ssh/*
Altes ssh-rsaServer mit OpenSSH 8.8+; alter RSA-Schlüssel wird nie akzeptiertAls ed25519 neu erzeugen, oder Schlüssel modernisieren

Die Rechte-Ursache verdient eine eigene Notiz, denn OpenSSH erzwingt das hart: Ein privater Schlüssel, den Gruppe oder Andere lesen können, wird vom Client selbst abgelehnt und fällt still aus dem Angebot. Der Fix sind zwei Befehle:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys

Die ssh-rsa-Ursache erwischt alte CI-Images und Raspberry Pis: OpenSSH 8.8 (veröffentlicht 2021-10-01, openssh.com/txt/release-8.8) hat ssh-rsa-Signaturen — die SHA-1-Variante — standardmäßig deaktiviert. Wortlaut der Release Notes: “the ssh-rsa signature scheme is … disabled by default”. Ein RSA-Schlüssel von 2018 ist nicht kaputt; sein Signaturformat wird schlicht nicht mehr gesprochen. Ein ed25519-Schlüssel (ssh-keygen -t ed25519) ist die dauerhafte Antwort, und Cloud-Konsolen geben dir eine Serielle Konsole, wenn du dich mitten im Fix aussperrst.

Startet sshd selbst nicht, während du an der Config editierst, ist das eine andere Jagd — siehe systemd service not starting.

Wie sehe ich, warum der Server den Schlüssel abgelehnt hat?

Das Serverlog ist der ehrliche Zeuge. Unter Ubuntu (systemd) protokolliert sshd das Urteil jedes Angebots:

journalctl -u ssh -n 50 --no-pager | grep -iE "publickey|denied|accepted"
# sshd[4421]: Failed publickey for deploy from 203.0.113.7 port 51422 ssh2: RSA SHA256:...
# sshd[4421]: Accepted publickey for deploy from 203.0.113.7 port 51422 ssh2: ED25519 SHA256:...

Failed publickey mit einem unerwarteten Fingerprint heißt: Der Client hat einen anderen Schlüssel angeboten als gedacht — zurück zu -vvv. Failed publickey mit deinem Fingerprint heißt: Der Schlüssel stimmt, ist aber für diesen Account nicht installiert, oder die Home-Rechte auf der Serverseite stimmen nicht (dieselbe 700/600-Regel gilt für ~/.ssh und ~/.ssh/authorized_keys des Servers).

Wie installiere ich meinen Schlüssel richtig?

ssh-copy-id deploy@staging
# Number of key(s) added: 1
ssh -o BatchMode=yes deploy@staging 'echo ok'   # nicht-interaktiver Beweis

ssh-copy-id hängt deinen öffentlichen Schlüssel mit vernünftigen Rechten an die authorized_keys des Zielaccounts an — die Option existiert, weil Hand-Pasting in authorized_keys genau oft genug an einem Zeilenumbruch oder fehlenden Verzeichnis scheitert. Der BatchMode-Check ist der wahre Test: Er deaktiviert alle Nachfragen, also bedeutet Erfolg, dass der Schlüssel allein den Login getragen hat. Läuft der Schlüssel, erben scp und rsync dieselbe Authentifizierung gratis — die Wahl zwischen beiden ist Bandbreite, nicht Berechtigung (rsync vs scp).

Die 30-Sekunden-Triage

ssh -vvv user@host 2>&1 | grep -i offering      # 1. Welche Schlüssel wurden angeboten?
journalctl -u ssh -n 50 | grep -i publickey     # 2. Warum wurden sie abgelehnt?
ls -ld ~/.ssh ~/.ssh/authorized_keys            # 3. 700 / 600?
ssh-copy-id user@host                           # 4. Installieren, dann per BatchMode prüfen

Permission denied (publickey) ist ein Verhandlungsergebnis, keine Passwortabfrage — der Server hat jeden Schlüssel im Angebot abgelehnt, und sein Log weiß längst, warum.

Vier Befehle in dieser Reihenfolge, und die Störung ist kein Mysterium mehr: Einer benennt jedes Mal den Täter. Bei mir war es eine veraltete Agent-Identität, die vor dem richtigen Schlüssel antwortete — ssh-add -d, und der Deploy wurde um 02:31 wieder grün.

FAQ

Warum zeigt SSH Permission denied (publickey)?

Das heißt, jeder vom Client angebotene Schlüssel wurde vom Server abgelehnt, und Passwort- oder Keyboard-interactive-Auth wurde nicht versucht oder ist nicht erlaubt. Es ist ein Verhandlungsurteil über deine angebotenen Schlüssel — kein Tippfehler im Passwort.

Wie behebe ich SSH permission denied (publickey) auf Ubuntu?

Prüfe die Serverseite mit journalctl -u ssh -n 50, bestätige, dass dein öffentlicher Schlüssel in ~/.ssh/authorized_keys des Zielusers liegt, und stelle sicher, dass die Rechte 700 auf ~/.ssh und 600 auf authorized_keys und dem privaten Schlüssel sind.

Warum scheitert ssh -i meinkey trotzdem?

Drei übliche Gründe: Die Rechte des privaten Schlüssels sind zu offen, OpenSSH lädt ihn gar nicht erst; der Server läuft mit OpenSSH 8.8+, das ssh-rsa (SHA-1-Signaturen) deaktiviert hat; oder der Schlüssel liegt nicht in den authorized_keys des richtigen Users.

Wie füge ich meinen öffentlichen Schlüssel einem Server hinzu?

Führe ssh-copy-id user@host aus — hängt deinen öffentlichen Schlüssel mit korrekten Rechten an ~/.ssh/authorized_keys an. Ist Passwort-Login bereits deaktiviert, mach es über eine Konsole, auf die du noch Zugriff hast.

— mrsaynothing

— mrsaynothing

Feldnotizen zu KI, Linux und Self-Hosting.

Get the next one by email

One email per post. No spam, no algorithms.

self-hosted · no third parties · one-click unsubscribe

what is this?

Gitignore funktioniert nicht? Der echte Fix

Sie mögen die Artikel? Genau so baue ich beruflich. anheuern