Utilizzo di più chiavi pubbliche SSH


97

Ho un account personale e un account aziendale su Unfuddle. Su Unfuddle le chiavi SSH possono essere utilizzate solo su un singolo account, quindi devo creare una chiave SSH separata sul mio laptop per entrambi gli account. Ho corso ssh-keygen -t rsaper generare due chiavi con nomi diversi (personale è il nome predefinito e la società è {company} _rsa). Il problema ora è che sembra che la mia chiave predefinita sia usata ovunque e non riesco a scoprire come specificare una chiave da usare in Git per singoli repository.

Quindi la mia domanda è: come posso specificare una chiave SSH da usare su una base repo-repo?

Ho installato il mio ssh_config (~ / .ssh / config) ma non sembra funzionare ancora.

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

Il mio file di configurazione del repository Git per un repository sul mio account di dislocazione della società è simile al seguente:

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

Quindi non sono sicuro se c'è qualcosa che non va nella mia configurazione ssh o nella mia configurazione git.


La tua configurazione SSH sembra corretta, sto usando una configurazione simile.
Paŭlo Ebermann,

Risposte:


109

Se si dispone di un agente ssh attivo con la id_rsachiave caricata, è probabile che ssh offra prima quella chiave. Unfuddle probabilmente lo accetta per l'autenticazione (ad es. In sshd ) ma lo rifiuta per l'autorizzazione ad accedere ai repository dell'azienda (ad es. In qualsiasi software interno che usano per l'autorizzazione, forse qualcosa di simile a Gitolite). Forse c'è un modo per aggiungere la tua chiave personale all'account aziendale (più persone non condividono gli stessi corp_rsafile di chiavi pubbliche e private, vero?).


La IdentitiesOnly .ssh/configparola chiave di configurazione può essere usata per limitare le chiavi che ssh offre a sshd remoto solo a quelle specificate tramite IdentityFileparole chiave (cioè rifiuterà di usare qualsiasi chiave aggiuntiva che viene caricata in un agente ssh attivo ).

Prova queste .ssh/configsezioni:

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

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

Quindi, utilizzare gli URL Git come questi:

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

Se si desidera sfruttare appieno il .ssh/configmeccanismo, è possibile fornire il proprio nome host personalizzato e modificare il nome utente predefinito:

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

Quindi, utilizzare gli URL Git come questi:

uf-mine:{personalaccount}/my-stuff.git
uf-comp:{companyaccount}/their-stuff.git

7
Se hai più account nello stesso sottodominio Unfuddle (con chiavi SSH diverse), dovrai utilizzare il secondo metodo.
leolobato,

IdentitàSolo era essenziale per me nella mia installazione di gitolite, grazie!
Koen.

1
Incredibile questo risolve il problema che tutte le mie chiavi vengono inviate a Github. Tuttavia, su OS X devo digitare la mia passphrase ogni volta. C'è un modo per dire usare solo la chiave specificata in config ma continuare a usare l'agente ssh?
Estratto il

1
@Drew: se la chiave è già caricata nell'agente, il comando dovrebbe comunque disegnarla dall'agente. Sei sicuro che la tua chiave sia precaricata? Verificare con ssh-add -lprima di utilizzare l'alias host Git. Anche il file della chiave pubblica deve essere presente in modo che ssh possa riconoscere la chiave che ssh-agent sta memorizzando. Puoi rigenerare un .pubfile perso con un comando simile ssh-keygen -f blah -y > blah.pub.
Chris Johnsen,

Sì, è lì dentro. Quando ho rimosso la chiamata IdentitiesOnly, invia github 4 chiavi diverse (inclusa una corretta senza chiedere la passphrase). Quando aggiungo la chiamata, invia solo un tasto ma richiede sempre la passphrase. Anche quando dico a OSX di memorizzare il valore della passphrase nel suo portachiavi.
Estratto il

3

man ssh_config

Qualcosa di simile a

Host personal_repo
  User personal
  IdentityFile .ssh/personal_rsa

Host company_repo
  User company
  IdentityFile .ssh/company_rsa

E usa personal_repocome host nel tuo repository git.


Tass, potresti rivedere le mie modifiche apportate sopra? Ho aggiunto il mio ssh_config e la mia configurazione git.

Hostè solo un identificatore - non è necessario un nome di dominio completo. Questo probabilmente crea alcuni bug nascosti. Se lo cambi, non è necessario scrivere il nome completo nella tua configurazione git.

per gitorious, user = git e host gitorious.org: ad es. git@gitorious.org: ~ revelut / qt / bruce-sandbox-qt.git Come abbini nel tuo Host una parte dell'URL? (tipicamente ~ revelut per me)

@Tass quindi se do il nome company_unfuddle alla configurazione SSH il mio URL dovrebbe essere git @ company_unfuddle: {company} /overall.git? @Bruce - Non sono sicuro di quello che stai chiedendo. Potresti espandere un po 'di più?

3

IdentityFile and IdentitiesSolo funziona bene. Quello che mi dà fastidio è dover ricordare di usare nomi host diversi per connettersi e il fatto che la connessione dell'agente inoltrato contenga ancora tutte le chiavi, il che significa che se l'host remoto è compromesso, possono usare qualsiasi delle mie identità mentre sono in .

Di recente ho iniziato a utilizzare:

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

è un involucro attorno a ssh:

  • mantiene un agente completamente separato per ciascuna identità definita.
  • condivide automaticamente gli agenti attraverso le sessioni di accesso, niente da fare nel tuo .bashrc.
  • carica l'agente e le chiavi corrispondenti su richiesta la prima volta che ne hai bisogno.
  • determina quale agente utilizzare in base alla riga di comando ssh (nome host e simili) o alla directory di lavoro corrente. Questo è particolarmente utile in quanto tendo a lavorare da percorsi diversi a seconda di ciò che sto facendo.

0

Ecco un modo corretto se si desidera utilizzare l'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

Spiegazione: se si dispone di una chiave privata nella directory ~ / .ssh, ssh-agent non verrà utilizzato. Quindi creiamo la chiave pubblica con un altro nome, in modo che ssh sia costretto a usare ssh-agent. Questo aiuta anche se non si ha accesso alle chiavi private (ad es. Inoltro dell'agente ssh)


questo potrebbe essere ssh-add -L, no ssh-agent.
ives

@ives grazie, risolto
Vanuan il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.