Questão Usando várias chaves públicas SSH


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. Irã 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/*

Então eu não tenho certeza se há algo errado com minha configuração ssh ou minha configuração git.


93


origem


Sua configuração ssh parece certa, estou usando uma configuração similar. - Paŭlo Ebermann


Respostas:


Se você tem um ativo ssh-agent que tem o seu id_rsa tecla carregada, então o problema é provável que ssh está oferecendo essa chave primeiro. Unfuddle provavelmente aceita por autenticação (por exemplo, sshd) mas rejeita a autorização para acessar os repositórios da empresa (por exemplo, em qualquer software interno que eles usem 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 a mesma corp_rsa arquivos de chave pública e privada, são eles?).


o IdentitiesOnly  .ssh/config palavra-chave de configuração pode ser usada para limitar as chaves ssh oferece ao controle remoto sshd para apenas aqueles especificados via IdentityFile palavras-chave (ou seja, ele se recusará a usar quaisquer chaves adicionais que sejam carregadas em um ssh-agent).

Tente esse .ssh/config Seçõ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 .ssh/config mecanismo, você pode 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

105



Se você tiver várias contas no mesmo subdomínio Unfuddle (com diferentes chaves SSH), será necessário usar o segundo método. - leolobato
IdentitiesOnly foi essencial para mim na minha configuração de gitolite, obrigado! - Koen.
Awesome isso corrige o problema que todas as minhas chaves são enviadas para o github. No entanto, no OS X eu tenho que digitar minha frase toda vez. Existe uma maneira de dizer apenas usar chave especificada na configuração, mas continuar a usar o agente ssh? - Drew
@Drew: Se a chave já estiver carregada no agente, o comando ainda deverá desenhá-lo do agente. Tem certeza de que sua chave está pré-carregada? Verificar com ssh-add -l antes de usar seu alias de host do Git. Além disso, o arquivo de chave pública precisa estar presente para que ssh pode reconhecer a chave que ssh-agent está armazenando. Você pode regenerar um perdido .pub arquivo com um comando como ssh-keygen -f blah -y > blah.pub. - Chris Johnsen
Sim, está lá. Quando eu removi a chamada IdentitiesOnly, ela envia 4 chaves diferentes para o github (incluindo uma correta sem pedir senha). Quando eu adiciono a chamada, ela envia apenas a chave, mas solicita a frase toda vez. Mesmo quando digo ao OSX para armazenar o valor da senha em suas chaves. - Drew


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_repo como anfitrião no seu repositório git.


3



Tass, você poderia rever 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 bugs ocultos. Se você mudar isso, você não precisa soletrar o nome completo na sua configuração do git.
para gitorious, user = git e host gitorious.org: por exemplo git@gitorious.org: ~ revelut / qt / bruce-sandbox-qt.git Como você combina na sua Host uma parte da url? (tipicamente ~ festejo para mim)
@Tass, se eu der o nome company_unfuddle à configuração 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?


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 .

Eu comecei recentemente usando:

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

é um wrapper em torno do ssh, ele:

  • mantém um agente totalmente separado para cada identidade que você define.
  • automaticamente compartilha agentes através de sessões de login, nada a 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 & tal) 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.

3