Usare l'autenticazione con chiave SSH

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

Connessione ai repository Git tramite SSH in macOS, Linux o Windows connettersi in modo sicuro usando l'autenticazione HTTPS. In Windows è consigliabile usare Git Gestione credenziali Core o token di accesso personale.

Importante

Gli URL SSH sono stati modificati, ma gli URL SSH precedente continueranno a funzionare. Se SSH è già stato configurato, è necessario aggiornare gli URL remoti al nuovo formato:

  • Verificare quali computer remoti usano SSH eseguendo git remote -v nel client Git.
  • Visitare il repository sul Web e selezionare il pulsante Clone (Clona) in alto a destra.
  • Selezionare SSH e copiare il nuovo URL SSH.
  • Nel client Git eseguire: git remote set-url <remote name, e.g. origin> <new SSH URL> . In alternativa, in Visual Studio passare a Repository Impostazionie modificare i computer remoti.

Nota

A Visual Studio 2017, È possibile usare SSH per connettersi Azure DevOps repository Git.

Funzionamento dell'autenticazione con chiave SSH

L'autenticazione con chiave pubblica SSH funziona con una coppia asimmetrica di chiavi di crittografia generate. La chiave pubblica viene condivisa con Azure DevOps e usata per verificare la connessione SSH iniziale. La chiave privata viene mantenuta al sicuro nel sistema.

Configurare l'autenticazione con chiave SSH

La procedura seguente illustra la configurazione dell'autenticazione con chiave SSH nelle piattaforme seguenti:



Configurare SSH tramite la riga di comando. bashè la shell comune in Linux e macOS e l'installazione di Git per Windows aggiunge un collegamento a Git Bash nel menu Start. Altri ambienti shell funzioneranno, ma non sono trattati in questo articolo.

Passaggio 1: Creare le chiavi SSH

Nota

Se nel sistema sono già state create chiavi SSH, ignorare questo passaggio e passare alla configurazione delle chiavi SSH.

I comandi qui consentono di creare nuove chiavi SSH predefinite, sovrascrivendo le chiavi predefinite esistenti. Prima di continuare, controllare la cartella ,ad esempio ~/.ssh /home/jamal/.ssh o C:\Users\jamal .ssh, e cercare \ i file seguenti:

  • id_rsa
  • id_rsa.pub

Se questi file esistono, sono già state create chiavi SSH. È possibile sovrascrivere le chiavi con i comandi seguenti oppure ignorare questo passaggio e passare alla configurazione delle chiavi SSH per riutilizzare queste chiavi.

Creare le chiavi SSH con ssh-keygen il comando dal bash prompt. Questo comando creerà una chiave RSA a 3072 bit da usare con SSH. È possibile assegnare una passphrase per la chiave privata quando richiesto. Questa passphrase fornisce un altro livello di sicurezza — per la chiave privata. Se si assegna una passphrase, assicurarsi di configurare l'agente SSH per memorizzare nella cache la passphrase in modo che non sia necessario immetterla ogni volta che ci si connette.

$ 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]-----+

Questo comando produce le due chiavi necessarie per l'autenticazione SSH: la chiave privata ( id_rsa ) e la chiave pubblica ( id_rsa.pub ). È importante non condividere mai il contenuto della chiave privata. Se la chiave privata viene compromessa, gli utenti malintenzionati possono usarla per indurre i server a pensare che la connessione proviene dall'utente.

Passaggio 2: Aggiungere la chiave pubblica a Azure DevOps Services/TFS

Associare la chiave pubblica generata nel passaggio precedente all'ID utente.

  1. Aprire le impostazioni di sicurezza visitando il portale Web e selezionando l'avatar in alto a destra nell'interfaccia utente. Selezionare Chiavi pubbliche SSH nel menu visualizzato.

    Screenshot che mostra la voce di menu Chiavi pubbliche SSH e l'avatar dell'utente selezionato in Azure DevOps Services.

  2. Selezionare + Nuova chiave.

    Accesso alla configurazione di sicurezza in Azure DevOps Services

  3. Copiare il contenuto della chiave pubblica (ad esempio, id_rsa.pub) generata nel campo Dati chiave pubblica.

    Importante

    Evitare di aggiungere spazi vuoti o nuove righe nel campo Dati chiave, perché possono causare Azure DevOps Services'uso di una chiave pubblica non valida. Quando si incolla la chiave, alla fine viene spesso aggiunta una nuova riga. Assicurarsi di rimuovere questa nuova riga se si verifica.

    Configurazione della chiave pubblica in Azure DevOps Services

  4. Assegnare alla chiave una descrizione utile (questa descrizione verrà visualizzata nella pagina delle chiavi pubbliche SSH per il profilo) in modo che sia possibile ricordarla in un secondo momento. Selezionare Salva per archiviare la chiave pubblica. Dopo il salvataggio, non è possibile modificare la chiave. È possibile eliminare la chiave o creare una nuova voce per un'altra chiave. Non sono presenti restrizioni sul numero di chiavi che è possibile aggiungere al profilo utente. Si noti anche che le chiavi SSH archiviate Azure DevOps scadono dopo cinque anni. Se la chiave scade, è possibile caricare una nuova chiave o la stessa per continuare ad accedere Azure DevOps tramite SSH.

  5. Testare la connessione eseguendo il comando seguente: ssh -T git@ssh.dev.azure.com . Se tutto funziona correttamente, si riceverà una risposta che indica: In caso contrario, vedere la sezione Domande e risoluzione remote: Shell access is not supported. dei problemi.

Passaggio 2: Aggiungere la chiave pubblica a Azure DevOps

Associare la chiave pubblica generata nel passaggio precedente all'ID utente.

  1. Aprire le impostazioni di sicurezza visitando il portale Web e selezionando l'avatar in alto a destra nell'interfaccia utente. Selezionare Sicurezza nel menu visualizzato.

    Accesso al profilo utente in Azure DevOps Services

  2. Selezionare + Nuova chiave.

    Accesso alla configurazione di sicurezza in Azure DevOps Services

  3. Copiare il contenuto della chiave pubblica (ad esempio, id_rsa.pub) generata nel campo Dati chiave pubblica.

    Importante

    Evitare di aggiungere spazi vuoti o nuove righe nel campo Dati chiave, perché possono causare Azure DevOps Services'uso di una chiave pubblica non valida. Quando si incolla la chiave, alla fine viene spesso aggiunta una nuova riga. Assicurarsi di rimuovere questa nuova riga se si verifica.

    Configurazione della chiave pubblica in Azure DevOps Services

  4. Assegnare alla chiave una descrizione utile (questa descrizione verrà visualizzata nella pagina delle chiavi pubbliche SSH per il profilo) in modo che sia possibile ricordarla in un secondo momento. Selezionare Salva per archiviare la chiave pubblica. Dopo il salvataggio, non è possibile modificare la chiave. È possibile eliminare la chiave o creare una nuova voce per un'altra chiave. Non sono presenti restrizioni sul numero di chiavi che è possibile aggiungere al profilo utente.

  5. Testare la connessione eseguendo il comando seguente: ssh -T git@ssh.dev.azure.com . Se tutto funziona correttamente, si riceverà una risposta che indica: In caso contrario, vedere la sezione Domande e risoluzione remote: Shell access is not supported. dei problemi.

Passaggio 3: Clonare il repository Git con SSH

Nota

Per connettersi con SSH da un archivio clonato esistente, vedere Aggiornamento dei computer remoti a SSH.

  1. Copiare l'URL clone SSH dal portale Web. In questo esempio, l'URL clone SSL è per un repo in un'organizzazione denominata fabrikam-fiber, come indicato dalla prima parte dell'URL dopo dev.azure.com .

    Azure Repos SSH Clone URL

    Nota

    Project Gli URL sono stati modificati con la versione di Azure DevOps Services ora hanno il formato , ma è comunque possibile dev.azure.com/{your organization}/{your project} usare il formato visualstudio.com esistente. Per altre informazioni, vedere Visual Studio Team Services è ora Azure DevOps Services.

  2. Eseguire git clone dal prompt dei comandi.

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

SSH può visualizzare l'impronta digitale SSH del server e chiedere di verificarla. È necessario verificare che l'impronta digitale visualizzata corrisponda a una delle impronte digitali nella pagina delle chiavi pubbliche SSH.

SSH visualizza questa impronta digitale quando si connette a un host sconosciuto per proteggersi da attacchi man-in-the-middle. Dopo aver accettato l'impronta digitale dell'host, SSH non richiederà più l'conferma a meno che l'impronta digitale non venga modificata.

$ 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.

Quando viene chiesto se si vuole continuare la connessione, digitare yes . Git clona il repository e configura il repository remoto origin per la connessione con SSH per i comandi Git futuri.

Suggerimento

Per evitare problemi, Windows gli utenti devono eseguire un comando per fare in modo che Git riutilizzi la passphrase della chiave SSH.

Domande e risoluzione dei problemi

D: Dopo git clone l'esecuzione di , viene visualizzato l'errore seguente. Cosa devo fare?

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

A: Registrare manualmente la chiave SSH eseguendo: ssh-keyscan -t rsa domain.com >> ~/.ssh/known_hosts

D: Come è possibile fare in modo che Git ricordi la passphrase per la chiave in Windows?

A: Eseguire il comando seguente incluso in Git per Windows avviare il processo in PowerShell o Windows ssh-agent prompt dei comandi. ssh-agent memorizza nella cache la passphrase in modo che non sia necessario specificarla ogni volta che ci si connette al proprio repo.

start-ssh-agent.cmd

Se si usa la shell Bash (incluso Git Bash), avviare ssh-agent con:

eval `ssh-agent`

D: Uso PuTTY come client SSH e ho generato le chiavi con PuTTYgen. È possibile usare queste chiavi con Azure DevOps Services?

R: Sì. Caricare la chiave privata con PuTTYgen, passare al menu Conversioni e selezionare Esporta chiave OpenSSH. Salvare il file di chiave privata e quindi seguire la procedura per configurare chiavi non predefinite. Copiare la chiave pubblica direttamente dalla finestra PuTTYgen e incollarla nel campo Dati chiave nelle impostazioni di sicurezza.

D: Come è possibile verificare che la chiave pubblica caricata sia la stessa chiave disponibile in locale?

A: È possibile verificare l'impronta digitale della chiave pubblica caricata con quella visualizzata nel profilo tramite il comando seguente eseguito sulla chiave ssh-keygen pubblica tramite la riga di bash comando. Se non si usano le impostazioni predefinite, sarà necessario modificare il percorso e il nome file della chiave pubblica.

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

È quindi possibile confrontare la firma MD5 con quella nel profilo. Questo controllo è utile se si verificano problemi di connessione o si verificano problemi di incollamento errato della chiave pubblica nel campo Dati chiave quando si aggiunge la chiave Azure DevOps Services.

D: Come è possibile iniziare a usare SSH in un repository in cui attualmente si usa HTTPS?

A: È necessario aggiornare il dispositivo remoto in Git per passare da origin HTTPS a URL SSH. Dopo aver creato l'URL del clone SSH,eseguire il comando seguente:

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

È ora possibile eseguire qualsiasi comando Git che si connette a origin .

D: Si usa Git LFS con Azure DevOps Services e si verificano errori durante il pull dei file rilevati da Git LFS.

A: Azure DevOps Services attualmente non supporta LFS su SSH. Usare HTTPS per connettersi ai repository con i file tracciati di Git LFS.

D: Come è possibile usare un percorso di chiave non predefinito, ad esempio non ~/.ssh/id_rsa e ~/.ssh/id_rsa.pub?

A: Per usare le chiavi create ssh-keygen con in una posizione diversa da quella predefinita, eseguire queste due attività:

  1. Le chiavi devono essere in una cartella che solo l'utente può leggere o modificare. Se la cartella dispone di autorizzazioni più ampie, SSH non userà le chiavi.
  2. È necessario in modo che SSH sappia la posizione delle chiavi. Si rende SSH a conoscenza delle chiavi tramite il ssh-add comando , fornendo il percorso completo della chiave privata.
ssh-add /home/jamal/.ssh/id_jamal.rsa

In Windows, prima di eseguire , è necessario eseguire il comando seguente da ssh-add incluso in Git per Windows:

start-ssh-agent.cmd

Questo comando viene eseguito sia in PowerShell che nel prompt dei comandi. Se si usa Git Bash, il comando da usare è:

eval `ssh-agent`

È possibile trovare come parte di Git per la distribuzione Windows ed eseguirla anche in qualsiasi ambiente ssh-add della shell Windows.

Anche in macOS e Linux è necessario eseguire prima di eseguire , ma l'ambiente di comando in queste piattaforme in genere si occupa ssh-agent ssh-add ssh-agent dell'avvio.

D: Sono presenti più chiavi SSH. Ricerca per categorie usare chiavi SSH diverse per server O repository SSH diversi?

A: In genere, se si configurano più chiavi per un client SSH e ci si connette a un server SSH, il client può provare le chiavi una alla volta fino a quando il server non ne accetta una.

Tuttavia, questa operazione non funziona con Azure DevOps per motivi tecnici correlati al protocollo SSH e alla struttura degli URL SSH Git. Azure DevOps accetta la prima chiave fornita dal client durante l'autenticazione. Se la chiave non è valida per il repo richiesto, la richiesta avrà esito negativo con l'errore seguente:

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

Per Azure DevOps, è necessario configurare SSH per usare in modo esplicito un file di chiave specifico. Un modo per eseguire questa operazione per modificare il file , ad ~/.ssh/config esempio o , come indicato di /home/jamal/.ssh C:\Users\jamal\.ssh seguito:

# 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 *

D: Ricerca per categorie correggere gli errori che menzionano "Nessun metodo di scambio delle chiavi corrispondente trovato"?

A: Git per Windows 2.25.1 fornito con una nuova versione di OpenSSH che ha rimosso alcuni protocolli di scambio delle chiavi per impostazione predefinita. In particolare, è stato identificato come problematico per diffie-hellman-group14-sha1 alcuni Azure DevOps Server e TFS. È possibile risolvere il problema aggiungendo quanto segue alla configurazione SSH ( ~/.ssh/config ):

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

Sostituire <your-azure-devops-host> con il nome host del server Azure DevOps o TFS, ad esempio tfs.mycompany.com .

D: Quali notifiche è possibile ricevere sulle chiavi SSH?

A: Ogni volta che si registra una nuova chiave SSH con Azure DevOps Services, si riceverà una notifica tramite posta elettronica che informa che è stata aggiunta una nuova chiave SSH all'account.

Esempio di notifica SSH

D: Cosa si deve fare se si ritiene che un altro utente a cui si antessi le chiavi SSH nell'account?

A: Se si riceve una notifica della registrazione di una chiave SSH e non è stata caricata manualmente nel servizio, le credenziali potrebbero essere state compromesse.

Il passaggio successivo consiste nell'esaminare se la password è stata compromessa o meno. La modifica della password è sempre un buon primo passo per difendersi da questo vettore di attacco. Se si è un utente Azure Active Directory, contattare l'amministratore per verificare se l'account è stato usato da un'origine/posizione sconosciuta.

D: Cosa fare se viene ancora richiesta la password e viene GIT_SSH_COMMAND="ssh -v" git fetch visualizzato no mutual signature algorithm ?

A: Alcune distribuzioni Linux, ad esempio Fedora Linux, hanno criteri di crittografia che richiedono algoritmi di firma SSH più avanzati rispetto a Azure DevOps (a partire da gennaio 2021). È presente una richiesta di funzionalità aperta per aggiungere questo supporto.

È possibile risolvere il problema aggiungendo il codice seguente alla configurazione SSH ( ~/.ssh/config ):

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

Sostituire ssh.dev.azure.com con il nome host corretto se si usa Azure DevOps Server.