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
- Note di rilascio di OpenSSH 8.8
- ssh_config(5), PubkeyAcceptedAlgorithms
- Uso delle crypto policy di sistema, RHEL 9