Korzystanie z wielu kluczy publicznych SSH

97

Mam konto osobiste i konto firmowe w Unfuddle. Na Unfuddle SSH klucze mogą być używane tylko na jednym koncie, więc muszę utworzyć osobny klucz SSH na moim laptopie dla obu kont. Pobiegłem ssh-keygen -t rsawygenerować dwa klucze o różnych nazwach (nazwa osobista to nazwa domyślna, a firma to {firma} _rsa). Problem polega na tym, że wygląda na to, że mój domyślny klucz jest używany wszędzie i nie mogę się dowiedzieć, jak określić klucz, który ma być używany w Git dla poszczególnych repozytoriów.

Więc moje pytanie brzmi: jak określić klucz SSH, który będzie używany na zasadzie repo-to-repo?

Instaluję mój ssh_config (~ / .ssh / config), ale nadal nie działa.

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

Mój plik konfiguracyjny repozytorium Git dla repo na moim koncie firmowym rozwija się następująco:

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

Więc nie jestem pewien, czy coś jest nie tak z moją konfiguracją ssh lub moją konfiguracją git.

Dave Long
źródło
Twoja konfiguracja ssh wygląda poprawnie, używam podobnej konfiguracji.
Paŭlo Ebermann

Odpowiedzi:

109

Jeśli masz aktywnego agenta ssh z id_rsazaładowanym kluczem, prawdopodobnie problem polega na tym, że ssh oferuje ten klucz jako pierwszy. Unfuddle prawdopodobnie przyjmuje je do uwierzytelnienia (np. W sshd ), ale odrzuca je w celu autoryzacji dostępu do repozytoriów firmowych (np. W jakimkolwiek oprogramowaniu wewnętrznym, którego używają do autoryzacji, być może coś podobnego do Gitolite). Być może istnieje sposób, aby dodać swój klucz osobisty do konta firmowego (wiele osób nie udostępnia tych samych corp_rsaplików kluczy publicznych i prywatnych, prawda?).


IdentitiesOnly .ssh/configHasło konfiguracji może być stosowany w celu ograniczenia klucze SSH oferty do zdalnego sshd tylko określone poprzez IdentityFilesłów kluczowych (czyli odmówi używać żadnych dodatkowych przycisków, które zdarzają się być załadowany do działającego ssh-agent ).

Wypróbuj te .ssh/configsekcje:

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

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

Następnie użyj takich adresów URL Git:

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

Jeśli chcesz w pełni skorzystać z .ssh/configmechanizmu, możesz podać własną niestandardową nazwę hosta i zmienić domyślną nazwę użytkownika:

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

Następnie użyj takich adresów URL Git:

uf-mine:{personalaccount}/my-stuff.git
uf-comp:{companyaccount}/their-stuff.git
Chris Johnsen
źródło
7
Jeśli masz wiele kont w tej samej subdomenie Unfuddle (z różnymi kluczami SSH), musisz użyć drugiej metody.
leolobato,
Tożsamości Jedynie było dla mnie niezbędne w mojej konfiguracji gitolite, dzięki!
Koen.
1
Niesamowite rozwiązuje to problem, że wszystkie moje klucze są wysyłane do github. Jednak w OS XI muszę wpisywać moje hasło za każdym razem. Czy istnieje sposób, aby powiedzieć, że używasz tylko klucza określonego w config, ale nadal używasz agenta ssh?
Drew
1
@Drew: Jeśli klucz jest już załadowany do agenta, polecenie powinno nadal pobierać go z agenta. Czy na pewno Twój klucz jest wstępnie załadowany? Sprawdź ssh-add -lprzed użyciem aliasu hosta Git. Musi również być obecny plik klucza publicznego, aby ssh mógł rozpoznać klucz, który ssh-agent przechowuje. Możesz odtworzyć utracony .pubplik za pomocą polecenia takiego jak ssh-keygen -f blah -y > blah.pub.
Chris Johnsen
Tak, jest tam. Kiedy usunąłem wywołanie IdentitiesOnly, wysyła githubowi 4 różne klucze (w tym poprawny jeden bez pytania o hasło). Gdy dodam połączenie, wysyła tylko jeden klucz, ale za każdym razem żąda hasła. Nawet gdy mówię OSX, aby zapisał wartość hasła w pęku kluczy.
Drew
3

man ssh_config

Coś jak

Host personal_repo
  User personal
  IdentityFile .ssh/personal_rsa

Host company_repo
  User company
  IdentityFile .ssh/company_rsa

I użyj personal_repojako hosta w swoim repozytorium git.

Reactormonk
źródło
Tass, czy mógłbyś przejrzeć moje zmiany dokonane powyżej? Dodałem moją ssh_config i moją konfigurację git.
Hostto tylko identyfikator - nie potrzeba pełnej nazwy domeny. To prawdopodobnie tworzy ukryte błędy. Jeśli to zmienisz, nie musisz przeliterować pełnej nazwy w konfiguracji git.
dla gitorious, user = git i host gitorious.org: np. [email protected]: ~ revelut / qt / bruce-sandbox-qt.git Jak dopasować w swoim Hostie część adresu URL? (zazwyczaj ~ revelut dla mnie)
@ Tass, więc jeśli podam nazwę firmy_unfuddle do konfiguracji SSH, czy mój adres URL powinien być git @ firma_unfuddle: {firma} /overall.git? @Bruce - Nie jestem pewien, o co pytasz. Czy możesz rozszerzyć nieco więcej?
3

IdentityFile i IdentitiesOnly działa dobrze. Niepokoi mnie to, że muszę używać różnych nazw hostów, aby się połączyć, oraz fakt, że przekazane połączenie agenta nadal zawiera wszystkie klucze, co oznacza, że ​​jeśli zdalny host zostanie przejęty, mogą korzystać z dowolnej mojej tożsamości, gdy jestem w .

Ostatnio zacząłem używać:

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

jest to opakowanie wokół ssh, to:

  • utrzymuje całkowicie oddzielnego agenta dla każdej zdefiniowanej tożsamości.
  • automatycznie dzieli agentów między sesjami logowania, nic nie robić w twoim .bashrc.
  • ładuje agenta i odpowiednie klucze na żądanie za pierwszym razem, gdy ich potrzebujesz.
  • określa, którego agenta użyć albo na podstawie wiersza komend ssh (nazwa hosta i inne) lub bieżącego katalogu roboczego. Jest to szczególnie przydatne, ponieważ zazwyczaj pracuję na różnych ścieżkach, w zależności od tego, co robię.
MarkMo
źródło
0

Oto właściwy sposób, jeśli chcesz użyć agenta 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

Objaśnienie: jeśli masz klucz prywatny w katalogu ~ / .ssh, ssh-agent nie będzie używany. Tak więc tworzymy klucz publiczny pod inną nazwą, aby ssh był zmuszony użyć ssh-agent. Pomaga to również, jeśli nie masz dostępu do kluczy prywatnych (np. Przekazywanie agentów ssh)

Vanuan
źródło
Może to być ssh-add -L, nie ssh-agent.
ives
Dzięki @ives naprawiono
Vanuan