Mensagem de erro
ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain
Também aparece como
- ssh: unable to authenticate, attempted methods [none], no supported methods remain
A lista entre colchetes reflete os métodos `Auth` que você configurou. `[none]` sozinho significa que o cliente não tinha nenhum método utilizável — normalmente um slice `Auth` vazio ou uma chave que não carregou.
golang.org/x/crypto/ssh (Go) — ssh.Dial / ssh.NewClientConn
O que significa
O transporte SSH foi estabelecido (a chave do host foi aceita), mas todos os métodos de autenticação que o cliente tentou foram rejeitados, e o servidor não ofereceu mais nada que o cliente pudesse usar. A lista entre colchetes mostra o que o cliente Go tentou: `none` é a sondagem inicial que todo cliente SSH envia, e `publickey` significa que suas chaves foram oferecidas e recusadas. É o equivalente em Go ao “Permission denied (publickey)” do OpenSSH.
Por que acontece
A chave não está no authorized_keys do servidor
comumO programa usa uma chave diferente da instalada no servidor (outro arquivo, o segredo de outro ambiente), ou a chave foi adicionada para outro usuário.
Nenhum método de autenticação utilizável foi configurado
comumUm slice `Auth` vazio, um signatário que não carregou e foi ignorado sem aviso, ou um `ssh.PublicKeysCallback` apoiado em um agente SSH que não tem nenhuma chave.
Chave RSA que assina com ssh-rsa (SHA-1)
ocasionalServidores OpenSSH 8.8+ rejeitam assinaturas `ssh-rsa`. Versões antigas do x/crypto assinam com chaves RSA usando SHA-1 por padrão; as versões atuais negociam `rsa-sha2-256/512`. Atualize o golang.org/x/crypto ou use uma chave Ed25519.
Usuário remoto errado
ocasionalA chave está autorizada para `ubuntu`, mas o cliente faz login como `root` ou `deploy`. A autorização é por usuário.
Como corrigir
- 1.
Carregar a chave explicitamente e verificar o host
Leia a chave privada, interrompa com um erro claro se a análise falhar e use `knownhosts` para a chave do host em vez de `ssh.InsecureIgnoreHostKey()`.
go keyBytes, err := os.ReadFile(os.ExpandEnv("$HOME/.ssh/id_ed25519")) if err != nil { return err } signer, err := ssh.ParsePrivateKey(keyBytes) if err != nil { return err } hostKeys, err := knownhosts.New(os.ExpandEnv("$HOME/.ssh/known_hosts")) if err != nil { return err } client, err := ssh.Dial("tcp", "server.example.com:22", &ssh.ClientConfig{ User: "deploy", Auth: []ssh.AuthMethod{ssh.PublicKeys(signer)}, HostKeyCallback: hostKeys, }) - 2.
Comparar as impressões digitais e ler o log do servidor
O sshd registra no log por que recusou uma chave (permissões incorretas em `~/.ssh`, algoritmo não aceito, usuário desconhecido). O lado do cliente nunca fica sabendo o motivo.
bash ssh-keygen -lf ~/.ssh/id_ed25519.pub # fingerprint of the key the program uses ssh deploy@server.example.com 'ssh-keygen -lf ~/.ssh/authorized_keys' sudo journalctl -u ssh -n 20 # sshd's reason (modes, algorithms, user)