Beste Möglichkeit, mehrere private SSH-Schlüssel auf einem Client zu verwenden


870

Ich möchte mehrere private Schlüssel verwenden, um eine Verbindung zu verschiedenen Servern oder verschiedenen Teilen desselben Servers herzustellen (meine Verwendungszwecke sind Systemadministration des Servers, Verwaltung von Git und normale Git-Nutzung innerhalb desselben Servers). Ich habe versucht, einfach die Schlüssel in den id_rsaDateien zu stapeln , ohne Erfolg.

Anscheinend ist eine einfache Möglichkeit, dies zu tun, die Verwendung des Befehls

ssh -i <key location> login@server.example.com 

Das ist ziemlich umständlich.

Irgendwelche Vorschläge, wie man das etwas einfacher macht?


1
Ich habe diesen Artikel geschrieben , der sich eingehend mit verschiedenen Konfigurationen und ihren Stärken / Mängeln befasst.
Raffi

Antworten:


1234

Von meinem .ssh/config:

Host myshortname realname.example.com
    HostName realname.example.com
    IdentityFile ~/.ssh/realname_rsa # private key for realname
    User remoteusername

Host myother realname2.example.org
    HostName realname2.example.org
    IdentityFile ~/.ssh/realname2_rsa  # different private key for realname2
    User remoteusername

Und so weiter.


24
Danke Randal! Ich habe ein bisschen in die .ssh / config gegraben und Folgendes gefunden: github.com/guides/multiple-github-accounts Hat mich in die richtige Richtung gelenkt .
Justin

6
Dies war eine große Hilfe (zusätzlich zu stackoverflow.com/a/3828682/169153 ). Wenn Sie Kittschlüssel verwenden
Urda

2
Ich fand diesen Beitrag sehr hilfreich. Ein Fehler, den ich beim Erstellen der Konfigurationsdatei gemacht habe, war, dass ich eine TXT-Datei in den Ordner .ssh gestellt habe, anstatt den Befehl "touch" auszuführen, um eine Konfigurationsdatei zu erstellen.
M_x_r

53
Beachten Sie, dass Sie auch mehrere IdentityFileEinträge für denselben angeben können Host, die dann beim Herstellen der Verbindung in der richtigen Reihenfolge versucht werden.
sschuberth

12
Verwenden Sie IdentitiesOnly yesdiese Option, um ~ / .ssh / id_rsa oder andere Identitäten zu verhindern. (Dies war ursprünglich eine Bearbeitung)
user3338098

369

Sie können ssh anweisen, beim Verbinden mehrere Schlüssel nacheinander auszuprobieren. Hier ist wie:

$ cat ~/.ssh/config
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_rsa_old
IdentityFile ~/.ssh/id_ed25519
# ... and so on

$ ssh server.example.com -v
....
debug1: Next authentication method: publickey
debug1: Trying private key: /home/example/.ssh/id_rsa
debug1: read PEM private key done: type RSA
debug1: Authentications that can continue: publickey
debug1: Trying private key: /home/example/.ssh/id_rsa_old
debug1: read PEM private key done: type RSA
....
[server ~]$

Auf diese Weise müssen Sie nicht angeben, welcher Schlüssel mit welchem ​​Server funktioniert. Es wird nur der erste Arbeitsschlüssel verwendet.

Außerdem würden Sie nur dann eine Passphrase eingeben, wenn ein bestimmter Server bereit ist, den Schlüssel zu akzeptieren. Wie oben gezeigt, hat ssh nicht versucht, nach einem Passwort zu fragen, .ssh/id_rsaauch wenn es eines hatte.

Sicherlich übertrifft es eine Konfiguration pro Server nicht wie in anderen Antworten, aber zumindest müssen Sie keine Konfiguration für alle Server hinzufügen, mit denen Sie eine Verbindung herstellen!


12
Dies ist eine fantastische Lösung für die gestellte Frage, entspricht jedoch nicht ganz den vom Fragesteller beabsichtigten Anforderungen. Für mich war es genau die richtige Lösung und es erfüllt perfekt die Anforderung nach dem "besten Weg, mehrere private SSH-Schlüssel auf einem Client zu verwenden".
Wade

2
Dies scheint unter der Host-Deklaration in der Konfigurationsdatei nicht zu funktionieren
Maksim Luzik

29
Dies funktioniert mit git nicht gut. Wenn Sie zwei Github-Bereitstellungsschlüssel haben, ist der erste in der Liste gültig und funktioniert. Github beschwert sich jedoch, dass das Repository nicht übereinstimmt.
Adam Reis

Dies ist ein dynamischerer Ansatz, der in bestimmten Situationen hervorragend funktioniert. Vielen Dank dafür
Gbolo

7
Seien Sie sich bewusst, wenn Sie auf diesen Servern so etwas wie fail2ban haben. Sie könnten in einem dieser Gefängnisse landen ... wegen der fehlgeschlagenen Versuche, die von den anderen Schlüsseln generiert wurden ...
Piccolo

254

Die Antwort von Randal Schwartz hat mir fast den ganzen Weg geholfen. Ich habe einen anderen Benutzernamen auf dem Server, daher musste ich meiner Datei das Schlüsselwort User hinzufügen :

Host           friendly-name
HostName       long.and.cumbersome.server.name
IdentityFile   ~/.ssh/private_ssh_file
User           username-on-remote-machine

Jetzt können Sie eine Verbindung mit dem Anzeigenamen herstellen:

ssh friendly-name

Weitere Schlüsselwörter finden Sie auf der OpenSSH-Manpage . HINWEIS: Einige der aufgelisteten Schlüsselwörter sind möglicherweise bereits in Ihrer Datei / etc / ssh / ssh_config vorhanden .


Wenn ich mich nicht irre, geben Sie den Benutzer normalerweise direkt in der URL an, wenn Sie eine Verbindung mit user @ host herstellen
a1an

3
Ich bevorzuge es auch, das Schlüsselwort 'Port' zu verwenden. Ein weiteres interessantes Schlüsselwort ist 'StrictHostKeyChecking'.
Ethan

121

In den vorherigen Antworten wurde die Art und Weise, wie eine Konfigurationsdatei zum Verwalten mehrerer SSH-Schlüssel erstellt wird, ordnungsgemäß erläutert. Ich denke, das Wichtigste, was ebenfalls erklärt werden muss, ist das Ersetzen eines Hostnamens durch einen Aliasnamen beim Klonen des Repositorys .

Angenommen, der Benutzername des GitHub-Kontos Ihres Unternehmens lautet abc1234 . Angenommen, der Benutzername Ihres persönlichen GitHub-Kontos lautet jack1234

Angenommen, Sie haben zwei RSA-Schlüssel erstellt, nämlich id_rsa_company und id_rsa_personal . Ihre Konfigurationsdatei sieht also wie folgt aus:

# Company account
Host company
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_company

# Personal account
Host personal
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_personal

Wenn Sie nun das Repository (benannte Demo) vom GitHub-Konto des Unternehmens klonen , lautet die Repository-URL wie folgt:

Repo URL: git@github.com:abc1234/demo.git

Währenddessen git clonesollten Sie die obige Repository-URL wie folgt ändern:

git@company:abc1234/demo.git

Beachten Sie, wie github.com jetzt durch den Alias ​​"Firma" ersetzt wird, wie wir ihn in der Konfigurationsdatei definiert haben.

Ebenso müssen Sie die Klon-URL des Repositorys im persönlichen Konto abhängig vom in der Konfigurationsdatei angegebenen Alias ​​ändern.


10
Ich wünschte, ich könnte diese Antwort mehr als einmal positiv bewerten ... dies ist der richtige Weg, um das Problem anzugehen, und es ist sicherer und schneller als andere Optionen. Skalierbarer (ermöglicht das Definieren verschiedener Schlüssel für denselben Hostnamen)
guyarad

4
Verschwenden Sie keine Zeit mehr, das ist DIE Antwort. Danke vielmals.
Luis Milanese

2
Ich wünschte wirklich, ich hätte diese Antwort früher gefunden ... aber besser spät als nie, vielen Dank!
Hildy

2
Tolle Erklärung! Funktioniert perfekt für mich. Und wenn Sie vergessen haben, das Repo mit dem Alias ​​zu klonen, können Sie die Remote-Ursprungs-URL anschließend häufig bearbeiten.
Tkahn

1
Bezahle nur, weil die Konfigurationsdatei (chmod 600) sein muss
Christiano Matos

105
foo:~$ssh-add ~/.ssh/xxx_id_rsa

Stellen Sie sicher, dass Sie es testen, bevor Sie Folgendes hinzufügen:

ssh -i ~/.ssh/xxx_id_rsa username@example.com

Wenn Sie Probleme mit Fehlern haben, hilft manchmal das Ändern der Sicherheit der Datei:

chmod 0600 ~/.ssh/xxx_id_rsa

4
Dies ist meiner Meinung nach die prägnanteste und eleganteste Lösung. Lief wie am Schnürchen!
Artur

@ Bobo kannst du es in dein bashrc oder bash_profile einfügen (oder was auch immer das Mac-Äquivalent ist)?
T0xicCode

6
+1 für chmod 0600 - Berechtigungsprobleme hinderten mich daran, eine Verbindung
herzustellen

Hat wie ein Zauber für mich funktioniert (und 0600 Dauerwellen nicht vergessen).
Dmytro Uhnichenko

1
Kam von Ubuntu auf dem Mac und das war genau das, was ich brauchte.
Hariom

42
  1. SSH-Schlüssel generieren:

    $ ssh-keygen -t rsa -C <email1@example.com>
    
  2. Generieren another SSH key:

    $ ssh-keygen -t rsa -f ~/.ssh/accountB -C <email2@example.com>
    

    Jetzt sollten zwei öffentliche Schlüssel ( id_rsa.pub , accountB.pub ) im ~/.ssh/Verzeichnis vorhanden sein.

    $ ls -l ~/.ssh     # see the files of '~/.ssh/' directory 
    
  3. Erstellen Sie eine Konfigurationsdatei ~/.ssh/configmit folgendem Inhalt:

    $ nano ~/.ssh/config
    
    Host bitbucket.org  
        User git  
        Hostname bitbucket.org
        PreferredAuthentications publickey  
        IdentityFile ~/.ssh/id_rsa  
    
    Host bitbucket-accountB  
        User git  
        Hostname bitbucket.org  
        PreferredAuthentications publickey  
        IdentitiesOnly yes  
        IdentityFile ~/.ssh/accountB  
    
  4. Vom defaultKonto klonen .

    $ git clone git@bitbucket.org:username/project.git
    
  5. Vom accountBKonto klonen .

    $ git clone git@bitbucket-accountB:username/project.git
    

Sehen Sie hier mehr


24

Ich würde Tuomas bezüglich der Verwendung von ssh-agent zustimmen. Ich wollte auch einen zweiten privaten Schlüssel für die Arbeit hinzufügen, und dieses Tutorial hat mir sehr gut gefallen.

Die Schritte sind wie folgt:

  1. $ ssh-agent bash
  2. $ ssh-add /path.to/private/key z.B ssh-add ~/.ssh/id_rsa
  3. Überprüfen durch $ ssh-add -l
  4. Testen Sie es mit $ssh -v <host url>zssh -v git@assembla.com

4
Nachdem ssh-agentich jahrelang verwendet habe, habe ich kürzlich auf Gnome's gnome-keyringin meinem i3Wm umgestellt. Der Grund ist einfach: Der Schlüsselring-Manager von Gnome übernimmt automatisch das Hinzufügen und Entfernen von SSH-Schlüsseln, ohne dass ich mich daran erinnern muss ssh-add. Außerdem erteile ich ein einziges Passwort, um sie zu entsperren (und aus Sicherheitsgründen eine Zeitüberschreitung zu einem bestimmten Zeitpunkt). Jedem sein eigenes. Da ich Gnome-Einstellungen auf Arch verwende, war es Plug-and-Play mit meinem Setup. Wenn Sie ein Anti-Gnom sind, ignorieren Sie diesen Kommentar.
eduncan911

@ eduncan911, ich stimme zu, dass Gnome-Schlüsselbund hilfreich sein kann, aber es behandelt nicht wirklich ed25519-Schlüssel, so dass für mich ein Nichtstarter ist. Update: Ich sehe aus wiki.archlinux.org/index.php/GNOME/…, dass es jetzt den ssh-Agenten des Systems verwendet, so dass dies kein Problem mehr ist.
Brian Minton

15

Ich war vor einiger Zeit auf dieses Problem gestoßen, als ich zwei Bitbucket-Konten hatte und separate SSH-Schlüssel für beide speichern wollte. Das hat bei mir funktioniert.

Ich habe zwei separate SSH-Konfigurationen wie folgt erstellt.

Host personal.bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile /Users/username/.ssh/personal
Host work.bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile /Users/username/.ssh/work

Als ich nun ein Repository von meinem Arbeitskonto klonen musste, lautete der Befehl wie folgt.

git clone git@bitbucket.org:teamname/project.git

Ich musste diesen Befehl ändern, um:

git clone git@**work**.bitbucket.org:teamname/project.git

Ebenso musste der Klonbefehl von meinem persönlichen Konto auf geändert werden

git clone git @ personal .bitbucket.org: name / personalproject.git

Weitere Informationen finden Sie unter diesem Link .



11

Mit der neuesten Version von git können wir jetzt sshCommand in der repository-spezifischen git-Konfigurationsdatei angeben .

  [core]
      repositoryformatversion = 0
      filemode = true
      bare = false
      logallrefupdates = true
      sshCommand = ssh -i ~/.ssh/id_rsa_user   
   [remote "origin"]
      url = git@bitbucket.org:user/repo.git
      fetch = +refs/heads/*:refs/remotes/origin/*

1

WICHTIG: Sie müssen ssh-agent starten

Sie müssen ssh-agent starten (falls es noch nicht ausgeführt wird), bevor Sie ssh-add wie folgt verwenden:

eval `ssh-agent -s` # start the agent

ssh-add id_rsa_2 # where id_rsa_2 is your new private key file

Beachten Sie, dass der Befehl eval den Agenten bei GIT-Bash unter Windows startet. Andere Umgebungen verwenden möglicherweise eine Variante, um den SSH-Agenten zu starten.


1

Sie können eine Konfigurationsdatei mit dem Namen configin Ihrem ~/.sshOrdner erstellen . Es kann enthalten:

Host aws
    HostName *yourip*
    User *youruser*
    IdentityFile *idFile*

Auf diese Weise können Sie eine Verbindung zu solchen Computern herstellen

 ssh aws

1

Am Ubuntu 18.04 gibt es nichts zu tun.

Nachdem ein zweiter SSH-Schlüssel erfolgreich erstellt wurde, versucht das System, für jede Verbindung einen passenden SSH-Schlüssel zu finden.

Um klar zu sein, können Sie mit diesen Befehlen einen neuen Schlüssel erstellen

# generate key make sure you give it a new name (id_rsa_server2)
ssh-keygen 
# make sure ssh agent is running
eval `ssh-agent`
# add the new key
ssh-add ~/.ssh/id_rsa_server2
# get the public key to add it to a remote system for authentication
cat ~/.ssh/id_rsa_server2.pub

1

Mehrere Schlüsselpaare in GITHUB

1.0 SSH-KONFIG-DATEI

1.1 CREATE ~ / .ssh / config

1.2 chmod 600 ~ / .ssh / config (MUSS)

1.3 Eingabe folgend in die Datei:

Host Pizza

Hostname github.com

PreferredAuthentications publickey # optional

IdentityFile ~ / .ssh / privatekey1

Fall A: FRESH NEW GIT CLONE

Verwenden Sie diesen Befehl, um einen Klon zu erstellen:

$ git clone git @ pizza: yourgitusername / pizzahut_repo.git

Hinweis: Wenn Sie den Hostnamen "pizza" von .ssh / config in Zukunft ändern möchten, gehen Sie in den geklonten git-Ordner und bearbeiten Sie die URL-Zeile der .git / config-Datei (siehe Fall B).

Fall B: HABEN SIE BEREITS GIT CLONE FOLDER

2.1 Wechseln Sie in den geklonten Ordner und dann in den Ordner .git

2.2 Konfigurationsdatei bearbeiten

2.3 Aktualisieren Sie die URL von Alt auf Neu:

(Old) url = git@github.com:yourgitusername/pizzahut_repo.git    

(New) url = git@pizza:yourgitusername/pizzahut_repo.git


1

Für mich war die einzige funktionierende Lösung, einfach hinzuzufügen ~/.ssh/config

Host *
  IdentityFile ~/.ssh/your_ssh_key
  IdentityFile ~/.ssh/your_ssh_key2
  IdentityFile ~/.ssh/your_ssh_key3
  AddKeysToAgent yes

your_ssh_key ist ohne Erweiterung, nicht verwenden .pub


0

Unter Centos 6.5 mit OpenSSH_5.3p1, OpenSSL 1.0.1e-fips habe ich das Problem gelöst, indem ich meine Schlüsseldateien so umbenannt habe, dass keine von ihnen den Standardnamen hatte. Mein .ssh-Verzeichnis enthält id_rsa_foo und id_rsa_bar, aber keine id_rsa usw.


Und wie werden die Schlüssel benutzt? Gibt es eine automatische Erkennung?
Robsch

Siehe Randal Schwartz 'Antwort für eine Möglichkeit, den richtigen Schlüssel für einen bestimmten Host zu wählen stackoverflow.com/questions/2419566/…
Chris Owens

0

Wie auf der atlassianischen Blog-Seite erwähnt, generieren Sie eine Konfiguration in .ssh mit dem folgenden Text:

#user1 account
 Host bitbucket.org-user1
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user1
     IdentitiesOnly yes

 #user2 account
 Host bitbucket.org-user2
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user2
     IdentitiesOnly yes

Anschließend können Sie einfach mit der Suffixdomäne auschecken und innerhalb der Projekte die Autorennamen usw. lokal konfigurieren.


0

Sie können dieses sshmulti npm-Paket ausprobieren, um mehrere ssh-Schlüssel zu verwalten.


Ich würde dringend empfehlen , npm für so etwas nicht zu verwenden. Es gab eine Kaskade von Abhängigkeiten, zu denen nach einer kurzen Betrachtung eine Reihe von Einzelgänger-Entwicklern und mehrere Jahre alten Paketen gehörten. Die Seite sshmulti npm selbst erklärt, dass sie nicht getestet wurde.
Jack Wasey

0

Hier ist die Lösung, die ich verwendet habe, inspiriert von der Antwort von @ sajib-khan. Die Standardkonfiguration ist nicht festgelegt, es ist mein persönliches Konto bei gitlab und das andere angegebene ist mein Firmenkonto. Hier was ich getan habe:

Generieren Sie den SSH-Schlüssel

ssh-keygen -t rsa -f ~/.ssh/company -C "name.surname@company.com"

Bearbeiten Sie die SSH-Konfiguration

nano ~/.ssh/config

    Host company.gitlab.com
    HostName gitlab.com
    PreferredAuthentications publickey  
    IdentityFile ~/.ssh/company

Löschen Sie zwischengespeicherte SSH-Schlüssel.

ssh-add -D

Probier es aus !

ssh -T git@company.gitlab.com

Willkommen bei GitLab, @ hugo.sohm!

ssh -T git@gitlab.com

Willkommen bei GitLab, @HugoSohm!

Benutze es !

Firmenkonto

$ git clone git@company.gitlab.com:group/project.git

Persönliches / Standardkonto

$ git clone git@gitlab.com:username/project.git

Hier ist die Quelle , die ich verwendet habe, hoffe es hilft!


0

Ich liebe den Ansatz, Folgendes in ~ / .ssh / config festzulegen:

# Config for Github to support multiple Github keys
Host  github.com
  HostName github.com
  User git
# UseKeychain adds each keys passphrase to the keychain so you don't have to enter the passphrase each time.
  UseKeychain yes
# AddKeysToAgent would add the key to the agent whenever it is used, which might lead to debugging confusion since then sometimes the one repo works and sometimes the other depending on which key is used first.
#  AddKeysToAgent yes
# I only use my private id file so all private repos don't need the env var `GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa"` to be set.
  IdentityFile ~/.ssh/id_rsa

Dann können Sie in Ihrem Repo eine .envDatei erstellen , die den zu verwendenden Befehl ssh enthält:

GIT_SSH_COMMAND="ssh -i ~/.ssh/your_ssh_key"

Wenn Sie dann zB dotenv verwenden, wird die Umgebungsvariable automatisch exportiert und whoop whoop Sie können den gewünschten Schlüssel pro Projekt / Verzeichnis angeben. Die Pasphrase wird nur einmal abgefragt, da sie dem Schlüsselbund hinzugefügt wird.

Diese Lösung funktioniert perfekt mit Git und wurde entwickelt, um auf einem Mac zu funktionieren (aufgrund von UseKeychain).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.