Watch at EaseHistorias. Respuestas. Perspectiva.

Tecnología · GUÍA PRÁCTICA

¿SSH agent refused operation? Demuestra el socket, la clave y la ruta de firma

El cliente llegó a un agente, pero este no completó la firma. Identifica el socket activo, compara la huella, prueba la firma local y verifica la ruta real de SSH antes de cambiar permisos, borrar claves o tocar el reenvío.

Ilustración técnica original: Diagrama técnico original desde SSH_AUTH_SOCK hasta la clave, la firma local, la ruta del cliente y la autorización del servidor.
Ilustración técnica original: Ruta de decisión original: demuestra socket, huella, firma y ruta SSH antes de cambiar la configuración. Watch at Ease

“Agent refused operation” es más concreto que un fallo genérico de clave pública. El cliente SSH contactó con un agente, eligió una clave pública y pidió firmar el desafío de autenticación, pero no recibió una firma utilizable. Puede estar usando otro agente, otra clave, una aprobación pendiente, un socket reenviado oculto o un token que no puede firmar ahora.

No empieces borrando claves o configuración, desactivando protecciones, copiando una clave privada al servidor ni habilitando ForwardAgent para todos los hosts. Conserva la terminal que falla y localiza el primer límite que no supera la prueba.

1. Mantén el contexto e identifica el agente

Haz las pruebas en la misma terminal, shell del IDE o sesión remota que produjo el error. Anota el alias del host, si hay reenvío de agente y la etiqueta de clave mostrada antes del rechazo.

Ejecuta `printf '%s\n' "$SSH_AUTH_SOCK"` y `test -n "$SSH_AUTH_SOCK" && test -S "$SSH_AUTH_SOCK" && echo agent-socket-present`. Un socket existente puede pertenecer a OpenSSH, GNOME Keyring, gpg-agent, 1Password, KeePassXC, un token o una sesión reenviada.

Usa `ssh-add -l` para las huellas y `ssh-add -L` para las claves públicas. El código de salida 2 significa que ssh-add no pudo contactar con el agente: es un problema de socket o sesión.

2. Compara la huella y demuestra que puede firmar

No confíes en el comentario de la clave. Ejecuta `ssh-keygen -lf ~/.ssh/id_ed25519.pub` para el archivo y `ssh-add -l -E sha256` para el agente. Si la huella ofrecida por SSH no aparece, corrige la carga o elegibilidad antes de tocar el servidor.

Si aparece, ejecuta `ssh-add -T ~/.ssh/id_ed25519.pub`. OpenSSH actual pide una firma y la verifica. Si falla, investiga bloqueo, ventana de aprobación, pinentry, toque/PIN y el registro del provider.

Versiones antiguas pueden no tener -T y algunos agentes de terceros implementan solo parte del protocolo. Una opción desconocida no es una firma fallida; registra `ssh -V` y usa la prueba oficial del producto.

3. Demuestra qué selecciona realmente SSH

Ejecuta `ssh -G your-host | grep -Ei '^(identityagent|identityfile|identitiesonly|forwardagent) '` para ver la configuración efectiva del alias. Host, Match e Include pueden cambiar el resultado final.

Después ejecuta una vez `ssh -vvv user@your-host` y localiza el agente, la huella ofrecida y la línea de rechazo. Si la huella difiere de la que superó -T, corrige solo IdentityFile/IdentityAgent para ese host.

IdentityAgent puede tener prioridad sobre SSH_AUTH_SOCK. En una sesión reenviada, un agente local del equipo remoto puede ocultar el socket del portátil; corrige la ruta específica y no copies la clave privada.

4. Sigue la primera prueba que falla

Sin socket o sin contacto: inicia o reconecta el agente previsto en esta sesión; no reutilices un socket antiguo de otro inicio de sesión.

Clave ausente: carga solo la identidad prevista o hazla elegible en el agente de terceros. Cambia permisos únicamente si hay una advertencia explícita sobre el archivo privado; no apliques el mismo chmod a todo el directorio.

Clave presente pero -T falla: revisa bloqueo, aprobación, pinentry, toque/PIN, provider y registros del mismo momento.

-T funciona pero SSH rechaza: compara huella e IdentityAgent; con reenvío o restricciones de destino, comprueba cada salto y autoriza la terminal o IDE que solicita la firma.

La misma clave firma y SSH la ofrece, pero el servidor responde Permission denied: revisa usuario, authorized_keys, principals del certificado y política del servidor.

5. Conserva la seguridad del reenvío y del hardware

El reenvío transmite capacidad de firma, no la clave privada. Limita ForwardAgent a hosts de confianza y aprueba en el equipo que posee la clave.

Un rechazo FIDO o PKCS#11 puede ser una barrera deliberada. Puede requerir toque, PIN, provider o permiso de destino. No desactives protecciones web ni cargues providers remotos solo para ocultar el error.

Tras corregirlo, repite los mismos ssh-add -T y ssh -vvv y registra socket, huella y configuración efectiva que funcionaron.

Tabla de decisión

ssh-add no puede contactar con el agente — Fallo de socket o sesión. Inicia o reconecta el agente previsto y vuelve a comprobar SSH_AUTH_SOCK

La clave no aparece en ssh-add -l — Agente incorrecto o clave no disponible. Carga o configura únicamente la identidad prevista

La clave aparece, pero ssh-add -T falla — El agente/provider no puede firmar ahora. Desbloquea, aprueba, toca o introduce el PIN; revisa los registros del provider

ssh-add -T funciona, pero SSH ofrece otra clave — Ruta del cliente incorrecta. Revisa ssh -G y ssh -vvv; corrige IdentityAgent/IdentityFile para ese host

ssh-add -T funciona, ofrece la misma clave y el servidor rechaza — Rama de autorización del servidor. Revisa usuario, authorized_keys, principals del certificado y política del servidor

Ilustración técnica original: Matriz original que relaciona resultados de ssh-add y SSH detallado con cada límite de fallo.
Ilustración técnica original: Matriz de diagnóstico original: cada comando aísla un límite y conserva las protecciones. Watch at Ease