termal.in

← Blog

ssh-agent en Windows: inicia el servicio, añade tus claves, corrige los errores

· Termalin Team sshssh-agentwindowstutorial

Le pusiste una frase de contraseña (passphrase) a tu clave SSH, y ahora Windows te la pide en cada git push y en cada ssh. La solución es el agente SSH: desbloqueas la clave una vez, y a partir de ahí cada conexión firma en silencio. El matiz en Windows es que no hay un agente. Hay tres que pueden estar corriendo a la vez, guardan las claves en sitios distintos, y una clave cargada en uno es invisible para los demás. Casi todo problema de agente del tipo «ayer funcionaba» en Windows es en realidad un problema de agente equivocado. Así que esta guía empieza por nombrarlos, luego pone cada uno en marcha, y después descifra los errores con los que realmente te topas.

Los tres agentes, y por qué no comparten claves

AgenteViene conDónde escuchaQué ssh lo ve
OpenSSH Authentication Agent (un servicio de Windows)el OpenSSH nativo de Windowsnamed pipe \\.\pipe\openssh-ssh-agentel ssh.exe de C:\Windows\System32\OpenSSH
El agente de MSYS2 (ssh-agent)Git para Windows / Git Bashun socket estilo Unix nombrado por SSH_AUTH_SOCKel ssh que viene dentro de Git Bash
Un agente de Linuxdentro de tu distro de WSLun socket Unix en esa distroel ssh que corre dentro de WSL

La lección de la tabla: ssh-add en Git Bash carga una clave en el agente de MSYS2, y el ssh.exe nativo de Windows nunca la verá — otro endpoint, otro almacén de claves. Elige un agente, carga tus claves ahí, y usa el ssh que le corresponde. Mezclarlos es la raíz de casi toda la confusión de abajo. La guía de ssh-agent y ssh-add (en inglés) cubre la mecánica multiplataforma; esta página es la mitad específica de Windows.

El servicio integrado OpenSSH Authentication Agent

Las versiones modernas de Windows 10 y 11 incluyen OpenSSH, y con él un servicio de Windows que ejecuta el agente — pero está desactivado por defecto. Actívalo una vez, desde una PowerShell con permisos de administrador (Ejecutar como administrador):

Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent

Automatic lo inicia en cada arranque, así que esto es una configuración de una sola vez. Comprueba el resultado:

Get-Service ssh-agent | Select-Object Status, StartType

Quieres ver Running y Automatic. A partir de ahí, en una PowerShell o cmd normal (no Git Bash), ssh-add habla con este servicio:

ssh-add                                 # load default keys (id_ed25519, id_rsa, …)
ssh-add $env:USERPROFILE\.ssh\id_ed25519  # load a specific key
ssh-add -l                              # list loaded key fingerprints

ssh-add -l es tu primer diagnóstico ante cualquier fallo de inicio de sesión — si la clave que esperas no aparece en la lista, el agente no puede firmar con ella, por bien que se vea todo lo demás.

Para dejar de teclear ssh-add, deja que la primera conexión cargue la clave por ti. Pon esto en %USERPROFILE%\.ssh\config (el mismo archivo ssh_config (en inglés) que OpenSSH lee en todas partes):

Host *
    AddKeysToAgent yes

Ahora el primer ssh que necesite una frase de contraseña la pide una vez y carga la clave en el servicio como efecto colateral. Como el git y el ssh nativos de Windows usan ambos este servicio, git push también empieza a funcionar en silencio.

Error 1058: «unable to start the ssh-agent service»

Ejecutas Start-Service ssh-agent y obtienes:

Start-Service : Service 'OpenSSH Authentication Agent (ssh-agent)' cannot be started due to the following error:
Cannot start service ssh-agent on computer '.'.
... error 1058 ...

El error 1058 significa que el servicio está deshabilitado — Windows no inicia un servicio cuyo tipo de inicio es Disabled, y Start-Service no lo cambia por ti. Corrige primero el tipo de inicio, luego arráncalo (PowerShell con permisos de administrador):

Set-Service ssh-agent -StartupType Manual
Start-Service ssh-agent

Manual basta para arrancarlo bajo demanda; usa Automatic si lo quieres levantado en cada arranque. Si estás en una máquina gestionada o de dominio, puede que una directiva de grupo lo haya deshabilitado — en ese caso tu administrador tiene que permitir el servicio antes de que esto se mantenga.

«error connecting to agent: No such file or directory»

Este viene del ssh de Git Bash / MSYS2, no del servicio de Windows. Significa que a ese ssh se le dijo dónde encontrar un socket de agente — vía SSH_AUTH_SOCK — y no hay nada ahí. Dos causas habituales:

  • No hay ningún agente corriendo en esta shell. Git Bash no arranca uno por ti. Arráncalo en la shell que estés usando:

    eval "$(ssh-agent -s)"
    ssh-add ~/.ssh/id_ed25519

    El eval importa: ssh-agent -s solo imprime las variables; el eval las establece para que ssh pueda encontrar el socket. Ejecutar ssh-agent a secas y preguntarse por qué no cambió nada es el tropiezo clásico.

  • SSH_AUTH_SOCK está obsoleto. Una variable fijada por una sesión anterior, un perfil de inicio de sesión u otra herramienta apunta a un socket que ya no existe. Compruébala con echo $SSH_AUTH_SOCK, y luego quítala y arranca un agente nuevo, o corrígela para que apunte a uno vivo.

Si prefieres usar el servicio de Windows desde dentro de Git Bash, llama directamente al binario nativo — /c/Windows/System32/OpenSSH/ssh.exe — en lugar del ssh de MSYS2 que está en tu PATH. Entonces Git Bash llega a las mismas claves que cargaste en el servicio, y SSH_AUTH_SOCK deja de importar.

Claves en WSL

WSL es un sistema Linux aparte, así que tiene su propio agente, su propio ~/.ssh y su propio SSH_AUTH_SOCK. Las claves cargadas en el lado Windows no son visibles dentro de tu distro, y viceversa. Tienes dos opciones honestas:

  • Ejecutar un agente dentro de WSL a la manera Linux de siempre — eval "$(ssh-agent -s)" y ssh-add, o AddKeysToAgent yes en el ~/.ssh/config de la distro. Sencillo, totalmente aislado, y cubierto en la guía de ssh-add (en inglés).
  • Puentear al agente de Windows para que ambos mundos compartan un mismo almacén de claves. La receta habitual canaliza el named pipe de Windows hacia un socket Unix al que apunta el SSH_AUTH_SOCK de WSL, usando npiperelay.exe junto con socat. Funciona bien una vez montado, pero son más piezas en movimiento — recurre a ello solo si de verdad necesitas la misma clave en ambos lados.

Elijas lo que elijas, recuerda que ssh-add -l dentro de WSL es una pregunta distinta de ssh-add -l en PowerShell. Haz la correcta cuando depures.

Cuando el agente está bien pero el inicio de sesión sigue fallando

Si ssh-add -l muestra tu clave y el servidor sigue diciendo Permission denied (publickey), el agente ha hecho su trabajo — el problema se ha movido aguas abajo, al authorized_keys del servidor, al usuario equivocado, o a que se ofrece la clave equivocada. Esa es otra lista de comprobación: Permission denied (publickey), corregido en orden (en inglés). Y antes de reenviar el agente a una máquina remota con ssh -A, lee por qué el reenvío del agente es cómodo y peligroso (en inglés) — expone el uso en vivo de tus claves en el extremo lejano.

Cómo gestiona esto Termalin en Windows

Si hacer malabares con servicios, sockets y tres almacenes de claves es más de lo que quieres pensar, ese es el flujo que Termalin integra. Ejecuta su propio agente de claves en un named pipe de Windows, \\.\pipe\termalin-ssh-agent, y sirve las claves que ya has desbloqueado en la app por el protocolo estándar de ssh-agent — así una herramienta que hable ese protocolo puede firmar a través de él sin ningún servicio del sistema que activar, sin línea de eval, y sin ssh-add manual. Las claves privadas se quedan en la app en marcha y nunca se escriben en disco. El sentido de ese agente es permitir que el propio servidor MCP de Termalin se autentique en tus servidores con tus claves sin llegar a tener nunca el material de clave en sí — el agente firma, quien llama nunca ve el secreto. Es la misma idea de un solo desbloqueo que el servicio de OpenSSH, con la configuración de Windows quitada de tus manos.


Termalin es un cliente SSH gratuito y multiplataforma cuyo agente integrado desbloquea tus claves una vez y firma en tu nombre — descárgalo, o lee cómo gestiona tus claves con seguridad.

Pruébalo en un host.

Termalin es un cliente SSH rápido para ti y para tus agentes.

Plan gratuito · 14 días de Pro de prueba · precios