"sign_and_send_pubkey: no mutual signature supported": come risolvere

Il tuo client SSH e il server non hanno in comune alcun algoritmo di firma per questa chiave. Quasi sempre significa una chiave RSA e un vecchio server che conosce solo le firme SHA-1 (ssh-rsa), che i client OpenSSH rifiutano di default dalla versione 8.8. La chiave in sé va bene. Usa una chiave Ed25519 su quel server se la supporta, aggiorna il server, oppure consenti ssh-rsa per quel solo host con PubkeyAcceptedAlgorithms +ssh-rsa.

Aggiornata il . Riprodotto con OpenSSH 10.3 su macOS e OpenSSH 10.0 su Debian 13 come client contro un vero server OpenSSH 6.6 su Ubuntu 14.04, con una chiave usa e getta.

Cosa vedi

sign_and_send_pubkey: no mutual signature supported
user@server: Permission denied (publickey,password).

Spesso l'output visibile è solo la seconda riga. Nei nostri test la prima riga è comparsa per un file di chiave RSA in formato più vecchio senza un file .pub accanto. Con un file .pub, lo stesso errore era silenzioso, e solo ssh -v mostrava il motivo:

debug1: send_pubkey_test: no mutual signature algorithm

Creare il file .pub elimina la prima riga ma non risolve il login.

Perché succede

Il nome ssh-rsa indica due cose: un tipo di chiave e una firma che usa SHA-1. Una chiave RSA può anche firmare con SHA-256 o SHA-512, note come rsa-sha2-256 e rsa-sha2-512. OpenSSH le supporta dalla 7.2. OpenSSH 8.8 ha smesso di offrire di default la firma SHA-1, perché SHA-1 è rotto.

Quindi un server precedente alla 7.2, o un apparato con una vecchia libreria SSH, può accettare solo la firma che il tuo client non produce più. Un server moderno non è coinvolto, e non devi sostituire una chiave RSA per questo motivo: nei nostri test la stessa chiave faceva il login senza problemi su un server moderno.

Confermalo

ssh -v user@server true 2>&1 | grep -E 'remote software version|mutual|server-sig-algs'

Un caso corrispondente appare così. Una vecchia versione del server e nessuna riga 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

Per conferma, provalo per una connessione:

ssh -o PubkeyAcceptedAlgorithms=+ssh-rsa user@server

Se così fa il login, è questa la causa. I client precedenti a OpenSSH 8.5 chiamano questa opzione PubkeyAcceptedKeyTypes.

Soluzione 1: usa una chiave Ed25519

È la soluzione migliore se il server la supporta, cioè OpenSSH 6.5 o successivo. Contro il server 6.6 del nostro test ha funzionato senza opzioni particolari e non richiede 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

Vedi come generare una chiave ed25519. Anche ECDSA funziona dove Ed25519 non è disponibile. Per confrontare i due tipi di chiave, vedi RSA o Ed25519.

Soluzione 2: consenti ssh-rsa per quel solo host

Usala per un dispositivo che non puoi modificare, come una vecchia apparecchiatura di rete. Limitala al solo host in ~/.ssh/config invece di aggiungerla sotto Host *:

Host old-box
  HostName 203.0.113.10
  User user
  IdentityFile ~/.ssh/id_rsa
  IdentitiesOnly yes
  PubkeyAcceptedAlgorithms +ssh-rsa

OpenSSH la descrive come un ripiego fino a quando il vecchio sistema potrà essere aggiornato. Se il dispositivo ha solo una chiave host RSA, ottieni un errore diverso sul tipo di chiave host. Aggiungi HostKeyAlgorithms +ssh-rsa allo stesso blocco, e per quella famiglia di errori vedi no matching key exchange.

Soluzione 3: aggiorna il server

Un server con OpenSSH 7.2 o successivo firma automaticamente con SHA-2 e il messaggio sparisce. Un server così vecchio manca anche di anni di correzioni di sicurezza.

Se continua a fallire sui sistemi in stile Red Hat

Su RHEL 9 e derivati, la crypto policy del sistema limita di default le firme SHA-1, oltre all'impostazione di OpenSSH:

update-crypto-policies --show

Se da quella macchina devi raggiungere il vecchio server, riattiva le firme SHA-1 con la sottopolicy SHA1, poi riavvia:

sudo update-crypto-policies --set DEFAULT:SHA1

Vale per l'intera macchina e per ogni programma, quindi dove puoi preferisci la soluzione 1.

Il caso inverso

Un vecchio client contro un nuovo server fallisce al contrario: il client offre ssh-rsa e il server lo rifiuta. Il client vede solo Permission denied (publickey). Aggiorna il client o usa una chiave Ed25519.

Domande

Devo sostituire la mia chiave RSA?

No. La stessa chiave RSA firma con rsa-sha2-256 o rsa-sha2-512 su qualsiasi server con OpenSSH 7.2 o successivo. L'errore viene dai server vecchi che accettano solo firme SHA-1.

PubkeyAcceptedAlgorithms +ssh-rsa è sicuro?

Permette le firme SHA-1 solo per quell'host. Tienilo nel blocco Host di quel solo host come rimedio temporaneo, e passa a una chiave Ed25519 o a un server più recente.

Che differenza c'è tra ssh-rsa e rsa-sha2-256?

Usano la stessa chiave RSA. ssh-rsa firma con SHA-1, che OpenSSH non offre più di base dalla 8.8, mentre rsa-sha2-256 e rsa-sha2-512 firmano con SHA-2.

Fonti

Altro in Messaggi di errore

Tutte le guide