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
La clave no está en el authorized_keys del servidor
frecuenteEl programa usa una clave distinta de la instalada en el servidor (otro archivo, el secreto de otro entorno), o la clave se añadió para otro usuario.
No se configuró ningún método de autenticación utilizable
frecuenteUn slice `Auth` vacío, un firmante que no se pudo cargar y se omitió sin avisar, o un `ssh.PublicKeysCallback` respaldado por un agente SSH que no tiene claves.
Clave RSA firmada con ssh-rsa (SHA-1)
ocasionalLos servidores OpenSSH 8.8+ rechazan las firmas `ssh-rsa`. Las versiones antiguas de x/crypto firman con las claves RSA usando SHA-1 de forma predeterminada; las actuales negocian `rsa-sha2-256/512`. Actualiza golang.org/x/crypto o usa una clave Ed25519.
Usuario remoto incorrecto
ocasionalLa clave está autorizada para `ubuntu`, pero el cliente inicia sesión como `root` o `deploy`. La autorización es por usuario.
Cómo solucionarlo
- 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.
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)