Come risolvere "Permission denied (publickey)" in SSH

Il server ha rifiutato tutte le chiavi offerte dal tuo client, oppure il client non ne ha offerta nessuna. Esegui ssh -v user@server per vedere quali chiavi vengono offerte, poi leggi il log di autenticazione sul server per capire perché sono state rifiutate. Le cause più comuni sono una chiave che non è nel file authorized_keys del server, il nome utente sbagliato o permessi errati su ~/.ssh o sulla home directory. Se l'accesso con password funziona ancora, ssh-copy-id user@server installa la tua chiave.

Aggiornata il . Ogni errore è stato riprodotto con OpenSSH 10.3 su macOS contro OpenSSH 10.0 su Debian 13, e le righe di log vengono da quelle prove. ssh-copy-id e l'installazione a mano sono stati provati contro OpenSSH 10.0 su Debian 13.

Vedere cosa offre il tuo client

ssh -v user@server

Cerca queste righe verso la fine dell'output:

RigaCosa significa
Will attempt key: ...Le chiavi che il tuo client intende provare. Se la tua manca, il client non la conosce.
Offering public key: ...La chiave è stata inviata al server.
Server accepts key: ...Il server conosce questa chiave. Un errore dopo questa riga è un problema della chiave privata dalla tua parte.
Warning: Identity file ... not accessibleIl percorso che hai dato a -i o a IdentityFile non esiste.
Load key "...": bad permissionsIl file della chiave privata è troppo aperto, quindi è stato ignorato. Vedi file della chiave privata non protetto.

La parola tra parentesi nell'errore elenca i metodi di login che il server consente ancora. (publickey) da solo significa che le password sono disattivate, quindi una chiave funzionante è l'unico modo per entrare.

Ti capita con git push o git pull? Vedi git@github.com: Permission denied (publickey).

Leggere il log sul server

Al client non viene mai detto perché una chiave è stata rifiutata. Lo sa solo il server. Se hai ancora un modo per entrare, come un'altra sessione o la console del provider, leggi il log:

sudo journalctl -u ssh -n 50     # Debian, Ubuntu
sudo journalctl -u sshd -n 50    # RHEL, Fedora, Arch
sudo tail -n 50 /var/log/auth.log   # older Debian and Ubuntu
sudo tail -n 50 /var/log/secure     # older RHEL
Riga di logCausa
Invalid user alice from ...Quell'account non esiste sul server.
Authentication refused: bad ownership or modes for directory ...Permessi sulla home directory o su .ssh.
Authentication refused: bad ownership or modes for file ...Permessi su authorized_keys.
Could not open user 'user' authorized keys ...: Permission deniedIl file appartiene a qualcun altro, spesso root, dopo essere stato creato con sudo.
User user from ... not allowed because not listed in AllowUsersL'account è bloccato da AllowUsers. DenyUsers, AllowGroups e DenyGroups funzionano in modo simile.
Connection closed by authenticating user user ... [preauth]Se non è registrato nient'altro, di solito la chiave semplicemente non è in authorized_keys.

Se il log non dà alcun motivo, esegui un secondo sshd in modalità debug su una porta libera. Gestisce una sola connessione, stampa ogni passaggio ed esce. La porta deve essere aperta nel tuo firewall.

sudo /usr/sbin/sshd -d -p 2222
ssh -v -p 2222 user@server

Utente sbagliato

Controlla con quale utente fai davvero il login, perché una riga User nella tua configurazione può impostarlo:

ssh -G server | grep '^user '

Le immagini cloud spesso usano un account fisso come ubuntu, debian o ec2-user e rifiutano root. Una chiave installata per un account non funziona per un altro, perché ogni account ha il proprio authorized_keys.

Per fissare utente e chiave di un host una volta per tutte, metti User e IdentityFile nel suo blocco del file di configurazione ssh.

Chiave sbagliata, o chiave assente sul server

Confronta le impronte. Sulla tua macchina:

ssh-keygen -lf ~/.ssh/id_ed25519.pub

Sul server, questo elenca ogni chiave nel file:

ssh-keygen -lf ~/.ssh/authorized_keys

Se l'impronta manca, installa la chiave. Finché l'accesso con password funziona, basta un comando, che imposta anche i permessi giusti:

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server

Se il server accetta solo chiavi, aggiungila dalla console del provider o da un'altra sessione, come quell'utente. Al posto dell'esempio metti la riga intera del tuo file .pub:

mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo 'ssh-ed25519 AAAA... you@laptop' >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Se la chiave c'è ma il tuo client ne offre prima altre, indicala per nome e ignora le altre:

ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 user@server

Un errore comune nell'installazione a mano è una chiave spezzata su due righe. Ogni chiave deve stare su una sola riga: vedi il file authorized_keys spiegato.

Permessi e proprietà

Con StrictModes yes, il valore predefinito, sshd ignora authorized_keys se altri utenti potrebbero scriverci o scrivere nelle cartelle sopra. Basta il permesso di scrittura per il gruppo sulla home directory per far scattare il controllo. Sul server, come utente:

chmod go-w ~
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Se hai creato i file con sudo, correggi anche il proprietario:

sudo chown -R user:user /home/user/.ssh

Per vedere tutti i livelli del percorso in una volta:

namei -l /home/user/.ssh/authorized_keys

Sui sistemi con SELinux in modalità enforcing, come RHEL e Fedora, i file spostati al loro posto possono anche avere l'etichetta sbagliata. Ripristinala con restorecon -Rv ~/.ssh.

AuthorizedKeysFile punta altrove

La tua chiave può essere nel file giusto per la configurazione predefinita, ma non per questo server. Chiedi a sshd cosa si applica a questo utente. -C valuta anche gli eventuali blocchi Match:

sudo sshd -T -C user=user,host=example.com,addr=203.0.113.10 | grep -iE '^(authorizedkeysfile|pubkeyauthentication) '

Il valore predefinito è .ssh/authorized_keys .ssh/authorized_keys2, relativo alla home directory. Un valore come /etc/ssh/authorized_keys/%u significa che la chiave deve andare invece lì. Controlla anche che pubkeyauthentication dica yes.

RSA vecchio e PubkeyAcceptedAlgorithms

OpenSSH 8.8 ha disattivato di default la firma ssh-rsa, che usa SHA-1. Ha disattivato la vecchia firma, non le chiavi RSA. Una chiave RSA funziona ancora quando entrambi i lati supportano rsa-sha2-256 o rsa-sha2-512, che OpenSSH supporta dalla versione 7.2.

Se un nuovo client incontra un server troppo vecchio per questo, ssh -v mostra una riga come no mutual signature algorithm, e la chiave non viene mai offerta. La vera soluzione è aggiornare il server. Fino ad allora, consenti la vecchia firma per quel solo host in ~/.ssh/config:

Host oldbox
  PubkeyAcceptedAlgorithms +ssh-rsa
  HostKeyAlgorithms +ssh-rsa

Se un vecchio client si connette a un nuovo server, la stessa riga va nella configurazione di sshd e riguarda ogni utente di quel server:

PubkeyAcceptedAlgorithms +ssh-rsa

Prima di OpenSSH 8.5 l'opzione si chiamava PubkeyAcceptedKeyTypes. Se puoi, passa a una chiave ed25519 e rimuovi queste righe.

Domande

Come aggiungo la mia chiave SSH al server?

Esegui ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server finché l'accesso con password funziona. Se il server accetta solo chiavi, aggiungi la riga del tuo file .pub a ~/.ssh/authorized_keys dalla console del provider, poi esegui chmod 600 sul file.

Perché SSH dice Permission denied (publickey) se la chiave è sul server?

Di solito per i permessi: sshd ignora authorized_keys se la home, .ssh o il file sono scrivibili da altri. Controlla anche che la chiave sia nel file dell'account con cui entri.

Come vedo quale chiave offre SSH?

Esegui ssh -v user@server e cerca le righe Offering public key. Per usare una sola chiave, aggiungi -o IdentitiesOnly=yes e -i con il suo percorso.

Le chiavi RSA funzionano ancora con OpenSSH recente?

Sì. OpenSSH 8.8 ha spento la vecchia firma ssh-rsa con SHA-1, non le chiavi RSA, che funzionano con rsa-sha2-256 o rsa-sha2-512.

Fonti

Altro in Chiavi e accesso

Tutte le guide