Usando várias chaves públicas SSH

94

Eu tenho uma conta pessoal e uma conta da empresa no Unfuddle. No Unfuddle, as chaves SSH só podem ser usadas em uma única conta, então eu preciso criar uma chave SSH separada no meu laptop para ambas as contas. Eu corri ssh-keygen -t rsa para gerar duas chaves com nomes diferentes (personal é o nome padrão e a empresa é {company} _rsa). O problema agora é que parece que minha chave padrão é usada em todos os lugares e não consigo descobrir como especificar uma chave para usar no Git para repos individuais.

Então, minha pergunta é: como especificar uma chave SSH para usar em uma base repo-a-repo?

Eu configurei meu ssh_config (~ / .ssh / config) mas ainda parece não funcionar.

config:

Host {personalaccount}.unfuddle.com
     HostName {personalaccount}.unfuddle.com
     User git
     IdentityFile /Users/dave/.ssh/id_rsa

Host {companyaccount}.unfuddle.com
     HostName {companyaccount}.unfuddle.com
     User git
     IdentityFile /Users/dave/.ssh/cage_rsa

Meu arquivo de configuração do repositório do Git para um repo na minha conta de unfuddle da minha empresa é assim:

[remote "origin"]
     url = git@{companyaccount}.unfuddle.com:{companyaccount}/overall.git
     fetch = +refs/heads/*:refs/remotes/origin/*

Portanto, não tenho certeza se há algo errado com minha configuração ssh ou minha configuração do git.

    
por Dave Long 18.04.2011 / 15:26

3 respostas

108

Se você tiver um ssh-agent ativo que tenha a chave id_rsa carregada, o problema é que ssh está oferecendo essa chave primeiro. O Unfuddle provavelmente o aceita para autenticação (por exemplo, em sshd ), mas o rejeita para obter autorização para acessar os repositórios da empresa (por exemplo, em qualquer software interno usado para autorização, possivelmente algo parecido com o Gitolite). Talvez exista uma maneira de adicionar sua chave pessoal à conta da empresa (várias pessoas não estão compartilhando os mesmos corp_rsa arquivos de chave pública e privada, são?).

A palavra-chave de configuração IdentitiesOnly .ssh/config pode ser usada para limitar as chaves que o ssh oferece ao sshd remoto para aquelas especificadas via IdentityFile keywords ( isto é, ele se recusará a usar quaisquer chaves adicionais que forem carregadas em um ssh-agent ativo.

Experimente estas .ssh/config secções:

Host {personalaccount}.unfuddle.com
     IdentityFile ~/.ssh/id_rsa
     IdentitiesOnly yes

Host {companyaccount}.unfuddle.com
     IdentityFile ~/.ssh/{companyaccount}_rsa
     IdentitiesOnly yes

Em seguida, use URLs do Git como estes:

git@{personalaccount}.unfuddle.com:{personalaccount}/my-stuff.git
git@{companyaccount}.unfuddle.com:{companyaccount}/their-stuff.git

Se você quiser aproveitar ao máximo o mecanismo .ssh/config , forneça seu próprio nome de host personalizado e altere o nome de usuário padrão:

Host uf-mine
     HostName {personalaccount}.unfuddle.com
     User git
     IdentityFile ~/.ssh/id_rsa
     IdentitiesOnly yes

Host uf-comp
     HostName {companyaccount}.unfuddle.com
     User git
     IdentityFile ~/.ssh/{companyaccount}_rsa
     IdentitiesOnly yes

Em seguida, use URLs do Git como estes:

uf-mine:{personalaccount}/my-stuff.git
uf-comp:{companyaccount}/their-stuff.git
    
por 19.04.2011 / 05:21
3

man ssh_config

Algo como

Host personal_repo
  User personal
  IdentityFile .ssh/personal_rsa

Host company_repo
  User company
  IdentityFile .ssh/company_rsa

Use personal_repo como host no seu repositório do git.

    
por 18.04.2011 / 16:05
3

IdentityFile e IdentitiesOnly funcionam bem. O que me incomoda é ter que lembrar de usar nomes de host diferentes para se conectar e o fato de que a conexão do agente encaminhado ainda contém todas as chaves, o que significa que se o host remoto estiver comprometido, eles podem usar qualquer uma das minhas identidades .

Recentemente, comecei a usar:

link

é um wrapper em torno do ssh:

  • mantém um agente totalmente separado para cada identidade que você define.
  • compartilha agentes automaticamente através de sessões de login, nada para fazer em seu .bashrc.
  • carrega o agente e as chaves correspondentes sob demanda na primeira vez que você precisar delas.
  • determina qual agente usar com base na linha de comando ssh (hostname & tais) ou no diretório de trabalho atual. Isso é particularmente útil, pois tenho a tendência de trabalhar em caminhos diferentes, dependendo do que estou fazendo.
por 15.03.2013 / 05:20

Tags