Utilizar a autenticação de chaves SSH

Azure DevOps Serviços | Azure DevOps Server | Azure DevOps Server 2022

Pode ligar-se aos seus repositórios Git através de SSH no macOS, Linux ou Windows para se ligar de forma segura ao Azure DevOps.

Importante

Os URLs SSH foram alterados, mas os URLs SSH antigos continuam a funcionar. Se você já configurou o SSH, atualize suas URLs remotas para o novo formato:

Os URLs SSH atualizados começam com ssh.dev.azure.com. Os URLs anteriores usam vs-ssh.visualstudio.como .

  • Verifique quais controles remotos estão usando SSH. Execute git remote -v em seu shell ou use um cliente GUI.
  • Visite seu repositório na Web e selecione Clone.
  • Selecione SSH e copie o novo URL SSH.
  • Em seu shell, execute git remote set-url <remote name> <new SSH URL> para cada controle remoto de um repositório que você deseja atualizar. Como alternativa, use um cliente GUI para atualizar as URLs remotas.

Pré-requisitos

Categoria Requerimentos
Permissões Acesso para clonar o repositório
Políticas Autenticação SSH habilitada

Como funciona a autenticação de chave SSH

A autenticação de chave pública SSH funciona com um par assimétrico de chaves de criptografia geradas. A chave public é partilhada com o Azure DevOps e usada para verificar a ligação SSH inicial. A chave privada é mantida segura e protegida no seu sistema.

Configurar a autenticação de chave SSH

As etapas a seguir abrangem a configuração da autenticação de chave SSH nas seguintes plataformas usando a linha de comando (também chamada de shell):

Gorjeta

No Windows, recomendamos o uso do Git Credential Manager em vez de SSH.

Passo 1: Crie as suas chaves SSH

Nota

Se já criou chaves RSA SSH no seu sistema, ignore este passo e configure as suas chaves SSH. Para verificar isto, vai ao teu diretório pessoal e consulta a pasta .ssh (%UserProfile%\.ssh\ no Windows ou ~/.ssh/ no Linux, macOS e Windows com Git Bash). Se você vir dois arquivos nomeados id_rsa e id_rsa.pub respectivamente, continue com a configuração de suas chaves SSH.

Para usar a autenticação baseada em chave, primeiro você precisa gerar pares de chaves pública/privada para seu cliente. ssh-keygen.exe é usado para gerar arquivos de chave e os algoritmos DSA, RSA, ECDSA ou Ed25519 podem ser especificados. Se nenhum algoritmo for especificado, Ed25519 será usado.

Nota

O único tipo de chave SSH suportado por Azure DevOps é RSA.

Para gerar ficheiros-chave usando o algoritmo RSA suportado pela Azure DevOps (seja RSA-SHA2-256 ou RSA-SHA2-512), execute um dos seguintes comandos a partir de uma PowerShell ou outra shell, como bash no seu cliente:

ssh-keygen -t rsa-sha2-256

Ou

ssh-keygen -t rsa-sha2-512

A saída do comando deve exibir a seguinte saída (onde username é o seu nome de usuário):

Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_rsa):

Você pode pressionar Enter para aceitar o padrão ou especificar um caminho e/ou nome de arquivo onde você gostaria que suas chaves fossem geradas. Neste ponto, você será solicitado a usar uma frase secreta para criptografar seus arquivos de chave privada. A frase secreta pode estar vazia, mas não é recomendada. A senha funciona com o arquivo de chave para fornecer autenticação de dois fatores.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username/.ssh/id_rsa.
Your public key has been saved in C:\Users\username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:FHK6WjcUkcfQjdorarzlak1Ob/x7AmqQmmx5ryYYV+8 username@LOCAL-HOSTNAME
The key's randomart image is:
+---[RSA 3072]----+
|      . ** o     |
|       +.o= .    |
|      . o+       |
|      .+. .      |
|     .ooS  .     |
|  . .oo.=.o      |
|   =.= O.= .     |
|  . B BoE + . .  |
|   . *+*o. .o+   |
+----[SHA256]-----+

Agora você tem um par de chaves RSA público/privado no local especificado. Os arquivos .pub são chaves públicas, e arquivos sem extensão são chaves privadas:

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        10/11/2022   6:29 PM           2610 id_rsa
-a----        10/11/2022   6:29 PM            578 id_rsa.pub

Importante

Nunca partilhe o conteúdo da sua chave privada. Se a chave privada estiver comprometida, os atacantes podem usá-la para enganar os servidores e fazê-los pensar que a conexão está vindo de você. Os ficheiros de chave privada são o equivalente a uma palavra-passe e devem ser protegidos da mesma forma.

Passo 2: Adicionar a chave pública ao Azure DevOps

Associe a chave pública gerada na etapa anterior ao seu ID de usuário.

Nota

Você tem que repetir essa operação para cada organização que você tem acesso e deseja usar SSH com.

  1. Abra suas configurações de segurança navegando até o portal da Web e selecionando o ícone ao lado do avatar no canto superior direito da interface do usuário. Selecione chaves públicas SSH no menu que aparece.

    Captura de ecrã que mostra o elemento do menu de chaves públicas SSH e o avatar do utilizador selecionado em Azure DevOps.

  2. Selecione + Nova Chave.

    Captura de ecrã a mostrar acesso à Configuração de Segurança em Azure DevOps.

  3. Copie o conteúdo da chave pública (por exemplo, id_rsa.pub) gerada para o campo Dados de Chave Pública .

    Importante

    Evite adicionar espaços em branco ou novas linhas no campo Key Data, pois podem fazer com que Azure DevOps use uma chave pública inválida. Ao colar a chave, uma nova linha geralmente é adicionada no final. Certifique-se de remover esta nova linha se ela ocorrer.

    Captura de ecrã a mostrar a configuração de uma chave pública em Azure DevOps.

  4. Dê à chave uma descrição útil (esta descrição é exibida na página de chaves públicas SSH do seu perfil) para que você possa lembrá-la mais tarde. Selecione Salvar para armazenar a chave pública. Uma vez salvo, você não pode alterar a chave. Você pode excluir a chave ou criar uma nova entrada para outra chave. Não há restrições sobre quantas chaves você pode adicionar ao seu perfil de usuário.

    Nota

    As chaves SSH armazenadas no Azure DevOps expiram após um ano, a menos que a política a nível da organização tenha sido definida. Para obter mais informações, consulte Alterar conexão de aplicativo & políticas de segurança para sua organização.

  5. Na página de visão geral de Chaves Públicas SSH, as impressões digitais do servidor são exibidas. Anote a impressão digital SHA256 para utilizar quando se ligar ao Azure DevOps via SSH.

    Captura de ecrã do acesso à configuração de segurança no Azure DevOps Services.

  6. Teste a conexão executando o seguinte comando:

    ssh -T git@ssh.dev.azure.com
    

    Se você estiver se conectando pela primeira vez, deverá receber a seguinte saída:

    The authenticity of host 'ssh.dev.azure.com (<IP>)' can't be established.
    RSA key fingerprint is SHA256:ohD8VZEXGWo6Ez8GSEJQ9WpafgLFsOfLOtGGQCQo6Og.
    This key is not known by any other names
    Are you sure you want to continue connecting (yes/no/[fingerprint])?
    

    Compare a impressão digital com a impressão digital SHA256 exibida na página de Chaves Públicas SSH mencionada anteriormente. Prossiga apenas se coincidirem!

  7. Entre yes para continuar. Se tudo estiver configurado corretamente, a saída deverá ter esta aparência:

     Warning: Permanently added 'ssh.dev.azure.com' (RSA) to the list of known hosts.
     remote: Shell access is not supported.
     shell request failed on channel 0
    

    Caso contrário, consulte a secção Perguntas e resolução de problemas.

Etapa 3: clonar o repositório Git com SSH

Nota

Para usar SSH com um repositório previamente clonado via HTTPS, consulte Atualizar seus controles remotos para SSH.

  1. Copie a URL de clonagem SSH do portal web. Neste exemplo, a URL de clone SSH é para um repositório em uma organização chamada fabrikam-fiber, conforme indicado pela primeira parte da URL após dev.azure.com.

    Captura de ecrã a mostrar Azure Repos URL clonada por SSH.

    Nota

    Com Azure DevOps Services, o formato da URL do projeto é dev.azure.com/{your organization}/{your project}. No entanto, o formato anterior que faz referência ao visualstudio.com formato ainda é suportado. Para mais informações, consulte Apresentando o Azure DevOps, Mudar as organizações existentes para usarem o novo URL do nome de domínio.

  2. Execute git clone a partir do prompt de comando.

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

    Se não estiver a utilizar um Agente SSH, ser-lhe-á pedido que introduza a sua frase secreta:

    Cloning into 'FabrikamFiber'...
    Enter passphrase for key '/c/Users/username/.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.
    

    Se, em vez disso, lhe pedirem para verificar uma impressão digital, leia Passo 2: Adicionar a chave pública ao Azure DevOps novamente. Para outros problemas, leia a seção Perguntas e solução de problemas.

Gorjeta

Para aproveitar ao máximo o SSH, é comum usar um Agente SSH para gerenciar sua(s) chave(s) SSH. No entanto, a criação de um agente está além do escopo deste artigo.

Perguntas e solução de problemas

P: A minha chave SSH expirou, o que devo fazer?

Um: O curso de ação recomendado é seguir as etapas acima para criar e carregar uma nova chave SSH.

Como opção alternativa, um Administrador da Coleção Project pode desativar a política que valida a data de expiração da chave SSH. Por padrão, a política de validação da expiração de chave SSH está habilitada. Para obter mais informações, consulte Políticas de chave SSH.

Você recebe automaticamente uma notificação 7 dias antes e quando sua chave expirar. Juntamente com estas notificações, verá também a mensagem abaixo:

remote: Authentication failed: your SSH key has expired. To restore access, visit https://aka.ms/ado-ssh-public-key-expired for guidance.
remote: Public key authentication failed.
fatal:  Could not read from remote repository.

A: Existem duas mensagens de aviso diferentes que podem ver:

ssh-rsa is about to be deprecated and your request has been throttled. Please use rsa-sha2-256 or rsa-sha2-512 instead. Your session will continue automatically. For more details see https://devblogs.microsoft.com/devops/ssh-rsa-deprecation.

Ou

You’re using ssh-rsa that is about to be deprecated and your request has been blocked intentionally. Any SSH session using ssh-rsa is subject to brown out (failure during random time periods). Please use rsa-sha2-256 or rsa-sha2-512 instead. For more details see https://devblogs.microsoft.com/devops/ssh-rsa-deprecation.

Se modificaste a tua configuração SSH para rebaixar as definições de segurança para Azure DevOps adicionando o seguinte ao teu ficheiro ~/.ssh/config (%UserProfile%\.ssh\config em Windows):

Host ssh.dev.azure.com vs-ssh.visualstudio.com
  HostkeyAlgorithms +ssh-rsa

Remova essas linhas agora e certifique-se de que rsa-sha2-256 e/ou rsa-sha2-512 são permitidas.

Para mais informações, veja a mensagem do blogue.

P: O SSH não consegue estabelecer uma ligação. O que devo fazer?

R: Existem vários problemas diferentes que você pode enfrentar:

  • Uso de ssh-rsa sem suporte

    You’re using ssh-rsa that is unsupported. Please use rsa-sha2-256 or rsa-sha2-512 instead. For more details see https://devblogs.microsoft.com/devops/ssh-rsa-deprecation.
    

    Se modificaste a tua configuração SSH para rebaixar as definições de segurança para Azure DevOps adicionando o seguinte ao teu ficheiro ~/.ssh/config (%UserProfile%\.ssh\config em Windows):

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       HostkeyAlgorithms +ssh-rsa
    

    Remova essas linhas agora e certifique-se de que rsa-sha2-256 e/ou rsa-sha2-512 são permitidas.

    Para mais informações, veja a mensagem do blogue.

  • Nenhuma chave de host correspondente

    Este problema não deve acontecer no Azure DevOps Serviço nem em versões Azure DevOps Server mais recentes, como mencionado no artigo blog.

    Unable to negotiate with <IP> port 22: no matching host key type found. Their offer: ssh-rsa
    

    Modifique a sua configuração SSH para reduzir as definições de segurança para o Azure DevOps adicionando o seguinte ao seu ficheiro ~/.ssh/config (%UserProfile%\.ssh\config em Windows):

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       HostkeyAlgorithms +ssh-rsa
    

    Importante

    O OpenSSH substituiu o algoritmo de assinatura de ssh-rsa chave pública na versão 8.2 e o desabilitou por padrão na versão 8.8.

  • Sem MAC correspondente

    Unable to negotiate with <IP> port 22: no matching MAC found. Their offer: hmac-sha2-256,hmac-sha2-512
    

    Modifique a sua configuração SSH para reduzir as definições de segurança para o Azure DevOps adicionando o seguinte ao seu ficheiro ~/.ssh/config (%UserProfile%\.ssh\config em Windows):

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       MACs +hmac-sha2-512,+hmac-sha2-256
    
  • Nenhum método de troca de chaves correspondente

    Unable to negotiate with <IP> 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256
    

    Modifique a sua configuração SSH para reduzir as definições de segurança para o Azure DevOps adicionando o seguinte ao seu ficheiro ~/.ssh/config (%UserProfile%\.ssh\config em Windows):

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       KexAlgorithms +diffie-hellman-group-exchange-sha256,+diffie-hellman-group14-sha1,+diffie-hellman-group1-sha1
    

    Importante

    O algoritmo diffie-hellman-group1-sha1 de troca de chaves foi desativado por padrão na versão 6.9 do OpenSSH e diffie-hellman-group14-sha1 na versão 8.2.

Gorjeta

Para instâncias auto-hospedadas de Azure DevOps Server e TFS, use o nome de host apropriado na linha Host em vez de ssh.dev.azure.com vs-ssh.visualstudio.com.

P: Como posso fazer com que o Git se lembre da senha da minha chave?

R: Você pode usar um Agente SSH. Linux, macOS e Windows (a partir de Windows 10 (build 1809) ou usando Git para Windows com Git Bash) são todos fornecidos com um Agente SSH. O Agente SSH pode ser usado para armazenar em cache suas chaves SSH para uso repetido. Consulte o manual do seu fornecedor de SSH para obter detalhes sobre como usá-lo.

P: Eu uso o PuTTY como meu cliente SSH e gerei minhas chaves com o PuTTYgen. Posso usar estas chaves com o Azure DevOps Services?

R: Sim. Carregue a chave privada com PuTTYgen, vá para o menu Conversões e selecione Exportar chave OpenSSH. Salve o arquivo de chave privada e siga as etapas para configurar chaves não padrão. Copie a sua chave pública diretamente da janela PuTTYgen e cole no campo Dados da chave nas suas configurações de segurança.

P: Como posso verificar se a chave pública que carreguei é a mesma chave que a minha chave local?

R: Pode verificar a impressão digital da chave pública carregada com a apresentada no seu perfil através do seguinte comando ssh-keygen executado sobre a sua chave pública utilizando a linha de comando. Você precisa alterar o caminho e o nome do arquivo de chave pública se não estiver usando os padrões.

Nota

A partir de agosto/setembro de 2024, estamos migrando de hashes MD5 para SHA-256. Pode ser necessário escolher a função correta durante o período de transição.

ssh-keygen -l -E md5 -f <path_to_your_public_key> -- use this for MD5 fingerprints
ssh-keygen -l -E sha256 -f <path_to_your_public_key> -- use this for SHA-256 fingerprints

Em seguida, você pode comparar a assinatura com a do seu perfil. Esta verificação é útil se tiver problemas de ligação ou se tiver preocupações em colar incorretamente a chave pública no campo Key Data ao adicionar a chave à Azure DevOps.

P: Como posso começar a usar SSH em um repositório onde estou usando HTTPS atualmente?

R: Você precisa atualizar o origin controle remoto no Git para mudar de um URL HTTPS para SSH. Depois de ter a URL de clonagem SSH, execute o seguinte comando:

git remote set-url origin <SSH URL to your repository>

Os comandos do Git que acessam o controle remoto chamado origin usam SSH.

P: Estou a usar o Git LFS com o Azure DevOps Services e recebo erros ao puxar ficheiros rastreados pelo Git LFS.

A: Azure DevOps Services atualmente não suporta LFS via SSH. Use HTTPS para se conectar aos repositórios com ficheiros rastreados pelo Git LFS.

P: Como posso usar um local de chave não padrão, ou seja, não ~/.ssh/id_rsa e ~/.ssh/id_rsa.pub?

R: Para usar uma chave armazenada em um local diferente do padrão, execute estas duas tarefas:

  1. As chaves devem estar em uma pasta que só você pode ler ou editar. Se a pasta tiver permissões mais amplas, o SSH não usará as chaves.

  2. Você deve informar o SSH sobre o local da chave, por exemplo, especificando-o como uma "Identidade" na configuração do SSH:

    Host ssh.dev.azure.com
      IdentityFile ~/.ssh/id_rsa_azure
      IdentitiesOnly yes
    

A IdentitiesOnly yes configuração garante que o SSH não use nenhuma outra identidade disponível para autenticar. Essa configuração é particularmente importante se mais de uma identidade estiver disponível.

P: Tenho várias chaves SSH. Como posso usar a chave SSH correta para Azure DevOps?

R: Geralmente, quando você configura várias chaves para um cliente SSH, o cliente tenta autenticar com cada chave sequencialmente até que o servidor SSH aceite uma.

No entanto, esta abordagem não funciona com o Azure DevOps devido a restrições técnicas relacionadas com o protocolo SSH e a estrutura dos nossos URLs SSH Git. O Azure DevOps aceita a primeira chave fornecida pelo cliente durante a autenticação. Se essa chave for inválida para o repositório solicitado, a solicitação falhará sem tentar outras chaves disponíveis, resultando no seguinte erro:

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

Para Azure DevOps, precisas de configurar o SSH para usar explicitamente um ficheiro de chave específico. O procedimento é o mesmo que ao usar uma chave armazenada em um local não padrão. Diz ao SSH para usar a chave SSH correta para o host do Azure DevOps.

P: Como posso usar diferentes chaves SSH para diferentes organizações no Azure DevOps?

A: Azure DevOps aceita cegamente a primeira chave que o cliente fornece durante a autenticação. Se essa chave for inválida para o repositório solicitado, a solicitação falhará com o seguinte erro:

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

Esta falha deve-se ao facto de todas as URLs Azure DevOps partilharem o mesmo nome de host (ssh.dev.azure.com), tornando impossível que o SSH as distinga por defeito. No entanto, você pode modificar sua configuração SSH para diferenciar entre diferentes organizações, fornecendo chaves distintas para cada uma. Use aliases de host para criar seções separadas Host em seu arquivo de configuração SSH.

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

# 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

Depois, em vez de usar as URLs reais, diga ao Git que deseja usar essas URLs para cada repositório como remoto, substituindo o nome do host nos controles remotos existentes por devops_fabrikam e devops_contoso respectivamente. Por exemplo, git@ssh.dev.azure.com:v3/Fabrikam/Project1/fab_repo passaria a ser git@devops_fabrikam:v3/Fabrikam/Project1/fab_repo.

P: Que notificações posso receber sobre a(s) minha(s) chave(s) SSH?

Um: Existem algumas notificações que poderá receber relativamente à(s) sua(s) chave(s) SSH.

  • Uma nova chave SSH foi adicionada à sua organização

  • Uma chave SSH associada à sua conta expirará em 7 dias e não será válida para autenticação.

  • Uma chave SSH associada à sua conta expirou e não é mais válida para autenticação.

    Exemplo de notificação

    Captura de tela mostrando a notificação por e-mail da chave SSH.

P: O que devo fazer se acreditar que alguém além de mim está a adicionar chaves SSH à minha conta?

R: Se você receber uma notificação de registro de chave SSH que não iniciou, suas credenciais podem ser comprometidas.

O próximo passo seria investigar se sua senha está comprometida ou não. Alterar a sua palavra-passe é sempre um bom primeiro passo para se defender contra este vetor de ataque. Se for utilizador do Microsoft Entra, fale com o seu administrador para verificar se a sua conta foi usada de uma fonte/localização desconhecida.

P: O que devo fazer se ainda me for solicitada a minha palavra-passe e GIT_SSH_COMMAND="ssh -v" git fetch mostrar no mutual signature algorithm ou corresponding algo not in PubkeyAcceptedAlgorithms?

A: Algumas distribuições Linux, como o Fedora Linux, têm políticas criptoativas que exigem algoritmos de assinatura SSH mais fortes do que o Azure DevOps suporta (em janeiro de 2021). Há uma solicitação de recurso aberta para adicionar esse suporte.

Você pode contornar o problema adicionando o seguinte código à sua configuração SSH (~/.ssh/config):

Host ssh.dev.azure.com vs-ssh.visualstudio.com
  PubkeyAcceptedKeyTypes +ssh-rsa

Q. Porque é que a minha chave SSH do Azure DevOps Services deixou de funcionar?

A. A autenticação de chaves SSH exige que faça login regularmente no Azure DevOps Services usando o fluxo completo de autenticação (web). Iniciar sessão uma vez a cada 30 dias é suficiente para muitos utilizadores, mas pode ser necessário iniciar sessão com mais frequência dependendo da configuração do Microsoft Entra. Se a sua chave SSH deixar de funcionar, tente primeiro iniciar sessão na sua organização e preencher o prompt completo de autenticação. Se a tua chave SSH continuar sem funcionar, verifica se expirou.

Gorjeta

Para instâncias auto-hospedadas de Azure DevOps Server e TFS, use o nome de host apropriado na linha Host em vez de ssh.dev.azure.com vs-ssh.visualstudio.com.