Verwenden mehrerer öffentlicher SSH-Schlüssel

97

Ich habe ein persönliches Konto und ein Unternehmenskonto bei Unfuddle. On Unfuddle SSH-Schlüssel können nur für ein Konto verwendet werden. Daher muss auf meinem Laptop für beide Konten ein separater SSH-Schlüssel erstellt werden. Ich bin gelaufen ssh-keygen -t rsa, um zwei Schlüssel mit unterschiedlichen Namen zu generieren (personal ist der Standardname und company ist {company} _rsa). Das Problem ist nun, dass mein Standardschlüssel anscheinend überall verwendet wird und ich nicht herausfinden kann, wie ich einen Schlüssel für die Verwendung in Git für einzelne Repos angeben kann.

Meine Frage lautet also: Wie gebe ich einen SSH-Schlüssel an, der von Repo zu Repo verwendet werden soll?

Ich habe meine ssh_config (~ / .ssh / config) eingerichtet, aber es scheint immer noch nicht zu funktionieren.

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

Meine Git-Repo-Konfigurationsdatei für ein Repo auf meinem Firmen-Unfuddle-Konto sieht folgendermaßen aus:

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

Ich bin mir also nicht sicher, ob etwas mit meiner ssh-Konfiguration oder meiner git-Konfiguration nicht stimmt.

Dave Long
quelle
Ihre SSH-Konfiguration sieht richtig aus, ich verwende eine ähnliche Konfiguration.
Paŭlo Ebermann

Antworten:

109

Wenn Sie einen aktiven SSH-Agenten haben , auf dem Ihr id_rsaSchlüssel geladen ist, ist es wahrscheinlich, dass SSH diesen Schlüssel zuerst anbietet. Unfuddle akzeptiert es wahrscheinlich für die Authentifizierung (z. B. in sshd ), lehnt es jedoch für die Autorisierung des Zugriffs auf die Unternehmens-Repositorys ab (z. B. in der internen Software, die für die Autorisierung verwendet wird, möglicherweise ähnlich wie Gitolite). Vielleicht gibt es eine Möglichkeit, Ihren persönlichen Schlüssel zum Unternehmenskonto hinzuzufügen (mehrere Personen teilen nicht die gleichen corp_rsaöffentlichen und privaten Schlüsseldateien, oder?).


Das IdentitiesOnly .ssh/configKonfigurationsschlüsselwort kann verwendet werden, um die Schlüssel, die ssh dem entfernten sshd anbietet, auf die Schlüssel zu beschränken , die über IdentityFileSchlüsselwörter angegeben wurden (dh es werden keine zusätzlichen Schlüssel verwendet, die zufällig in einen aktiven ssh-Agenten geladen werden ).

Probieren Sie diese .ssh/configAbschnitte aus:

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

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

Verwenden Sie dann Git-URLs wie diese:

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

Wenn Sie den .ssh/configMechanismus voll ausnutzen möchten , können Sie Ihren eigenen benutzerdefinierten Hostnamen angeben und den Standardbenutzernamen ändern:

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

Verwenden Sie dann Git-URLs wie diese:

uf-mine:{personalaccount}/my-stuff.git
uf-comp:{companyaccount}/their-stuff.git
Chris Johnsen
quelle
7
Wenn Sie mehrere Konten auf derselben Unfuddle-Unterdomäne haben (mit unterschiedlichen SSH-Schlüsseln), müssen Sie die zweite Methode verwenden.
Leolobato
IdentitiesOnly war für mich in meinem Gitolite-Setup von entscheidender Bedeutung, danke!
Koen.
1
Genial, dies behebt das Problem, dass alle meine Schlüssel an github gesendet werden. Unter OS X muss ich jedoch jedes Mal meine Passphrase eingeben. Gibt es eine Möglichkeit zu sagen, nur den in config angegebenen Schlüssel zu verwenden, aber weiterhin den ssh-Agenten zu verwenden?
Drew
1
@Drew: Wenn der Schlüssel bereits in den Agenten geladen ist, sollte der Befehl ihn dennoch aus dem Agenten ziehen. Sind Sie sicher, dass Ihr Schlüssel vorinstalliert ist? Wenden Sie sich an, ssh-add -lbevor Sie Ihren Git-Host-Alias ​​verwenden. Außerdem muss die Datei mit dem öffentlichen Schlüssel vorhanden sein, damit ssh den von ssh-agent gespeicherten Schlüssel erkennen kann . Sie können eine verlorene .pubDatei mit einem Befehl wie neu generieren ssh-keygen -f blah -y > blah.pub.
Chris Johnsen
Ja, es ist da drin. Als ich den IdentitiesOnly-Aufruf entfernt habe, werden 4 verschiedene Schlüssel gesendet (einschließlich der richtigen, ohne nach einer Passphrase zu fragen). Wenn ich den Anruf hinzufüge, sendet er nur den einen Schlüssel, fordert jedoch jedes Mal die Passphrase an. Auch wenn ich OSX anweise, den Passphrasenwert im Schlüsselbund zu speichern.
Drew
3

man ssh_config

So etwas wie

Host personal_repo
  User personal
  IdentityFile .ssh/personal_rsa

Host company_repo
  User company
  IdentityFile .ssh/company_rsa

Und personal_repoals Host in Ihrem Git-Repo verwenden.

Reactormonk
quelle
Tass, kannst du meine oben vorgenommenen Änderungen überprüfen? Ich habe meine ssh_config und meine git config hinzugefügt.
Hostist nur ein Bezeichner - kein vollständiger Domainname erforderlich. Das schafft wahrscheinlich einige versteckte Fehler. Wenn du das änderst, musst du nicht den vollständigen Namen in deiner Git-Konfiguration buchstabieren.
für gitorious, user = git und host gitorious.org: zB [email protected]: ~ revelut / qt / bruce-sandbox-qt.git Wie passt in deinem Host ein Teil der URL zusammen? (in der Regel ~ Revelut für mich)
@Tass also, wenn ich der SSH-Konfiguration den Namen company_unfuddle gebe, sollte meine URL git @ company_unfuddle sein: {company} /overall.git? @ Bruce - Ich bin nicht sicher, was Sie fragen. Könnten Sie etwas mehr erweitern?
3

IdentityFile und IdentitiesOnly funktionieren gut. Was mich stört, ist, dass ich daran denken muss, unterschiedliche Hostnamen für die Verbindung zu verwenden, und dass die weitergeleitete Agent-Verbindung weiterhin alle Schlüssel enthält. Wenn also der Remote-Host kompromittiert ist, können sie jede meiner Identitäten verwenden, während ich in bin .

Ich habe vor kurzem angefangen mit:

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

es ist eine Hülle um ssh, es:

  • Für jede von Ihnen definierte Identität wird ein völlig separater Agent geführt.
  • teilt Agenten automatisch über Anmeldesitzungen hinweg, was in Ihrer .bashrc-Datei nichts zu tun hat.
  • Lädt den Agenten und die entsprechenden Schlüssel bei Bedarf, wenn Sie sie zum ersten Mal benötigen.
  • Ermittelt anhand der SSH-Befehlszeile (Hostname & so) oder Ihres aktuellen Arbeitsverzeichnisses, welcher Agent verwendet werden soll. Dies ist besonders praktisch, da ich je nach Tätigkeit auf unterschiedlichen Wegen arbeite.
MarkMo
quelle
0

Wenn Sie den ssh-Agenten verwenden möchten, gehen Sie wie folgt vor:

# 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

Erläuterung: Wenn Sie einen privaten Schlüssel in Ihrem ~ / .ssh-Verzeichnis haben, wird ssh-agent nicht verwendet. Also erstellen wir einen öffentlichen Schlüssel unter einem anderen Namen, so dass ssh gezwungen ist, ssh-agent zu verwenden. Dies hilft auch, wenn Sie keinen Zugriff auf private Schlüssel haben (z. B. SSH-Agentenweiterleitung).

Vanuan
quelle
Das könnte sein ssh-add -L, nicht ssh-agent.
Ives
@ives danke, behoben
Vanuan