Saltar al contenido
ecdsa.com
golang.org/x/crypto/ssh (Go)Go

Mensaje de error

ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

También se muestra como

  • ssh: unable to authenticate, attempted methods [none], no supported methods remain

La lista entre corchetes refleja los métodos de `Auth` configurados. `[none]` a solas significa que el cliente no tenía ningún método utilizable: normalmente, un slice `Auth` vacío o una clave que no se pudo cargar.

golang.org/x/crypto/ssh (Go) — ssh.Dial / ssh.NewClientConn

Qué significa

El transporte SSH se estableció (se aceptó la clave del host), pero se rechazaron todos los métodos de autenticación que probó el cliente y el servidor no ofreció nada más que el cliente pudiera hacer. La lista entre corchetes es lo que intentó el cliente Go: `none` es la sonda inicial que envía todo cliente SSH, y `publickey` significa que se ofrecieron tus claves y se rechazaron. Es el equivalente en Go del «Permission denied (publickey)» de OpenSSH.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Cargar la clave explícitamente y verificar el host

    Lee la clave privada, devuelve un error visible si falla el análisis y usa `knownhosts` para la clave del host en lugar 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 las huellas digitales y leer el registro del servidor

    sshd registra por qué rechazó una clave (permisos incorrectos en `~/.ssh`, algoritmo no aceptado, usuario desconocido). El lado del cliente nunca llega a conocer el 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)

Errores relacionados

Explorar toda la base de datos de errores de firma