Ce que vous voyez
sign_and_send_pubkey: no mutual signature supported
user@server: Permission denied (publickey,password).
Souvent, seule la deuxième ligne est visible. Dans nos tests, la première ligne apparaissait pour un fichier de clé RSA au format ancien sans fichier .pub à côté. Avec un fichier .pub, le même échec était silencieux, et seul ssh -v montrait la raison :
debug1: send_pubkey_test: no mutual signature algorithm
Créer le fichier .pub supprime la première ligne mais ne règle pas la connexion.
Pourquoi cela arrive
Le nom ssh-rsa désigne deux choses : un type de clé et une signature utilisant SHA-1. Une clé RSA peut aussi signer avec SHA-256 ou SHA-512, sous les noms rsa-sha2-256 et rsa-sha2-512. OpenSSH les prend en charge depuis la version 7.2. OpenSSH 8.8 a cessé de proposer par défaut la signature SHA-1, car SHA-1 est cassé.
Un serveur antérieur à la 7.2, ou un équipement avec une vieille bibliothèque SSH, peut donc n'accepter que la signature que votre client ne produit plus. Un serveur moderne n'est pas concerné, et vous n'avez pas besoin de remplacer une clé RSA pour cette raison : la même clé fonctionnait très bien sur un serveur moderne dans nos tests.
Le confirmer
ssh -v user@server true 2>&1 | grep -E 'remote software version|mutual|server-sig-algs'
Un cas correspondant ressemble à ceci. Une vieille version de serveur et aucune ligne 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
Pour confirmer, essayez pour une seule connexion :
ssh -o PubkeyAcceptedAlgorithms=+ssh-rsa user@server
Si la connexion réussit, c'est la cause. Les clients antérieurs à OpenSSH 8.5 appellent cette option PubkeyAcceptedKeyTypes.
Solution 1 : utiliser une clé Ed25519
C'est la meilleure solution si le serveur la prend en charge, c'est-à-dire à partir d'OpenSSH 6.5. Elle a fonctionné face au serveur 6.6 de notre test sans option particulière, et n'a pas besoin de 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
Voir comment générer une clé ed25519. ECDSA fonctionne aussi là où Ed25519 n'est pas disponible. Pour comparer les deux types de clés, voir RSA ou Ed25519.
Solution 2 : autoriser ssh-rsa pour cet hôte uniquement
Utilisez-la pour un appareil que vous ne pouvez pas modifier, comme un vieil équipement réseau. Limitez-la à cet hôte dans ~/.ssh/config au lieu de l'ajouter sous Host * :
Host old-box
HostName 203.0.113.10
User user
IdentityFile ~/.ssh/id_rsa
IdentitiesOnly yes
PubkeyAcceptedAlgorithms +ssh-rsa
OpenSSH décrit cela comme un palliatif en attendant de pouvoir mettre à jour l'ancien système. Si l'appareil n'a qu'une clé d'hôte RSA, vous obtenez une autre erreur, sur le type de clé d'hôte. Ajoutez HostKeyAlgorithms +ssh-rsa au même bloc, et voyez no matching key exchange pour cette famille d'erreurs.
Solution 3 : mettre le serveur à jour
Un serveur sous OpenSSH 7.2 ou plus récent signe automatiquement avec SHA-2 et le message disparaît. Un serveur aussi ancien a aussi des années de correctifs de sécurité en retard.
Si cela échoue encore sur les systèmes de type Red Hat
Sur RHEL 9 et ses dérivés, la politique cryptographique du système restreint par défaut les signatures SHA-1, en plus du réglage d'OpenSSH :
update-crypto-policies --show
Si vous devez joindre l'ancien serveur depuis cette machine, réactivez les signatures SHA-1 avec la sous-politique SHA1, puis redémarrez :
sudo update-crypto-policies --set DEFAULT:SHA1
Cela touche toute la machine et chaque programme : préférez donc la solution 1 quand c'est possible.
Le cas inverse
Un vieux client face à un serveur récent échoue dans l'autre sens : le client propose ssh-rsa et le serveur le refuse. Le client voit simplement Permission denied (publickey). Mettez le client à jour ou utilisez une clé Ed25519.
Questions
Faut-il remplacer ma clé RSA ?
Non. La même clé RSA signe avec rsa-sha2-256 ou rsa-sha2-512 sur tout serveur avec OpenSSH 7.2 ou plus récent. L'erreur vient des anciens serveurs qui n'acceptent que les signatures SHA-1.
PubkeyAcceptedAlgorithms +ssh-rsa est-il sûr ?
Il autorise les signatures SHA-1 pour cet hôte seulement. Gardez-le dans le bloc Host de cet hôte comme solution provisoire, et passez à une clé Ed25519 ou à un serveur plus récent.
Quelle différence entre ssh-rsa et rsa-sha2-256 ?
Les deux utilisent la même clé RSA. ssh-rsa signe avec SHA-1, qu'OpenSSH ne propose plus par défaut depuis la 8.8, tandis que rsa-sha2-256 et rsa-sha2-512 signent avec SHA-2.
Sources
- Notes de version d'OpenSSH 8.8
- ssh_config(5), PubkeyAcceptedAlgorithms
- Utilisation des politiques cryptographiques à l'échelle du système, RHEL 9