Usando várias chaves públicas SSH

97

Eu tenho uma conta pessoal e uma conta corporativa no Unfuddle. No Unfuddle, as chaves SSH podem ser usadas apenas em uma única conta, por isso preciso criar uma chave SSH separada no meu laptop para as duas contas. Corri ssh-keygen -t rsapara gerar duas chaves com nomes diferentes (pessoal é 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 repositórios individuais.

Portanto, minha pergunta é: como especificar uma chave SSH para usar em um repo-to-repo?

Eu configurei meu ssh_config (~ / .ssh / config), mas ele ainda não parece 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 de repositório Git para um repositório na conta de descompasso da minha empresa se parece com isso:

[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 git.

Dave Long
fonte
Sua configuração do ssh parece correta, estou usando uma configuração semelhante.
Pa Elo Ebermann

Respostas:

109

Se você tem um ativo ssh-agente que tem a sua id_rsachave carregada, então o problema é provável que ssh está oferecendo essa chave em primeiro lugar. O Unfuddle provavelmente o aceita para autenticação (por exemplo, no sshd ), mas o rejeita para autorização para acessar os repositórios da empresa (por exemplo, em qualquer software interno que eles usem para autorização, possivelmente algo semelhante ao Gitolite). Talvez haja uma maneira de adicionar sua chave pessoal à conta da empresa (várias pessoas não estão compartilhando os mesmos corp_rsaarquivos de chave pública e privada, não é?).


A IdentitiesOnly .ssh/configpalavra-chave de configuração pode ser usada para limitar as chaves que o ssh oferece ao sshd remoto apenas àquelas especificadas por meio de IdentityFilepalavras - chave (ou seja, ele se recusará a usar quaisquer chaves adicionais que por acaso sejam carregadas em um agente ssh ativo ).

Tente estas .ssh/configseçõ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 tirar o máximo proveito do .ssh/configmecanismo, poderá fornecer seu próprio nome de host personalizado e alterar 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
Chris Johnsen
fonte
7
Se você tiver várias contas no mesmo subdomínio Unfuddle (com chaves SSH diferentes), será necessário usar o segundo método.
leolobato
IdentitiesOnly foi essencial para mim na minha configuração gitolite, obrigado!
Koen.
1
Impressionante, isso corrige o problema de todas as minhas chaves serem enviadas para o github. No entanto, no OS X, tenho que digitar minha senha sempre. Existe uma maneira de dizer apenas usar a chave especificada na configuração, mas continuar usando o agente ssh?
Tirou
1
@ Drew: Se a chave já estiver carregada no agente, o comando ainda deve retirá-la do agente. Tem certeza de que sua chave está pré-carregada? Verifique com ssh-add -lantes de usar o alias do host do Git. Além disso, o arquivo de chave pública precisa estar presente para que o ssh possa reconhecer a chave que o ssh-agent está armazenando. Você pode regenerar um .pubarquivo perdido com um comando como ssh-keygen -f blah -y > blah.pub.
31813 Chris Johnsen
Sim, está lá. Quando removi a chamada IdentitiesOnly, ela envia 4 chaves diferentes ao github (incluindo a correta sem a solicitação da senha). Quando adiciono a chamada, ela envia apenas uma tecla, mas solicita a senha sempre. Mesmo quando eu digo ao OSX para armazenar o valor da frase secreta no chaveiro.
Drew
3

man ssh_config

Algo como

Host personal_repo
  User personal
  IdentityFile .ssh/personal_rsa

Host company_repo
  User company
  IdentityFile .ssh/company_rsa

E use personal_repocomo host em seu repositório git.

Reactormonk
fonte
Tass, você poderia revisar minhas alterações feitas acima? Eu adicionei meu ssh_config e minha configuração do git.
Hosté apenas um identificador - não há necessidade de nome de domínio completo. Isso provavelmente cria alguns erros ocultos. Se você mudar isso, não precisará digitar o nome completo na sua configuração do git.
para gitorious, user = git e host gitorious.org: por exemplo, [email protected]: ~ revelut / qt / bruce-sandbox-qt.git Como você combina no seu host uma parte do URL? (tipicamente ~ revelut para mim)
@ Então, se eu der o nome company_unfuddle à configuração do SSH, meu URL deve ser git @ company_unfuddle: {company} /overall.git? @ Bruce - Não tenho certeza do que você está perguntando. Você poderia expandir um pouco mais?
3

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

Comecei recentemente a usar:

https://github.com/ccontavalli/ssh-ident

é um wrapper em torno do ssh, ele:

  • mantém um agente totalmente separado para cada identidade que você definir.
  • compartilha automaticamente agentes nas sessões de login, nada a fazer no seu .bashrc.
  • carrega o agente e as chaves correspondentes sob demanda na primeira vez que você precisar deles.
  • determina qual agente usar com base na linha de comando ssh (nome do host e outros) ou no seu diretório de trabalho atual. Isso é particularmente útil, pois tenho a tendência de trabalhar em diferentes caminhos, dependendo do que estou fazendo.
MarkMo
fonte
0

Aqui está uma maneira adequada se você deseja usar o agente ssh:

# Create public keys to make sure they exist
# this is a must if you use ssh agent forwarding
# or want to use ssh-agent at all
ssh-add -L | grep personal > ~/.ssh/personal_identity.pub
ssh-add -L | grep company > ~/.ssh/company_identity.pub


# Add to ~/.ssh/config
Host {personalaccount}.unfuddle.com
  IdentityFile ~/.ssh/personal_identity.pub

Host {companyaccount}.unfuddle.com
  IdentityFile ~/.ssh/company_identity.pub

Explicação: se você tiver uma chave privada no diretório ~ / .ssh, o ssh-agent não será utilizado. Por isso, criamos chave pública com outro nome, para que o ssh seja forçado a usar o ssh-agent. Isso também ajuda se você não tiver acesso a chaves privadas (por exemplo, encaminhamento de agente ssh)

Vanuan
fonte
isso pode ser ssh-add -L, não ssh-agent.
ives
@ives obrigado, corrigido
Vanuan