Uso de la autenticación de clave SSH


  • Linux
  • macOS que se ejecuta al menos En la versión 10.5
  • Windows sistemas que ejecutan Git para Windows

Configure SSH mediante la línea de comandos. bashes el shell común en Linux y macOS y git para la instalación Windows agrega un acceso directo a Git Bash en el menú Inicio. Otros entornos de shell funcionarán, pero no se tratan en este artículo.

Paso 1: Creación de las claves SSH

Nota

Si ya ha creado claves SSH en el sistema, omita este paso y vaya a configuración de claves SSH.

Los comandos que se describen aquí le permitirán crear nuevas claves SSH predeterminadas, sobrescribiendo las claves predeterminadas existentes. Antes de continuar, compruebe la carpeta ~/.ssh (por ejemplo, /home/jamal/.ssh o C:\Users\jamal\.ssh) y busque los siguientes archivos:

  • id_rsa
  • id_rsa.pub

Si estos archivos existen, ya ha creado claves SSH. Puede sobrescribir las claves con los siguientes comandos o omitir este paso e ir a configuración de claves SSH para reutilizar estas claves.

Cree las claves SSH con el ssh-keygen comando desde el símbolo del bash sistema. Este comando creará una clave RSA de 3072 bits para su uso con SSH. Puede proporcionar una frase de contraseña para la clave privada cuando se le solicite: esta frase de contraseña proporciona otra capa de seguridad para la clave privada. Si da una frase de contraseña, asegúrese de configurar el agente SSH para almacenar en caché la frase de contraseña para que no tenga que escribirla cada vez que se conecte.

$ ssh-keygen -C "jamal@fabrikam.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/jamal/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/jamal/.ssh/id_rsa.
Your public key has been saved in /c/Users/jamal/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:******************************************* jamal@fabrikam.com
The key's randomart image is:
+---[RSA 3072]----+
|+.   +yX*o .     |
|... ..E+*=o      |
|  ..o.=E=.o      |
|   . * =.o .     |
|    . S o o..    |
|       + .oo     |
|        S+.  .   |
|        ..+.+    |
|          o*..   |
+----[SHA256]-----+

Este comando genera las dos claves necesarias para la autenticación SSH: la clave privada ( id_rsa ) y la clave pública ( id_rsa.pub ). Es importante no compartir nunca el contenido de la clave privada. Si la clave privada está en peligro, los atacantes pueden usarla para hacer que los servidores piensen que la conexión viene de usted.

Paso 2: Agregar la clave pública a Azure DevOps Services/TFS

Asocie la clave pública generada en el paso anterior con el identificador de usuario.

  1. Para abrir la configuración de seguridad, vaya al portal web y seleccione su avatar en la esquina superior derecha de la interfaz de usuario. Seleccione Claves públicas SSH en el menú que aparece.

    Captura de pantalla que muestra el elemento de menú Claves públicas SSH y el avatar del usuario seleccionado en Azure DevOps Services.

  2. Seleccione + Nueva clave.

    Acceso a la configuración de seguridad en Azure DevOps Services

  3. Copie el contenido de la clave pública (por ejemplo, id_rsa.pub) que generó en el campo Datos de clave pública.

    Importante

    Evite agregar espacios en blanco o nuevas líneas al campo Datos clave, ya que pueden hacer que Azure DevOps Services usar una clave pública no válida. Al pegar en la clave, a menudo se agrega una nueva línea al final. Asegúrese de quitar esta nueva línea si se produce.

    Configuración de la clave pública en Azure DevOps Services

  4. Dé a la clave una descripción útil (esta descripción se mostrará en la página claves públicas SSH del perfil) para que pueda recordarla más adelante. Seleccione Guardar para almacenar la clave pública. Una vez guardado, no se puede cambiar la clave. Puede eliminar la clave o crear una nueva entrada para otra clave. No hay ninguna restricción en el número de claves que puede agregar a su perfil de usuario. Tenga en cuenta también que las claves SSH almacenadas en Azure DevOps expiran después de cinco años. Si la clave expira, puede cargar una nueva clave o la misma para seguir accediendo a Azure DevOps a través de SSH.

  5. Ejecute el siguiente comando para probar la conexión: ssh -T git@ssh.dev.azure.com . Si todo funciona correctamente, recibirá una respuesta que indica: Si no es así, consulte la sección preguntas y solución remote: Shell access is not supported.remote: Shell access is not supported.

Paso 2: Agregar la clave pública a Azure DevOps

Asocie la clave pública generada en el paso anterior con el identificador de usuario.

  1. Para abrir la configuración de seguridad, vaya al portal web y seleccione su avatar en la esquina superior derecha de la interfaz de usuario. Seleccione Seguridad en el menú que aparece.

    Acceso al perfil de usuario en Azure DevOps Services

  2. Seleccione + Nueva clave.

    Acceso a la configuración de seguridad en Azure DevOps Services

  3. Copie el contenido de la clave pública (por ejemplo, id_rsa.pub) que generó en el campo Datos de clave pública.

    Importante

    Evite agregar espacios en blanco o nuevas líneas al campo Datos clave, ya que pueden hacer que Azure DevOps Services usar una clave pública no válida. Al pegar en la clave, a menudo se agrega una nueva línea al final. Asegúrese de quitar esta nueva línea si se produce.

    Configuración de la clave pública en Azure DevOps Services

  4. Dé a la clave una descripción útil (esta descripción se mostrará en la página claves públicas SSH del perfil) para que pueda recordarla más adelante. Seleccione Guardar para almacenar la clave pública. Una vez guardado, no se puede cambiar la clave. Puede eliminar la clave o crear una nueva entrada para otra clave. No hay ninguna restricción en el número de claves que puede agregar a su perfil de usuario.

  5. Ejecute el siguiente comando para probar la conexión: ssh -T git@ssh.dev.azure.com . Si todo funciona correctamente, recibirá una respuesta que indica: Si no es así, consulte la sección preguntas y solución remote: Shell access is not supported.remote: Shell access is not supported.

Paso 3: Clonación del repositorio de Git con SSH

Nota

Para conectarse con SSH desde un repositorio clonado existente, consulte actualización de los remotos a SSH.

  1. Copie la dirección URL de clonación de SSH desde el portal web. En este ejemplo, la dirección URL de clonación DE SSL es para un repositorio de una organización denominada fabrikam-fiber, como se indica en la primera parte de la dirección URL después de .

    Azure Repos URL de clonación de SSH

    Nota

    Project las direcciones URL han cambiado con la versión de Azure DevOps Services y ahora tienen el formato , pero todavía puede dev.azure.com/{your organization}/{your project} usar el formato visualstudio.com existente. Para obtener más información, vea Visual Studio Team Services está Azure DevOps Services.

  2. Ejecute git clone desde el símbolo del sistema.

    git clone git@ssh.dev.azure.com:v3/fabrikam-fiber/FabrikamFiber/FabrikamFiber
    

Puede que SSH muestre la huella digital de SSH del servidor y le pida que la verifique. Debe comprobar que la huella digital mostrada coincide con una de las huellas digitales de la página claves públicas SSH.

SSH muestra esta huella digital cuando se conecta a un host desconocido para protegerle de ataques de tipo "Man in the Middle". Una vez que acepte la huella digital del host, SSH no volverá a pedírsela a menos que la cambie.

$ git clone git@ssh.dev.azure.com:v3/fabrikam-fiber/FabrikamFiber/FabrikamFiber
Cloning into 'FabrikamFiber'...
The authenticity of host 'ssh.dev.azure.com (65.52.8.37)' can't be established.
RSA key fingerprint is SHA256:********************************************
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ssh.dev.azure.com,65.52.8.37' (RSA) to the list of known hosts.
Enter passphrase for key '/c/Users/jamal/.ssh/id_rsa':
remote: Azure Repos
remote: Found 127 objects to send. (50 ms)
Receiving objects: 100% (127/127), 56.67 KiB | 2.58 MiB/s, done.
Resolving deltas: 100% (15/15), done.

Cuando se le pregunte si quiere continuar con la conexión, escriba yes. Git clonará el repositorio y configurará el origin remoto para conectarse con SSH para futuros comandos de Git.

Sugerencia

Para evitar problemas, los Windows deben ejecutar un comando para que Git reutilice su frase de contraseña de clave SSH.

Preguntas y solución de problemas

P: Después de ejecutar git clone , aparece el siguiente error. ¿Cuál debo hacer?

Host key verification failed. 
fatal: Could not read from remote repository.

Un: Registre manualmente la clave SSH mediante la ejecución de:

P: ¿Cómo puedo hacer que Git recuerde la frase de contraseña de mi clave en Windows?

Un: Ejecute el siguiente comando incluido en Git Windows para iniciar el proceso en PowerShell o en el Windows de comandos. ssh-agent almacenará en caché la frase de contraseña para que no tenga que proporcionarla cada vez que se conecte al repositorio.

start-ssh-agent.cmd

Si usa el shell de Bash (incluido Git Bash), inicie ssh-agent con:

eval `ssh-agent`

P: Uso PuTTY como cliente SSH y generó mis claves con PuTTYgen. ¿Puedo usar estas claves con Azure DevOps Services?

R: Sí. Cargue la clave privada con PuTTYgen, vaya al menú Conversiones y seleccione Exportar clave OpenSSH. Guarde el archivo de clave privada y, a continuación, siga los pasos para configurar claves no predeterminadas. Copie la clave pública directamente desde la ventana PuTTYgen y péguela en el campo Datos de clave de la configuración de seguridad.

P: ¿Cómo puedo comprobar que la clave pública que he cargado es la misma clave que tengo localmente?

Un: Puede comprobar la huella digital de la clave pública cargada con la que se muestra en el perfil mediante el siguiente comando que se ejecuta en la clave pública mediante la línea de bash comandos. Tendrá que cambiar la ruta de acceso y el nombre de archivo de clave pública si no usa los valores predeterminados.

ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub

A continuación, puede comparar la firma MD5 con la de su perfil. Esta comprobación es útil si tiene problemas de conexión o le preocupa pegar incorrectamente la clave pública en el campo Datos de clave al agregar la clave a Azure DevOps Services.

P: ¿Cómo puedo empezar a usar SSH en un repositorio donde actualmente uso HTTPS?

Un: Tendrá que actualizar el remoto en Git para cambiar de una dirección URL https a SSH. Una vez que tenga la dirección URL de clonación de SSH,ejecute el siguiente comando:

git remote set-url origin git@ssh.dev.azure.com:v3/fabrikam-fiber/FabrikamFiber/FabrikamFiber

Ahora puede ejecutar cualquier comando de Git que se conecte a origin .

P: Uso Git LFS con Azure DevOps Services y se producen errores al extraer archivos de los que git LFS realiza un seguimiento.

A: Azure DevOps Services actualmente no admite LFS a través de SSH. Use HTTPS para conectarse a repositorios con archivos de seguimiento de Git LFS.

P: ¿Cómo puedo usar una ubicación de clave no predeterminada, es decir, no ~/.ssh/id_rsa y ~/.ssh/id_rsa.pub?

Un: Para usar claves creadas con en un lugar diferente al predeterminado, realice estas dos tareas:

  1. Las claves deben estar en una carpeta que solo pueda leer o editar. Si la carpeta tiene permisos más amplios, SSH no usará las claves.
  2. Debe dejar que SSH sepa la ubicación de las claves. Puede hacer que SSH tenga en cuenta las claves a través ssh-add del comando, proporcionando la ruta de acceso completa a la clave privada.
ssh-add /home/jamal/.ssh/id_jamal.rsa

En Windows, antes de ejecutar , deberá ejecutar el siguiente comando desde ssh-add incluido en Git para Windows:

start-ssh-agent.cmd

Este comando se ejecuta en PowerShell y en el símbolo del sistema. Si usa Git Bash, el comando que debe usar es:

eval `ssh-agent`

Puede encontrar como parte de Git para la distribución Windows y ejecutarlo también en ssh-add cualquier entorno de shell en Windows.

En macOS y Linux también debe tener la ejecución antes de ejecutar , pero el entorno de comandos en estas plataformas normalmente se encarga de ssh-agentssh-add empezar por ssh-agent usted.

P: Tengo varias claves SSH. Cómo usar claves SSH diferentes para diferentes servidores SSH o repositorios?

Un: Por lo general, si configura varias claves para un cliente SSH y se conecta a un servidor SSH, el cliente puede probar las claves de una en una hasta que el servidor acepte una.

Sin embargo, esto no funciona con Azure DevOps por motivos técnicos relacionados con el protocolo SSH y cómo se estructuran nuestras direcciones URL de SSH de Git. Azure DevOps aceptará a la vista la primera clave que el cliente proporciona durante la autenticación. Si esa clave no es válida para el repositorio solicitado, la solicitud producirá el siguiente error:

remote: Public key authentication failed.
fatal: Could not read from remote repository.

Por Azure DevOps, deberá configurar SSH para usar explícitamente un archivo de clave específico. Una manera de hacerlo es editar el ~/.ssh/config archivo (por ejemplo, /home/jamal/.ssh o ) como se muestra a C:\Users\jamal\.ssh continuación:

# The settings in each Host section are applied to any Git SSH remote URL with a
# matching hostname.
# Generally:
# * SSH uses the first matching line for each parameter name, e.g. if there's
#   multiple values for a parameter across multiple matching Host sections
# * "IdentitiesOnly yes" prevents keys cached in ssh-agent from being tried before
#   the IdentityFile values we explicitly set.
# * On Windows, ~/.ssh/your_private_key maps to %USERPROFILE%\.ssh\your_private_key,
#   e.g. C:\Users\<username>\.ssh\your_private_key.

# Most common scenario: to use the same key across all hosted Azure DevOps
# organizations, add a Host entry like this:
Host ssh.dev.azure.com
  IdentityFile ~/.ssh/your_private_key
  IdentitiesOnly yes

# This model will also work if you still use the older SSH URLs with a
# hostname of vs-ssh.visualstudio.com:
Host vs-ssh.visualstudio.com
  IdentityFile ~/.ssh/your_private_key
  IdentitiesOnly yes

# Less common scenario: if you need different keys for different organizations,
# you'll need to use host aliases to create separate Host sections.
# This is because all hosted Azure DevOps URLs have the same hostname
# (ssh.dev.azure.com), so SSH has no way to distinguish them by default.
#
# Imagine that we have the following two SSH URLs:
# * git@ssh.dev.azure.com:v3/Fabrikam/Project1/fab_repo
#   * For this, we want to use `fabrikamkey`, so we'll create `devops_fabrikam` as
#     a Host alias and tell SSH to use `fabrikamkey`.
# * git@ssh.dev.azure.com:v3/Contoso/Project2/con_repo
#   * For this, we want to use `contosokey`, so we'll create `devops_contoso` as
#     a Host alias and tell SSH to use `contosokey`.
#
# To set explicit keys for the two host aliases and to tell SSH to use the correct
# actual hostname, add the next two Host sections:
Host devops_fabrikam
  HostName ssh.dev.azure.com
  IdentityFile ~/.ssh/private_key_for_fabrikam
  IdentitiesOnly yes
Host devops_contoso
  HostName ssh.dev.azure.com
  IdentityFile ~/.ssh/private_key_for_contoso
  IdentitiesOnly yes
#
# Then, instead of using the real URLs, tell Git you want to use these URLs:
# * git@devops_fabrikam:v3/Fabrikam/Project1/fab_repo
# * git@devops_contoso:v3/Contoso/Project2/con_repo
#

# At the end of the file, you can put global defaults for other SSH hosts you
# may connect to.  Note that "*" also matches any hosts that match the sections
# above, and remember that SSH uses the first matching line for each parameter name.
Host *
# The settings in each Host section are applied to any Git SSH remote URL with a
# matching hostname.
# Generally:
# * SSH uses the first matching line for each parameter name, e.g. if there's
#   multiple values for a parameter across multiple matching Host sections
# * "IdentitiesOnly yes" prevents keys cached in ssh-agent from being tried before
#   the IdentityFile values we explicitly set.
# * On Windows, ~/.ssh/your_private_key maps to %USERPROFILE%\.ssh\your_private_key,
#   e.g. C:\Users\<username>\.ssh\your_private_key.

# Say your on-premises Azure DevOps Server instance has SSH URLs like this:
#   ssh://someHost:22/someCollection/some_project/_git/some_repo
# Add the following Host section:
Host someHost
  IdentityFile ~/.ssh/your_private_key
  IdentitiesOnly yes

# At the end of the file, you can put global defaults for other SSH hosts you
# may connect to.  Note that "*" also matches any hosts that match the sections
# above, and remember that SSH uses the first matching line for each parameter name.
Host *

P: Cómo errores que mencionan "no se encontró ningún método de intercambio de claves correspondiente"?

Un: Git para Windows 2.25.1 incluido con una nueva versión de OpenSSH que quitó algunos protocolos de intercambio de claves de forma predeterminada. En concreto, se ha identificado como problemático para diffie-hellman-group14-sha1 algunos clientes Azure DevOps Server y TFS. Puede solucionar el problema agregando lo siguiente a la configuración de SSH ( ~/.ssh/config ):

Host <your-azure-devops-host>
    KexAlgorithms +diffie-hellman-group14-sha1

Reemplace <your-azure-devops-host> por el nombre de host del servidor Azure DevOps o TFS, como tfs.mycompany.com .

P: ¿Qué notificaciones puedo recibir sobre mis claves SSH?

Un: Cada vez que registre una nueva clave SSH con Azure DevOps Services, recibirá una notificación por correo electrónico en la que se le informará de que se ha agregado una nueva clave SSH a su cuenta.

Ejemplo de notificación SSH

P: ¿Qué debo hacer si creo que alguien distinto de mí está agregando claves SSH en mi cuenta?

Un: Si recibe una notificación de que se está registrando una clave SSH y no la ha cargado manualmente en el servicio, es posible que sus credenciales se hayan puesto en peligro.

El siguiente paso sería investigar si la contraseña se ha puesto en peligro o no. Cambiar la contraseña siempre es un buen primer paso para defenderse contra este vector de ataque. Si es un usuario Azure Active Directory, hable con el administrador para comprobar si la cuenta se usó desde un origen o ubicación desconocidos.

P: ¿Qué debo hacer si todavía se me pide mi contraseña y GIT_SSH_COMMAND="ssh -v" git fetch se muestra no mutual signature algorithm ?

Un: Algunas distribuciones de Linux, como Fedora Linux, tienen directivas de cifrado que requieren algoritmos de firma SSH más seguros de los que Azure DevOps admite (a partir de enero de 2021). Hay una solicitud de característica abierta para agregar esta compatibilidad.

Puede evitar el problema agregando el código siguiente a la configuración de SSH ( ~/.ssh/config ):

Host ssh.dev.azure.com
  PubkeyAcceptedKeyTypes=ssh-rsa

Reemplace ssh.dev.azure.com por el nombre de host correcto si usa Azure DevOps Server.

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018 - TFS 2015

Conectar a los repositorios de Git a través de SSH en macOS, Linux o Windows para conectarse de forma segura mediante la autenticación HTTPS. En Windows, se recomienda el uso de Git Administrador de credenciales Core o Tokens de acceso personal.

Importante

Las direcciones URL de SSH han cambiado, pero las direcciones URL de SSH antiguas seguirán funcionando. Si ya ha configurado SSH, debe actualizar las direcciones URL remotas al nuevo formato:

  • Compruebe qué remotos usan SSH mediante la ejecución git remote -v en el cliente de Git.
  • Visite el repositorio en la web y seleccione el botón Clonar en la esquina superior derecha.
  • Seleccione SSH y copie la nueva dirección URL de SSH.
  • En el cliente de Git, ejecute: git remote set-url <remote name, e.g. origin> <new SSH URL> . Como alternativa, en Visual Studio, vaya a Repositorio Configuracióny edite los remotos.

Nota

A partir Visual Studio 2017, SSH se puede usar para conectarse a Azure DevOps repositorios de Git.

Funcionamiento de la autenticación de claves SSH

La autenticación de clave pública SSH funciona con un par asimétrico de claves de cifrado generadas. La clave pública se comparte con Azure DevOps y se usa para comprobar la conexión SSH inicial. La clave privada se mantiene segura y segura en el sistema.

Configuración de la autenticación de clave SSH

Los pasos siguientes cubren la configuración de la autenticación de clave SSH en las plataformas siguientes: