SSH-Schlüssel erstellen mit ssh-keygen: Ed25519, Passphrase und Server-Zugang
SSH-Schlüssel erstellen heißt, mit dem Programm ssh-keygen ein Schlüsselpaar zu erzeugen: eine private Datei, die das Gerät nie verlässt, und eine öffentliche mit der Endung .pub, die auf den Server kommt. Ohne weitere Angaben entsteht ein Ed25519-Schlüssel, für den ssh-keygen den Speicherort ~/.ssh/id_ed25519 vorschlägt. Danach folgen eine Passphrase, die Kopie des öffentlichen Schlüssels nach ~/.ssh/authorized_keys auf dem Server und ein Anmeldetest.
Das Bundesamt für Sicherheit in der Informationstechnik empfiehlt in der Technischen Richtlinie TR-02102-4 (Fassung 2026-01) für die Client-Authentisierung bei SSH die Public-Key-Authentisierung. Private Schlüssel sind dort vor Kopieren, missbräuchlicher Nutzung und Manipulation zu schützen. Dem dienen Passphrase und Dateirechte, die weiter unten beschrieben sind. Die Befehle gelten in Deutschland, Österreich und der Schweiz gleichermaßen.
Welcher Schlüsseltyp: Ed25519, ECDSA oder RSA
OpenSSH erzeugt seit Version 9.5 vom 4. Oktober 2023 standardmäßig Ed25519-Schlüssel. Unterstützt wird der Typ seit Version 6.5 vom Januar 2014, Server mit älterer Version kennen ihn also nicht.
| Typ | Befehl | Länge | Einordnung |
|---|---|---|---|
| Ed25519 | ssh-keygen -t ed25519 | fest, -b wird ignoriert | Voreinstellung von OpenSSH seit 9.5 |
| ECDSA | ssh-keygen -t ecdsa -b 384 | 256, 384 oder 521 Bit | in der Tabelle der TR-02102-4 aufgeführt |
| RSA | ssh-keygen -t rsa -b 4096 | mindestens 1024 Bit, Standard 3072 Bit | TR-02102-1: Modul mindestens 3000 Bit |
In der Tabelle der Signaturverfahren führt die TR-02102-4 ECDSA mit den Kurven nistp256, nistp384 und nistp521 auf. Ed25519 kommt in dieser Richtlinie und in der allgemeinen TR-02102-1 nicht vor, RSA steht nicht in der Tabelle der TR-02102-4. Für eigene Server ist die Ed25519-Voreinstellung von OpenSSH der kürzeste Weg. Wer sich strikt an die BSI-Tabelle halten muss, erzeugt ECDSA.
Schlüsselpaar erzeugen
- Im Terminal (Linux, macOS) oder in PowerShell (Windows)
ssh-keygen -t ed25519 -C "laptop-privat"ausführen. Der Kommentar nach-Cmacht den Schlüssel später zuordenbar, ohne Angabe steht dortbenutzer@rechner. - Den vorgeschlagenen Speicherort mit der Eingabetaste bestätigen. Es entstehen
~/.ssh/id_ed25519(privat) und~/.ssh/id_ed25519.pub(öffentlich). - Eine Passphrase wählen und wiederholen. Sie verschlüsselt den privaten Teil der Datei: Gelangt sie in fremde Hände, muss die Passphrase erst erraten werden.
- Den Fingerabdruck ausgeben lassen:
ssh-keygen -l -f ~/.ssh/id_ed25519.pub.
Das Handbuch von OpenSSH nennt Passphrasen mit 10 bis 30 Zeichen gut, einfache Sätze nicht. Eine vergessene Passphrase lässt sich nicht wiederherstellen: Dann muss ein neuer Schlüssel erzeugt und sein öffentlicher Teil erneut verteilt werden. Ändern lässt sie sich mit ssh-keygen -p. Die private Datei gehört nur dem Benutzer, denn ssh ignoriert eine private Schlüsseldatei, die für andere zugänglich ist. Der öffentliche Schlüssel darf dagegen weitergegeben werden.
Wer den privaten Teil nicht als Datei halten will, erzeugt mit ssh-keygen -t ed25519-sk einen Schlüssel auf einem FIDO-Sicherheitsschlüssel. Sein privater Teil lässt sich laut Handbuch nicht aus der Hardware exportieren, und sie muss bei jeder Anmeldung angeschlossen sein.
Passphrase nur einmal eingeben: ssh-agent
Ohne ssh-agent kann die Passphrase bei jeder neuen Verbindung erneut abgefragt werden. Der Agent hält die privaten Schlüssel bereit und stellt sie ssh für die Anmeldung zur Verfügung:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l
Der erste Befehl startet den Agenten und setzt seine Umgebungsvariablen in der aktuellen Shell, der zweite fragt einmal nach der Passphrase, der dritte listet die Fingerabdrücke der geladenen Schlüssel. Mit ssh-add -t 3600 verfällt ein Schlüssel nach einer Stunde, ssh-add -D entfernt alle. Die Zeile AddKeysToAgent yes in ~/.ssh/config lädt Schlüssel beim ersten Gebrauch selbst in einen laufenden Agenten, der Standard ist no. Bei mehreren Schlüsseln ordnet ein Eintrag in ~/.ssh/config jedem Server seinen Schlüssel zu:
Host server
Hostname server.example.org
User benutzer
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
Mit IdentitiesOnly yes probiert ssh nur diese Datei, auch wenn der Agent mehr Schlüssel anbietet. Danach genügt ssh server.
Öffentlichen Schlüssel auf den Server kopieren
ssh-copy-id -i ~/.ssh/id_ed25519.pub benutzer@server.example.org
Das Skript meldet sich per ssh am Server an, in der Regel mit dem Passwort, die Passwort-Anmeldung muss dafür also noch aktiv sein. Es hängt den Schlüssel an ~/.ssh/authorized_keys des Benutzers an und legt Datei und Verzeichnis bei Bedarf an. Ohne das Skript genügt es, den Inhalt der .pub-Datei als neue Zeile in diese Datei zu schreiben, denn jede Zeile enthält genau einen Schlüssel. Meldet sich ssh benutzer@server.example.org danach ohne Passwort des Servers an, hat es funktioniert. Schlägt die Anmeldung fehl, gibt ssh -v benutzer@server.example.org Debug-Meldungen zu Verbindung und Authentifizierung aus.
| Pfad | Empfehlung im OpenSSH-Handbuch | Befehl |
|---|---|---|
~/.ssh | lesen, schreiben und ausführen nur für den Benutzer | chmod 700 ~/.ssh |
~/.ssh/authorized_keys | lesen und schreiben nur für den Benutzer | chmod 600 ~/.ssh/authorized_keys |
~/.ssh/id_ed25519 (privat) | für andere nicht zugänglich | chmod 600 ~/.ssh/id_ed25519 |
Sind die Datei, das Verzeichnis ~/.ssh oder das Home-Verzeichnis für andere beschreibbar, nimmt sshd den Schlüssel nicht an, solange StrictModes auf dem Standardwert yes steht. Pro Gerät sollte ein eigenes Schlüsselpaar existieren: Geht ein Laptop verloren, wird nur seine Zeile aus authorized_keys gelöscht, die anderen Geräte behalten den Zugang.
PasswordAuthentication no in /etc/ssh/sshd_config, der Standardwert ist yes. sudo sshd -t prüft die Datei, sudo sshd -T zeigt die wirksame Konfiguration. Je Schlüsselwort gilt der zuerst gefundene Wert: Steht ein Include davor, kann eine eingebundene Datei die eigene Zeile wirkungslos machen.Windows und macOS
Unter Windows läuft ssh-keygen mit denselben Parametern in PowerShell oder in der Eingabeaufforderung, ohne Typangabe entsteht auch dort ein Ed25519-Schlüssel. Fehlt der OpenSSH-Client, lässt er sich laut Microsoft über die optionalen Features hinzufügen. Der Dienst ssh-agent ist standardmäßig deaktiviert. In einer PowerShell mit erhöhten Rechten richten ihn diese Befehle ein:
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519
Unter macOS speichert ssh-add --apple-use-keychain ~/.ssh/id_ed25519 die Passphrase in der Keychain. Die Option gibt es ab macOS 12 Monterey, davor hieß sie -K. In ~/.ssh/config gehören dazu die Zeilen AddKeysToAgent yes und UseKeychain yes.
Häufige Fragen
Welchen Schlüsseltyp sollte man für SSH wählen?
OpenSSH erzeugt seit Version 9.5 standardmäßig Ed25519. Das BSI führt in TR-02102-4 für Signaturen ECDSA mit nistp256, nistp384 und nistp521 auf. Bei RSA nennt TR-02102-1 mindestens 3000 Bit.
Wo liegen die Schlüsseldateien nach ssh-keygen?
Standardmäßig in ~/.ssh: id_ed25519 ist der private, id_ed25519.pub der öffentliche Schlüssel. Nur die .pub-Datei darf weitergegeben und in ~/.ssh/authorized_keys eingetragen werden.
Wie kopiert man den öffentlichen Schlüssel auf den Server?
Mit ssh-copy-id -i ~/.ssh/id_ed25519.pub benutzer@server. Das Skript hängt den Schlüssel an ~/.ssh/authorized_keys an und legt Datei und Verzeichnis bei Bedarf an. Dafür muss noch eine Anmeldung möglich sein.
Welche Dateirechte brauchen ~/.ssh und der private Schlüssel?
Das OpenSSH-Handbuch empfiehlt für ~/.ssh Zugriff nur für den Benutzer (700), für authorized_keys Lesen und Schreiben nur für ihn (600). ssh ignoriert private Schlüssel, die für andere zugänglich sind.
Was tun bei vergessener Passphrase?
Sie lässt sich nicht wiederherstellen. Es muss ein neues Schlüsselpaar erzeugt und der neue öffentliche Schlüssel auf allen Servern eingetragen werden. Geändert wird eine bekannte Passphrase mit ssh-keygen -p.