OpenSSH

Permission denied (publickey)

La conexión se corta sin llegar a pedir contraseña. El servidor ha recibido la clave y no la ha aceptado, o no ha llegado a considerar ninguna.

Empieza siempre por ssh -v: la salida dice qué claves ofrece el cliente y en qué punto se rinde. Sin eso se acaba tocando a ciegas la configuración del servidor.

Qué comprobar, y en qué orden

En el orden en que lo miramos nosotros. No es un ranking de frecuencia: no publicamos estadísticas que no hemos medido.

  1. 1

    El cliente no está ofreciendo la clave que crees. Si tienes varias, SSH las va probando una a una y el servidor corta al llegar a MaxAuthTries, que por defecto son seis.

    Comprobar

    ssh -v usuario@servidor 2>&1 | grep -i 'offering\|Authentications that can continue'

    Corregir

    ssh -i ~/.ssh/la_clave_correcta usuario@servidor
    # Y para fijarlo, en ~/.ssh/config:
    #   Host servidor
    #     IdentityFile ~/.ssh/la_clave_correcta
    #     IdentitiesOnly yes
  2. 2

    La clave pública no está en authorized_keys del usuario con el que entras. Cada usuario tiene el suyo: la de root no sirve para otro.

    Comprobar

    # En el servidor, como ese usuario:
    grep -c . ~/.ssh/authorized_keys

    Corregir

    ssh-copy-id -i ~/.ssh/la_clave.pub usuario@servidor
  3. 3

    Los permisos del directorio o del fichero son demasiado abiertos. sshd ignora authorized_keys si el grupo u otros pueden escribir en él, y no lo dice en la salida del cliente.

    Comprobar

    ls -ld ~ ~/.ssh ~/.ssh/authorized_keys

    Corregir

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

    El propietario del directorio no es el usuario. Pasa al copiar el authorized_keys con sudo desde otra cuenta.

    Comprobar

    stat -c '%U %n' ~ ~/.ssh ~/.ssh/authorized_keys

    Corregir

    chown -R usuario:usuario ~usuario/.ssh
  5. 5

    El servidor tiene deshabilitada la autenticación por clave, o restringe qué usuarios pueden entrar con AllowUsers o AllowGroups.

    Comprobar

    sudo sshd -T | grep -iE 'pubkeyauthentication|allowusers|allowgroups|authorizedkeysfile'

    Corregir

    # En /etc/ssh/sshd_config (o un fichero de sshd_config.d):
    #   PubkeyAuthentication yes
    sudo sshd -t && sudo systemctl reload ssh
  6. 6

    El tipo de clave ya no se acepta. OpenSSH 8.8 desactivó por defecto las firmas RSA con SHA-1, así que una clave RSA antigua deja de funcionar tras actualizar el servidor, el cliente o los dos.

    Comprobar

    ssh -v usuario@servidor 2>&1 | grep -i 'send_pubkey_test\|no mutual signature'

    Corregir

    # Lo correcto es generar una clave nueva; con ed25519 el problema no existe:
    ssh-keygen -t ed25519 -C 'usuario@equipo'
    # Los parches temporales no son intercambiables: el que hace falta depende
    # de cuál de los dos extremos rechaza la firma.
    # Si el actualizado es el cliente, en ~/.ssh/config:
    #   PubkeyAcceptedAlgorithms +ssh-rsa
    # Si el actualizado es el servidor, en /etc/ssh/sshd_config:
    #   PubkeyAcceptedAlgorithms +ssh-rsa
    # Una opción en el cliente no hace que un servidor 8.8 acepte lo que ha
    # desactivado.

Un detalle que ahorra tiempo

El log del servidor es donde aparece el motivo real. «Authentication refused: bad ownership or modes for directory» confirma que es un problema de permisos; en el cliente ese caso se ve igual que una clave que no está.

Los comandos de esta página se ejecutan en tu servidor y algunos modifican la configuración: léelos antes de pegarlos. Las rutas y los nombres de servicio varían entre distribuciones. Así se elabora este catálogo.