HOWTO · Git

Git Push con clave SSH

Este tutorial describe el proceso de enviar archivos Git con claves SSH específicas a servidores remotos mediante la línea de comandos. Aprende a configurar claves SSH, ajustar tu repositorio de Git y enviar cambios de forma segura. Perfecto para desarrolladores que buscan agilizar su flujo de trabajo y mejorar la seguridad.

En esta página

Para enviar una rama de Git con una clave SSH, crea un par de claves, añade la clave pública a tu cuenta de alojamiento de Git, configura el remoto del repositorio con su URL SSH y, después, envía la rama que quieras publicar. La clave privada permanece en tu equipo. SSH te autentica ante el servidor; este comprueba por separado si tu cuenta tiene permiso para escribir en ese repositorio.

Generar un par de claves SSH

Si aún no tienes una clave para esta cuenta, genera un par Ed25519 con ssh-keygen. El ejemplo siguiente crea un par temporal para mostrar el comando sin modificar los archivos habituales de ~/.ssh. Ejecútalo en un shell POSIX; no cambia tu configuración SSH.

set -e
key_dir=$(mktemp -d)
trap 'rm -rf "$key_dir"' EXIT
ssh-keygen -q -t ed25519 -C "git@example.com" -f "$key_dir/id_ed25519" -N ""
test -s "$key_dir/id_ed25519.pub"
printf 'Created the Ed25519 public key file.\n'
Created the Ed25519 public key file.

Esta demostración usa -N "" para establecer una frase de contraseña vacía, por lo que ssh-keygen no hace preguntas interactivas. Para crear una clave permanente, omite -f y acepta la ubicación predeterminada, o indica una ruta como ~/.ssh/id_ed25519_work; ssh-keygen te preguntará dónde guardarla y luego te pedirá una frase de contraseña. Introduce una frase para proteger la clave almacenada o pulsa Enter dos veces para dejarla vacía. La clave privada es el archivo que no termina en .pub: mantenla en secreto y no la subas. El archivo .pub contiene la clave pública. Si ya tienes un par de claves adecuado, puedes usarlo en lugar de generar otro.

Añadir la clave pública a tu cuenta de alojamiento de Git

Muestra el archivo de clave pública que elegiste (por ejemplo, con cat ~/.ssh/id_ed25519.pub) y copia la línea completa. En la configuración de tu cuenta en el servicio de alojamiento de Git, abre la sección de claves SSH y añade allí esa clave pública. GitHub, GitLab y otros proveedores usan nombres de página y políticas de cuenta distintos, así que sigue las instrucciones de tu proveedor. Nunca pegues ni subas la clave privada.

Configurar SSH para una o varias claves

SSH puede seleccionar una clave predeterminada. Si usas varias cuentas o claves, también puedes seleccionar una identidad concreta mediante un alias de host. Añade esta entrada completa a ~/.ssh/config:

Ejecuta este comando para mostrar una entrada de ejemplo completa y luego cópiala en ~/.ssh/config:

cat <<'SSH_CONFIG'
Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_work
    IdentitiesOnly yes
SSH_CONFIG

La ruta ~/.ssh/id_ed25519_work es un marcador de posición: sustitúyela por la ruta de tu clave privada. El remoto de Git debe usar el mismo alias github-work que la entrada Host. Indica la ruta de tu clave privada en IdentityFile. IdentitiesOnly yes indica a SSH que ofrezca la identidad configurada en lugar de ir probando otras identidades cargadas en un agente. Para otra cuenta, usa un alias y una ruta de clave distintos. El alias del remoto de Git debe coincidir exactamente con el valor de Host. Los permisos de archivo y el inicio del agente SSH varían según el sistema operativo y el shell. Si usas un agente, carga la clave privada con ssh-add después de iniciarlo siguiendo las instrucciones compatibles con tu entorno. Este paso es opcional si SSH puede leer la clave directamente.

Configurar el remoto SSH del repositorio

En el repositorio local, consulta el remoto configurado con git remote -v. Una URL SSH de GitHub tiene este formato: git@github.com:OWNER/REPOSITORY.git; sustituye ambos marcadores de posición por la cuenta u organización y el repositorio. Cambia el origin existente con git remote set-url origin git@github.com:OWNER/REPOSITORY.git y vuelve a ejecutar git remote -v para confirmar que muestra la URL SSH. Si el remoto tiene un nombre distinto de origin, conserva el nombre que ya tiene.

Si configuraste un alias como github-work, úsalo en la URL; por ejemplo, git@github-work:OWNER/REPOSITORY.git. Para otro servidor, usa la URL SSH que indique ese proveedor. Una URL que todavía empieza por https:// usa autenticación HTTPS, así que cambiar las claves no surtirá efecto hasta que cambies el remoto a SSH.

Confirmar los cambios y enviarlos

Elige qué archivos incluir y añádelos explícitamente al área de preparación, por ejemplo con git add path/to/file. Usa git add . solo si todos los cambios del directorio actual deben formar parte de esta confirmación. Crea la confirmación con git commit -m "Describe the change". Después, envía la rama deseada con git push origin BRANCH, sustituyendo origin y BRANCH por los nombres del remoto y de la rama de tu repositorio. Para el primer envío de una rama, git push -u origin BRANCH también configura su rama de seguimiento remoto.

Comprobar la autenticación SSH y resolver problemas habituales

Prueba la conexión con el servidor mediante ssh -T git@github.com o sustituye el host por tu alias SSH (por ejemplo, ssh -T git@github-work). La respuesta depende del proveedor; algunos servidores confirman tu cuenta, pero no ofrecen un shell interactivo. La autenticación solo demuestra qué cuenta identifica la clave. No demuestra que esa cuenta tenga permiso para enviar cambios a este repositorio, y algunos proveedores pueden devolver un código de salida distinto de cero aunque el mensaje confirme que la autenticación se realizó correctamente.

Si la prueba identifica la cuenta equivocada o no logra autenticarte, comprueba que añadiste la clave pública a esa cuenta, que IdentityFile apunta a la clave privada correspondiente y que el remoto usa el alias Host adecuado. ssh -vT git@github-work puede mostrar qué identidad ofrece SSH; revisa el diagnóstico en tu equipo y no compartas el contenido de ninguna clave privada. Comprueba también la URL del remoto con git remote -v. Si la autenticación funciona pero se rechaza el envío, verifica que tienes permiso de escritura en el repositorio, que el nombre de la rama es correcto y que no lo impidan las reglas del servidor.

Si pierdes una clave privada o queda expuesta, genera un par nuevo, añade su clave pública al servidor, actualiza la configuración SSH o el remoto según sea necesario y elimina de la cuenta la clave pública anterior. La clave pública se puede compartir con el servidor Git; la clave privada debe mantenerse en secreto.