Was Sie sehen
sign_and_send_pubkey: no mutual signature supported
user@server: Permission denied (publickey,password).
Oft ist nur die zweite Zeile sichtbar. In unseren Tests erschien die erste Zeile bei einer RSA-Schlüsseldatei im älteren Format ohne .pub-Datei daneben. Mit einer .pub-Datei blieb derselbe Fehler stumm, und nur ssh -v zeigte den Grund:
debug1: send_pubkey_test: no mutual signature algorithm
Das Anlegen der .pub-Datei lässt die erste Zeile verschwinden, behebt aber die Anmeldung nicht.
Warum es passiert
Der Name ssh-rsa steht für zwei Dinge: einen Schlüsseltyp und eine Signatur mit SHA-1. Ein RSA-Schlüssel kann auch mit SHA-256 oder SHA-512 signieren, bekannt als rsa-sha2-256 und rsa-sha2-512. OpenSSH unterstützt diese seit 7.2. OpenSSH 8.8 hat aufgehört, die SHA-1-Signatur standardmäßig anzubieten, weil SHA-1 gebrochen ist.
Ein Server vor 7.2 oder ein Gerät mit einer alten SSH-Bibliothek kann also nur die Signatur akzeptieren, die Ihr Client nicht mehr erzeugt. Ein moderner Server ist nicht betroffen, und Sie müssen wegen dieses Problems keinen RSA-Schlüssel ersetzen: Derselbe Schlüssel meldete sich in unseren Tests an einem modernen Server problemlos an.
Bestätigen
ssh -v user@server true 2>&1 | grep -E 'remote software version|mutual|server-sig-algs'
Ein Treffer sieht so aus. Eine alte Serverversion und keine Zeile mit server-sig-algs:
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.13
debug1: send_pubkey_test: no mutual signature algorithm
Zur Bestätigung probieren Sie es für eine Verbindung aus:
ssh -o PubkeyAcceptedAlgorithms=+ssh-rsa user@server
Klappt die Anmeldung damit, ist das die Ursache. Clients vor OpenSSH 8.5 nennen diese Option PubkeyAcceptedKeyTypes.
Lösung 1: einen Ed25519-Schlüssel verwenden
Das ist die beste Lösung, wenn der Server es unterstützt, also ab OpenSSH 6.5. Gegen den 6.6-Server in unserem Test funktionierte es ohne Sonderoptionen und braucht kein SHA-1.
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_oldserver
ssh-copy-id -o PubkeyAcceptedAlgorithms=+ssh-rsa -i ~/.ssh/id_ed25519_oldserver.pub user@server
Siehe So erzeugen Sie einen ed25519-Schlüssel. ECDSA funktioniert ebenfalls, wo Ed25519 nicht verfügbar ist. Einen Vergleich der beiden Schlüsseltypen finden Sie unter RSA oder Ed25519.
Lösung 2: ssh-rsa für genau diesen Host erlauben
Nutzen Sie das für ein Gerät, das Sie nicht ändern können, etwa altes Netzwerkgerät. Beschränken Sie es in ~/.ssh/config auf den einen Host, statt es unter Host * einzutragen:
Host old-box
HostName 203.0.113.10
User user
IdentityFile ~/.ssh/id_rsa
IdentitiesOnly yes
PubkeyAcceptedAlgorithms +ssh-rsa
OpenSSH beschreibt das als Notlösung, bis das alte System aktualisiert werden kann. Hat das Gerät nur einen RSA-Host-Schlüssel, erhalten Sie einen anderen Fehler zum Host-Schlüsseltyp. Fügen Sie HostKeyAlgorithms +ssh-rsa demselben Block hinzu und lesen Sie no matching key exchange zu dieser Fehlerfamilie.
Lösung 3: den Server aktualisieren
Ein Server ab OpenSSH 7.2 signiert automatisch mit SHA-2, und die Meldung verschwindet. Einem so alten Server fehlen außerdem Jahre an Sicherheitskorrekturen.
Wenn es auf Red-Hat-Systemen weiterhin scheitert
Auf RHEL 9 und Verwandten schränkt die Crypto-Policy des Systems SHA-1-Signaturen standardmäßig zusätzlich zur OpenSSH-Einstellung ein:
update-crypto-policies --show
Müssen Sie den alten Server von dieser Maschine aus erreichen, erlauben Sie SHA-1-Signaturen wieder mit der Subpolicy SHA1 und starten Sie neu:
sudo update-crypto-policies --set DEFAULT:SHA1
Das betrifft die ganze Maschine und jedes Programm darauf, bevorzugen Sie also Lösung 1, wo es geht.
Der umgekehrte Fall
Ein alter Client gegen einen neuen Server scheitert andersherum: Der Client bietet ssh-rsa an und der Server lehnt es ab. Der Client sieht nur Permission denied (publickey). Aktualisieren Sie den Client oder nutzen Sie einen Ed25519-Schlüssel.
Fragen
Muss ich meinen RSA-Schlüssel ersetzen?
Nein. Derselbe RSA-Schlüssel signiert auf jedem Server mit OpenSSH 7.2 oder neuer mit rsa-sha2-256 oder rsa-sha2-512. Der Fehler kommt von alten Servern, die nur SHA-1-Signaturen annehmen.
Ist PubkeyAcceptedAlgorithms +ssh-rsa sicher?
Es erlaubt SHA-1-Signaturen nur für diesen Host. Halten Sie es als Notlösung im eigenen Host-Block dieses Hosts und wechseln Sie zu einem Ed25519-Schlüssel oder einem neueren Server.
Was ist der Unterschied zwischen ssh-rsa und rsa-sha2-256?
Beide nutzen denselben RSA-Schlüssel. ssh-rsa signiert mit SHA-1, das OpenSSH seit 8.8 standardmäßig nicht mehr anbietet, rsa-sha2-256 und rsa-sha2-512 signieren mit SHA-2.
Quellen
- OpenSSH 8.8 Release Notes
- ssh_config(5), PubkeyAcceptedAlgorithms
- Using system-wide cryptographic policies, RHEL 9