version: v1.0.0 - Configurar múltiples cuentas de Git con llaves SSH
version: v1.0.1 - Integración de manera dinámica con .gitconfig por directorios
El uso de múltiples cuentas de Git con diferente proveedor (como GitHub, GitLab o Bitbucket) en una sola máquina puede ser un poco complicado si queremos trabajar con diferentes cuentas por cada repositorio. La forma más común de hacerlo es utilizando claves SSH para autenticar las cuentas en lugar de usar HTTPS. Esto es más seguro y eficiente, ya que cada cuenta requiere un par de claves SSH único (Llave privada y pública). Este post es una pequeña guía educativa que se me ocurrio debido a que en el algunas ocasiones uso mi computadora personal para los proyectos del trabajo.
Primero que todo vamos a abarcar algunos conceptos básicos de SSH y luego veremos cómo realizar las configuraciones.
¿Qué es una llave SSH?
Una clave SSH es un par de claves criptográficas (una pública y una privada) que se utilizan para autenticar a los usuarios en un servidor remoto a través del protocolo (Secure Shell). La clave privada se almacena en la máquina local y nunca se comparte con nadie. Se utiliza para descifrar mensajes cifrados que solo pueden ser cifrados por su contraparte pública.
¿Por qué usar llaves SSH?
El protocolo de red seguro que funciona con autenticación y cifrado de SSH es muy utíl cuando las maquinas remotas a las que nos conectamos pertenecen a una red abierta no segura. Además, para poder hacer pull o push a los repositorios y si de algun modo estan privados, necesitamos autenticarnos con el servidor, y la forma más segura y eficiente de hacerlo es utilizando claves SSH.¿
Crea las SSH keys para cada cuenta
Genera una clave SSH para cada cuenta que tengas. Para ello, usaremos ssh-keygen
para iniciar el sistema de generado de clave
- Genera una clave SSH para la cuenta personal
$ ssh-keygen -t ed25519 -C "personal@email.com" -f ~/.ssh/id_ed25519_personal
- Genera una clave SSH para la cuenta de trabajo
$ ssh-keygen -t ed25519 -C "business@email.com" -f ~/.ssh/id_ed25519_business
En los dos pasos anteriores no optamos por elegir la frase para la llave creada. Si deseas agregar una frase de paso a tus claves, puedes hacerlo al momento de generar la clave SSH. Esto te permitirá proteger tus claves en caso de que alguien tenga acceso a tu máquina. A continuación se muestra un ejemplo de cómo agregar una frase de paso a la clave SSH:
$ ssh-keygen -t ed25519 -C "business@email.com" -f ~/.ssh/id_ed25519_business
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_ed25519_business
Your public key has been saved in /home/user/.ssh/id_ed25519_business.pub
The key fingerprint is:
SHA256:ui7NfXfNXobIH1lMt0XTXZqH4uwxY70TRpwEl3hRdZM personal@email.com
The key's randomart image is:
+--[ED25519 256]--+
| .o+*%|
| .+oE*|
| ..B =|
| o + ++|
| S B +.o|
| . + * * |
| o.. + *oo|
| . o.. . ...++|
| oo . . ....|
+----[SHA256]-----+
-t
: Especifica el tipo de clave que se generará. En este caso, se generará una claveed25519
.ed25519
: Es un algoritmo de clave asimétrica que es más seguro y eficiente quersa
.-C
: Este comentario se incluirá en la clave. Es útil para identificar la clave.-f
: Es para definir el nombre del archivo de clave, si agregamos~/.ssh/
es para indicar que la clave se va a almacenar en el directorio de SSH que es creado por defecto en sistemas UNIX (Cabe recalcar que si no se ha inicializado nunca algún comando de SSH o herramienta que lo requiera, este directorio no existirá).
Recuerda que esto te genera dos archivos, uno con la extensión .pub
que es la clave pública y otro sin extensión que es la clave privada. La clave privada es la que debes guardar en tu máquina y la clave pública es la que debes agregar a tu proveedor Git.
Los tipos de claves que se pueden generar son: dsa
, ecdsa
, ed25519
, ed25519-sk
, rsa
. Cada uno tiene sus propias características de seguridad, tamaño de clave, velocidad y compatibilidad. A continuación se muestra una tabla con las características de cada tipo de clave:
Algoritmo | Seguridad | Tamaño de Clave | Velocidad |
---|---|---|---|
DSA | Débil | 1024 bits | Rápido, pero inseguro |
ECDSA | Débil | 256, 384, 521 bits | Rápido |
RSA | Fuerte | 2048, 3072, 4096 bits | Lento |
ED25519 | Fuerte | 256 bits | Muy rápido |
Añadir las SSH keys al agente
Carga ambas claves en el agente SSH:
- Inicia el agente SSH en tu terminal:
eval "$(ssh-agent -s)"
Este comando inicia el agente SSH, que es un programa que mantiene tus claves SSH en memoria y las utiliza para autenticarse en servidores SSH.
- Agrega las claves privadas al agente:
$ ssh-add ~/.ssh/id_ed25519_personal
$ ssh-add ~/.ssh/id_ed25519_business
$ ssh-add -l
256 SHA256:/khgpmgucg9iXsh4EEGoCL21Zvu5JoDdpH0gypoQc6k personal@email.com (ED25519)
256 SHA256:bd/Tq+BlXQgOeu26RxYfU3gKM/uRwzl9Vd8MHat0Lus business@email.com (ED25519)
El comando ssh-add -l
lista las claves que actualmente están cargadas en el agente SSH. La salida muestra dos claves ED25519 con sus respectivos identificadores y direcciones de correo electrónico asociadas.
Las llaves las agregas al agente para que no tengas que escribir la contraseña cada vez que hagas un push o pull a un repositorio. Esto te permite autenticarte en los servidores sin tener que escribir la contraseña cada vez.
Agregar la claves a los perfiles de tu proveedor Git
Ahora agregaremos nuestra clave pública y la agregaremos a nuestro proveedor de Git correspondiente (En este caso Gitub).
- Copia la clave pública que acabas de generar:
Ubica la clave pública en tu directorio ~/.ssh
y copia su contenido. Si estás en una terminal, puedes usar el comando cat filename.pub
para ver el contenido de la clave.
$ cd ~/.ssh
$ cat id_ed25519_personal.pub # Clave para la cuenta personal
ssh-ed25519 AAAAC3NzaC1l************************* personal@email.com # copiar
$ cat id_ed25519_business.pub # Clave para la cuenta de trabajo
ssh-ed25519 AAAAC3NzaC1l************************* business@email.com # copiar
Luego, ve a tu cuenta de Github y sigue los siguientes pasos:
-
Seleccionamos nuestra foto de perfil -> Setttings -> SSH and GPG keys
-
Agregamos una nueva clave SSH en -> New SSH key
-
Pegamos la clave pública que copiamos anteriormente y le damos un nombre
title
: Título de la clave para identificar las llave SSH que creamos.key type
: Acá podemos elegir que tipo de llave es, si es Authentication Type significa que es la clave que vamos a usar para autenticarnos en el servidor, si es Signing Key significa que es para firmar tus commits y tags digitalmente. En este caso, seleccionamos Authentication type.key
: la clave SSH pública.
Crea un archivo de configuración y agrega los hosts
El ~/.ssh/config
es un archivo de texto plano que contiene configuraciones de los hosts a los que te conectas. En este archivo, puedes definir diferentes configuraciones para diferentes hosts. En nuestro caso, vamos a definir dos hosts, uno para nuestra cuenta personal y otro para nuestra cuenta de trabajo.
- Crea un archivo de configuración:
Ve al directorio ~/.ssh
: y edita el archivo config
. Si el archivo config
no existe, crea uno.
$ cd ~/.ssh
$ touch config
$ vim config
- Agrega las siguientes líneas al archivo, cada bloque corresponde a cada cuenta que creamos anteriormente:
# Cuenta personal
Host github-personalUsername
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal.pub
# Cuenta de trabajo
Host github-businessUsername
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_business.pub
Host
: Nombre de la conexión configuradaHostName
: IP-Hostname del servidor al que te conectasUser
: Usuario local del sistema.IdentityFile
: la ruta de llave SSH publica que usaremos para autenticarnos en el servidor.
- Prueba la conexión:
$ ssh -T git@github-personalUsername
Hi User! You've successfully authenticated, but GitHub does not provide shell access.
$ ssh -T git@github-businessUsername
Hi User! You've successfully authenticated, but GitHub does not provide shell access.
Clonar repositorios de GitHub usando diferentes cuentas
Ahora clonaremos un repositorio de GitHub utilizando una de las cuentas que hemos agregado. Dependiendo de la cuenta que desees usar (personal o de trabajo), deberás especificar la configuración adecuada en el archivo ~/.ssh/config
y utilizar la URL SSH correspondiente al clonar el repositorio.
# Clonar un repositorio desde la cuenta personal
$ git clone git@github-personalUsername:personalUsername/repo-name.git
# Clonar un repositorio desde la cuenta de trabajo
$ git clone git@github-businessUsername:businessUsername/repo-name.git
#Ejemplo:
git clone git@github.com-linustorvalds:linustorvalds/repository.git
Configurar hosts para repositorios existentes
Si ya cuentas con un repositorio clonado, solo necesitas configurar el nombre de usuario y correo para cada repositorio para hacer push o pull a la cuenta correcta.
- Configura el nombre de usuario y correo para cada repositorio:
Cambia la URL remota del repositorio para que utilice la clave SSH correcta. Esto asegura que las operaciones de push
y pull
se realicen con la cuenta adecuada.
# Repositorio personal
$ git remote set-url origin git@github-personalUsername:personalUsername/repo-name.git
# Repositorio de trabajo
$ git remote set-url origin git@github-businessUsername:businessUsername/repo-name.git
- Confirma que las conexiones SSH funcionan para cada repositorio:
Verifica que las URLs remotas se han configurado correctamente y que las conexiones SSH funcionan para cada repositorio.
# Repositorio personal
$ git remote -v
origin git@github-personalUsername:personalUsername/repo-name.git (fetch)
origin git@github-personalUsername:personalUsername/repo-name.git (push)
# Repositorio de trabajo
$ git remote -v
origin git@github-businessUsername:businessUsername/repo-name.git (fetch)
origin git@github-businessUsername:businessUsername/repo-name.git (push)
- Configura el nombre de usuario y correo para cada repositorio:
Establece el nombre de usuario y correo electrónico específicos para cada repositorio. Esto es importante para que los commits se registren con la información correcta.
# Cuenta personal
$ git config user.name "personalUsername"
$ git config user.email "personal@email.com"
# Cuenta de trabajo
$ git config user.name "businessUsername"
$ git config user.email "business@email.com"
Y como resultado final, tus repositorios estarán configurados para trabajar con diferentes cuentas de Git en una sola máquina.
Tu carpeta ~/.ssh
debería verse algo así:
├── .ssh/
│ ├── config # -> Config file
│ └── id_ed25519_personal
│ └── id_ed25519_business
│ └── id_ed25519_personal.pub
│ └── id_ed25519_business.pub
│ └── known_hosts # -> Hosts conectados
Gracias por leer! Pronto la guía usando .gitconfig por directorios.