Melhor maneira de usar várias chaves privadas SSH em um cliente

871

Desejo usar várias chaves privadas para conectar-me a diferentes servidores ou partes diferentes do mesmo servidor (meus usos são administração do sistema do servidor, administração do Git e uso normal do Git no mesmo servidor). Tentei simplesmente empilhar as chaves nos id_rsaarquivos sem sucesso.

Aparentemente, uma maneira direta de fazer isso é usar o comando

ssh -i <key location> [email protected] 

Isso é bastante complicado.

Alguma sugestão de como fazer isso um pouco mais fácil?

Justin
fonte
1
Eu escrevi este artigo que detalha várias configurações e suas vantagens / desvantagens.
Raffi

Respostas:

1234

Do meu .ssh/config:

Host myshortname realname.example.com
    HostName realname.example.com
    IdentityFile ~/.ssh/realname_rsa # private key for realname
    User remoteusername

Host myother realname2.example.org
    HostName realname2.example.org
    IdentityFile ~/.ssh/realname2_rsa  # different private key for realname2
    User remoteusername

E assim por diante.

Randal Schwartz
fonte
25
Obrigado Randal! Eu pesquisei no .ssh / config e encontrei o seguinte: github.com/guides/multiple-github-accounts Me indicou a direção certa.
Justin
6
Esta foi uma grande ajuda (além de stackoverflow.com/a/3828682/169153 ). Se você quiser usar as teclas de massa de vidraceiro seguir esta documento aqui: blog.padraigkitterick.com/2007/09/16/...
Urda
2
Achei este post muito útil. Um erro que cometi ao criar o arquivo de configuração foi colocar um arquivo .txt na pasta .ssh, em vez de executar o comando "touch" para criar um arquivo de configuração.
M_x_r 22/12/12
53
Observe que você também pode especificar várias IdentityFileentradas para a mesma Host, que são tentadas em ordem ao se conectar.
Sschuberth 02/10
12
Use IdentitiesOnly yespara impedir ~ / .ssh / id_rsa ou quaisquer outras identidades. (Esta foi originalmente uma edição)
user3338098
370

Você pode instruir o ssh a tentar várias chaves sucessivamente ao se conectar. Aqui está como:

$ cat ~/.ssh/config
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_rsa_old
IdentityFile ~/.ssh/id_ed25519
# ... and so on

$ ssh server.example.com -v
....
debug1: Next authentication method: publickey
debug1: Trying private key: /home/example/.ssh/id_rsa
debug1: read PEM private key done: type RSA
debug1: Authentications that can continue: publickey
debug1: Trying private key: /home/example/.ssh/id_rsa_old
debug1: read PEM private key done: type RSA
....
[server ~]$

Dessa forma, você não precisa especificar qual chave funciona com qual servidor. Apenas usará a primeira chave de trabalho.

Além disso, você só digitaria uma senha se um determinado servidor estiver disposto a aceitar a chave. Como visto acima, o ssh não tentou solicitar uma senha, .ssh/id_rsamesmo que tivesse uma.

Certamente não supera uma configuração por servidor como em outras respostas, mas pelo menos você não precisará adicionar uma configuração para todo e qualquer servidor ao qual você se conecta!

spacesix
fonte
13
Esta é uma solução fantástica para a pergunta, mas não atendeu completamente às necessidades que o solicitante pretendia. Para mim, era exatamente a solução certa e atende perfeitamente à necessidade da "Melhor maneira de usar várias chaves privadas SSH em um cliente".
Wade
2
Este não parece trabalho no âmbito da declaração de host no arquivo de configuração
Maksim Luzik
30
Isso não funciona bem com o git, como se você tivesse duas chaves de implantação do github, a primeira da lista é válida e funcionará, mas o github reclamará que o repositório não corresponde.
Adam Reis
1
Se o servidor SFTP / destino tiver políticas de segurança que bloqueiem a conta (digamos, após três tentativas múltiplas de conexão com falha), isso não acabaria bloqueando a conta. É tentada uma conexão, mas com um arquivo de 'chave errada'
alchemist.gamma
7
Esteja ciente de que você tem algo como fail2ban nesses servidores. Você pode acabar em uma dessas prisões ... por causa das tentativas falhadas gerados pelas outras teclas ...
Piccolo
254

A resposta de Randal Schwartz quase me ajudou por todo o caminho. Eu tenho um nome de usuário diferente no servidor, então tive que adicionar a palavra-chave Usuário ao meu arquivo:

Host           friendly-name
HostName       long.and.cumbersome.server.name
IdentityFile   ~/.ssh/private_ssh_file
User           username-on-remote-machine

Agora você pode se conectar usando o nome amigável:

ssh friendly-name

Mais palavras-chave podem ser encontradas na página do manual OpenSSH . NOTA: Algumas das palavras-chave listadas podem já estar presentes no seu arquivo / etc / ssh / ssh_config .

Peron
fonte
Se não me engano o usuário que você normalmente especificar diretamente na URL ao se conectar com o usuário @ host
a1an
3
Prefiro usar a palavra-chave 'Port' também. Outra palavra-chave interessante é 'StrictHostKeyChecking'.
Ethan
122

As respostas anteriores explicaram adequadamente a maneira de criar um arquivo de configuração para gerenciar várias chaves ssh. Penso que o importante que também precisa ser explicado é a substituição de um nome de host por um nome alternativo ao clonar o repositório .

Suponha que o nome de usuário da sua conta GitHub seja abc1234 . E suponha que o nome de usuário da sua conta pessoal do GitHub seja jack1234

E suponha que você tenha criado duas chaves RSA, ou seja, id_rsa_company e id_rsa_personal . Portanto, seu arquivo de configuração será semelhante a seguir:

# Company account
Host company
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_company

# Personal account
Host personal
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_personal

Agora, quando você estiver clonando o repositório (chamado demo) da conta GitHub da empresa, a URL do repositório será algo como:

Repo URL: [email protected]:abc1234/demo.git

Agora, enquanto estiver fazendo git clone, você deve modificar a URL do repositório acima como:

git@company:abc1234/demo.git

Observe como o github.com agora é substituído pelo alias "company", conforme definido no arquivo de configuração.

Da mesma forma, você deve modificar o URL do clone do repositório na conta pessoal, dependendo do alias fornecido no arquivo de configuração.

esquecimento
fonte
10
Gostaria de poder aprovar esta resposta mais de uma vez ... esta é a maneira correta de abordar o problema e é mais segura e rápida do que outras opções. Mais escalável também (permite definir chaves diferentes para o mesmo nome de host)
guyarad
4
Não perca mais tempo, esta é a resposta. Muito Obrigado.
Luis Milanese
2
Eu realmente gostaria de ter encontrado essa resposta mais cedo ... mas antes tarde do que nunca, Muito obrigado!
Hildy
2
Ótima explicação! Funciona perfeito para mim. E se você esqueceu de clonar o repositório com o alias, geralmente pode editar o URL de origem remoto posteriormente.
tkahn
1
única pay attencion porque arquivo de configuração deve ser (chmod 600)
Christiano Matos
106
ssh-add ~/.ssh/xxx_id_rsa

Teste-o antes de adicionar com:

ssh -i ~/.ssh/xxx_id_rsa [email protected]

Se você tiver algum problema com erros, às vezes, alterar a segurança do arquivo ajuda:

chmod 0600 ~/.ssh/xxx_id_rsa
user420807
fonte
4
Esta é a solução mais sucinta e elegante na minha opinião. Trabalhou como um encanto!
Artur
@Bobo, você pode colocá-lo no seu bashrc ou bash_profile (ou o que for equivalente ao mac)?
T0xicCode
6
+1 para chmod 0600 - problemas de permissões estavam me impedindo de conexão
amacy
Funcionou como um encanto para mim (e não se esqueça das 0600 permissões).
Dmytro Uhnichenko
1
Veio do ubuntu no mac e era exatamente isso que eu precisava.
Hariom
42
  1. Gere uma chave SSH:

    $ ssh-keygen -t rsa -C <[email protected]>
    
  2. Gere outra chave SSH :

    $ ssh-keygen -t rsa -f ~/.ssh/accountB -C <[email protected]>
    

    Agora, duas chaves públicas ( id_rsa.pub , accountB.pub ) devem existir no ~/.ssh/diretório

    $ ls -l ~/.ssh     # see the files of '~/.ssh/' directory
    
  3. Crie um arquivo de configuração ~/.ssh/configcom o seguinte conteúdo:

    $ nano ~/.ssh/config
    
    Host bitbucket.org
        User git
        Hostname bitbucket.org
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/id_rsa
    
    Host bitbucket-accountB
        User git
        Hostname bitbucket.org
        PreferredAuthentications publickey
        IdentitiesOnly yes
        IdentityFile ~/.ssh/accountB
    
  4. Clone da defaultconta.

    $ git clone [email protected]:username/project.git
    
  5. Clone da accountBconta.

    $ git clone git@bitbucket-accountB:username/project.git
    

Veja mais aqui

Sajib Khan
fonte
24

Eu concordo com Tuomas sobre o uso do ssh-agent. Eu também queria adicionar uma segunda chave privada para o trabalho e este tutorial funcionou como um encanto para mim.

Os passos são os seguintes:

  1. $ ssh-agent bash
  2. $ ssh-add /path.to/private/key por exemplo ssh-add ~/.ssh/id_rsa
  3. Verificar por $ ssh-add -l
  4. Testá-lo com $ssh -v <host url>egssh -v [email protected]
Wahib Ul Haq
fonte
4
Tendo usado ssh-agentpor anos, recentemente mudei para o Gnome gnome-keyringno meu i3ui. O motivo é simples: o gerenciador de chaveiros do Gnome lida automaticamente com a adição e remoção de chaves ssh sem que eu precise me lembrar ssh-add. Além de me fornecer uma única senha para desbloqueá-los (e tempo limite em um horário especificado, por segurança). Cada um na sua. Desde que eu uso as configurações do gnome no Arch, foi plug and play com minha configuração. Se você é anti-gnomo, ignore este comentário.
Eduncan911 26/05
@ eduncan911, eu concordo que o gnome-keyring pode ser útil, mas na verdade não lida com as chaves ed25519, de modo que, para mim, não é iniciante. Atualização: vejo em wiki.archlinux.org/index.php/GNOME/… que agora usa o ssh-agent do sistema, para que não seja mais um problema.
Brian Minton
15

Eu já havia enfrentado esse problema há algum tempo, quando tinha duas contas Bitbucket e queria armazenar chaves SSH separadas para ambas. Isto é o que funcionou para mim.

Criei duas configurações ssh separadas da seguinte maneira.

Host personal.bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile /Users/username/.ssh/personal
Host work.bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile /Users/username/.ssh/work

Agora, quando eu tive que clonar um repositório da minha conta de trabalho - o comando foi o seguinte.

git clone [email protected]:teamname/project.git

Eu tive que modificar este comando para:

git clone git@**work**.bitbucket.org:teamname/project.git

Da mesma forma, o comando clone da minha conta pessoal teve que ser modificado para

git clone git @ pessoal .bitbucket.org: name / personalproject.git

Consulte este link para obter mais informações.

Ananth Pai
fonte
11

Use ssh-agent para suas chaves.

Tuomas Pelkonen
fonte
Você pode elaborar?
Peter Mortensen
11

Agora, com a versão recente do Git, podemos especificar sshCommand no arquivo de configuração Git específico do repositório:

  [core]
      repositoryformatversion = 0
      filemode = true
      bare = false
      logallrefupdates = true
      sshCommand = ssh -i ~/.ssh/id_rsa_user
   [remote "origin"]
      url = [email protected]:user/repo.git
      fetch = +refs/heads/*:refs/remotes/origin/*
Naga Kiran
fonte
1

Você pode criar um arquivo de configuração nomeado configem sua ~/.sshpasta. Pode conter:

Host aws
    HostName *yourip*
    User *youruser*
    IdentityFile *idFile*

Isso permitirá que você se conecte a máquinas como esta

 ssh aws
Andrew Crowley
fonte
Que forma o idFile assume? Um caminho absoluto. Você pode dar um exemplo
Peter Mortensen
1

IMPORTANTE: Você deve iniciar o ssh-agent

Você deve iniciar o ssh-agent (se já não estiver em execução) antes de usar o ssh-add da seguinte maneira:

eval `ssh-agent -s` # start the agent

ssh-add id_rsa_2 # Where id_rsa_2 is your new private key file

Observe que o comando eval inicia o agente no Git Bash no Windows. Outros ambientes podem usar uma variante para iniciar o agente SSH.

danday74
fonte
1

No Ubuntu 18.04 (Bionic Beaver) não há nada para fazer.

Depois de criar com êxito uma segunda chave SSH, o sistema tentará encontrar uma chave SSH correspondente para cada conexão.

Só para esclarecer, você pode criar uma nova chave com estes comandos:

# Generate key make sure you give it a new name (id_rsa_server2)
ssh-keygen

# Make sure ssh agent is running
eval `ssh-agent`

# Add the new key
ssh-add ~/.ssh/id_rsa_server2

# Get the public key to add it to a remote system for authentication
cat ~/.ssh/id_rsa_server2.pub
GiorgosK
fonte
1

Vários pares de chaves no GitHub

1.0 arquivo de configuração SSH

1.1 Criar ~ / .ssh / config

1.2 chmod 600 ~ / .ssh / config ( obrigatório )

1.3 Insira o seguinte no arquivo:

Hospedar pizza

HostName github.com

PreferredAuthentications publickey # optional

IdentityFile ~ / .ssh / privatekey1

Caso A: novo clone do Git

Use este comando para clonar Git:

$ git clone git@pizza:yourgitusername/pizzahut_repo.git

Nota: Se desejar alterar o nome do host “pizza” de .ssh / config no futuro, vá para a pasta clonada Git, edite a linha de URL do arquivo .git / config (consulte o caso B)

Caso B: já tem pasta clone do Git

2.1 Vá para a pasta clonada e, em seguida, vá para a pasta .git

2.2 Editar arquivo de configuração

2.3 Atualize o URL de * antigo para novo :

(Old) URL = [email protected]:yourgitusername/pizzahut_repo.git

(New) URL = git@pizza:yourgitusername/pizzahut_repo.git

Chris
fonte
1

Para mim, a única solução de trabalho era simplesmente adicionar isso no arquivo ~/.ssh/config:

Host *
  IdentityFile ~/.ssh/your_ssh_key
  IdentityFile ~/.ssh/your_ssh_key2
  IdentityFile ~/.ssh/your_ssh_key3
  AddKeysToAgent yes

your_ssh_keyestá sem nenhuma extensão. Não use .pub.

amdev
fonte
0

No CentOS 6.5 executando o OpenSSH_5.3p1 e o OpenSSL 1.0.1e-fips, resolvi o problema renomeando meus arquivos-chave para que nenhum deles tivesse o nome padrão.

Meu diretório .ssh contém id_rsa_foo e id_rsa_bar, mas não id_rsa, etc.

Chris Owens
fonte
E como as chaves são usadas? Existe alguma detecção automática?
22417 robsch
Veja a resposta de Randal Schwartz para uma maneira de selecionar a chave correta para um determinado host stackoverflow.com/questions/2419566/...
Chris Owens
Sim, isso torna mais explícito. Mesmo usando a -iopção pode resultar em algo como no such identity: /home/embo/.ssh/id_rsa: No such file or directory.
Peter Mortensen
0

Conforme mencionado em uma página de blog Atlassian , gere um arquivo de configuração dentro da pasta .ssh , incluindo o seguinte texto:

#user1 account
 Host bitbucket.org-user1
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user1
     IdentitiesOnly yes

 #user2 account
 Host bitbucket.org-user2
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user2
     IdentitiesOnly yes

Em seguida, você pode simplesmente fazer o checkout com o domínio do sufixo e, nos projetos, você pode configurar os nomes dos autores, etc. localmente.

dgbt
fonte
0

Aqui está a solução que usei inspirada na resposta de sajib-khan . A configuração padrão não está definida; é minha conta pessoal no GitLab e a outra especificada é minha conta corporativa . Aqui está o que eu fiz:

Gere a chave SSH

ssh-keygen -t rsa -f ~/.ssh/company -C "[email protected]"

Edite a configuração SSH

nano ~/.ssh/config
    Host company.gitlab.com
    HostName gitlab.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/company

Exclua as chaves SSH em cache

ssh-add -D

Teste-o!

ssh -T [email protected]

Bem-vindo ao GitLab, @ hugo.sohm!

ssh -T [email protected]

Bem-vindo ao GitLab, @HugoSohm!

Use-o!

Conta da empresa

git clone [email protected]:group/project.git

Conta pessoal / padrão

git clone [email protected]:username/project.git

Aqui está a fonte que eu usei.

Hugo S
fonte
0

Eu amo a abordagem para definir o seguinte no arquivo ~ / .ssh / config:

# Configuration for GitHub to support multiple GitHub  keys
Host  github.com
  HostName github.com
  User git

# UseKeychain adds each keys passphrase to the keychain so you
# don't have to enter the passphrase each time.
  UseKeychain yes

# AddKeysToAgent would add the key to the agent whenever it is
# used, which might lead to debugging confusion since then
# sometimes the one repository works and sometimes the
# other depending on which key is used first.
#  AddKeysToAgent yes

# I only use my private id file so all private
# repositories don't need the environment variable
# `GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa"` to be set.
  IdentityFile ~/.ssh/id_rsa

Em seu repositório, você pode criar um .envarquivo que contenha o sshcomando a ser usado:

GIT_SSH_COMMAND="ssh -i ~/.ssh/your_ssh_key"

Se você usar, por exemplo, dotenv a variável de ambiente do ambiente será exportada automaticamente e , você poderá especificar a chave que deseja por projeto / diretório. A senha é solicitada apenas uma vez, pois é adicionada ao chaveiro.

Esta solução funciona perfeitamente com o Git e foi projetada para funcionar em um Mac (devido a UseKeychain).

blackjacx
fonte
-1

Você pode experimentar este pacote sshmulti npm para manter várias chaves SSH.

Anto Khan
fonte
Eu recomendo fortemente não usar o npm para algo assim. Tinha uma cascata de dependências, que, em breve inspeção, incluem uma variedade de desenvolvedores solitários, pacotes de vários anos. A própria página sshmulti npm declara que não foi testada.
Jack Wasey