Pular para o conteúdo
ecdsa.com
golang.org/x/crypto/ssh (Go)Go

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

Como corrigir

  1. 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. 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)

Erros relacionados

Ver toda a base de erros de assinatura