web-dev-qa-db-fra.com

Meilleure façon d'utiliser plusieurs clés privées SSH sur un client

Je souhaite utiliser plusieurs clés privées pour me connecter à différents serveurs ou à différentes parties d'un même serveur (mes utilisations sont l'administration système du serveur, l'administration de Git et l'utilisation normale de Git sur le même serveur). J'ai simplement essayé d'empiler les clés dans les fichiers id_rsa en vain.

Apparemment, un moyen simple de le faire est d'utiliser la commande

ssh -i <key location> [email protected] 

C'est assez lourd.

Des suggestions sur la façon de s'y prendre un peu plus facilement?

791
Justin

De mon .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

Etc.

1130
Randal Schwartz

Vous pouvez demander à ssh d'essayer plusieurs clés successivement lors de la connexion. Voici comment:

$ 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 ~]$

De cette façon, vous n'avez pas à spécifier quelle clé fonctionne avec quel serveur. Il ne vous reste plus qu'à utiliser la première clé de travail.

De plus, vous ne saisirez une phrase secrète que si un serveur donné est prêt à accepter la clé. Comme on le voit ci-dessus, ssh n'a pas essayé de demander un mot de passe pour .ssh/id_rsa même s'il en avait un.

Certes, elle ne surpasse pas la configuration par serveur comme dans les autres réponses, mais au moins vous n’aurez pas à ajouter de configuration pour tous les serveurs auxquels vous vous connectez!

291
spacesix

Le réponse de Randal Schwartz m'a presque aidé tout le chemin. J'ai un nom d'utilisateur différent sur le serveur, je devais donc ajouter le mot clé Utilisateur à mon fichier:

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

Maintenant, vous pouvez vous connecter en utilisant le nom convivial:

ssh friendly-name

Vous trouverez plus de mots-clés sur le page de manuel OpenSSH . REMARQUE: Certains des mots-clés répertoriés sont peut-être déjà présents dans votre fichier /etc/ssh/ssh_config . .

246
peron
foo:~$ssh-add ~/.ssh/xxx_id_rsa

Assurez-vous de le tester avant d'ajouter avec:

ssh -i ~/.ssh/xxx_id_rsa [email protected]

Si vous rencontrez des problèmes avec des erreurs, il est parfois utile de modifier la sécurité du fichier:

chmod 0600 ~/.ssh/xxx_id_rsa
98
user420807

Les réponses précédentes ont bien expliqué la manière de créer un fichier de configuration pour gérer plusieurs clés SSH. Je pense que la chose importante qui doit également être expliquée est le remplacement d'un nom d'hôte par un nom d'alias lors du clonage du référentiel.

Supposons que votre le nom d'utilisateur du compte GitHub de la société est abc1234. Et supposons que votre le nom d'utilisateur du compte personnel GitHub est jack1234

Et supposons que vous ayez créé deux clés RSA, à savoir id_rsa_company et id_rsa_personal. Ainsi, votre fichier configuration ressemblera à celui ci-dessous:

# 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

Maintenant, lorsque vous clonez le référentiel (nommé démo) à partir du compte GitHub de la société, l'URL du référentiel ressemblera à quelque chose: :

Repo URL: [email protected]:abc1234/demo.git

Maintenant, tout en faisant git clone, vous devez modifier l’URL du référentiel ci-dessus comme suit:

git@company:abc1234/demo.git

Notez comment github.com est maintenant remplacé par l'alias "company" tel que défini dans le fichier de configuration.

De même, vous devez modifier l'URL de clone du référentiel dans le compte personnel en fonction de l'alias fourni dans le fichier de configuration.

86
oblivion
  1. Générer une clé SSH:

    $ ssh-keygen -t rsa -C <[email protected]>
    
  2. Générer another SSH key:

    $ ssh-keygen -t rsa -f ~/.ssh/accountB -C <[email protected]>
    

    Maintenant, deux clés publiques ( id_rsa.pub , accountB.pub ) devrait exister dans le répertoire ~/.ssh/.

    $ ls -l ~/.ssh     # see the files of '~/.ssh/' directory 
    
  3. Créez le fichier de configuration ~/.ssh/config avec le contenu suivant:

    $ 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. Cloner à partir du compte default.

    $ git clone [email protected]:username/project.git
    
  5. Cloner à partir du compte accountB.

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

Voir plus ici

26
Sajib Khan

Je suis d'accord avec Tuomas sur l'utilisation de ssh-agent. Je voulais aussi ajouter une deuxième clé privée pour travailler et ce tutoriel a fonctionné comme un charme pour moi.

Les étapes sont les suivantes:

  1. $ ssh-agent bash
  2. $ ssh-add /path.to/private/key par exemple ssh-add ~/.ssh/id_rsa
  3. Vérifier par $ ssh-add -l
  4. Testez-le avec $ssh -v <Host url> par exemple ssh -v [email protected]
22
Wahib Ul Haq

J'avais rencontré ce problème il y a quelque temps, lorsque j'avais deux comptes Bitbucket et que je voulais stocker des clés SSH distinctes pour les deux. C'est ce qui a fonctionné pour moi.

J'ai créé deux configurations ssh distinctes comme suit.

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

Maintenant, lorsque je devais cloner un référentiel à partir de mon compte professionnel, la commande était la suivante.

git clone [email protected]:teamname/project.git

J'ai dû modifier cette commande pour:

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

De même, la commande de clone de mon compte personnel a dû être modifiée pour

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

Reportez-vous à ce lien pour plus d'informations.

13
Ananth Pai

Utilisez ssh-agent pour vos clés.

11
Tuomas Pelkonen

Maintenant, avec la version récente de git, nous pouvons spécifier sshCommand dans un fichier de configuration git spécifique au référentiel.

  [core]
      repositoryformatversion = 0
      filemode = true
      bare = false
      logallrefupdates = true
      sshCommand = ssh -i ~/.ssh/id_rsa_user   
   [remote "Origin"]
      url = [email protected]:user/repo.git
      fetch = +refs/heads/*:refs/remotes/Origin/*
8
Naga Kiran

Sur ubuntu 18.04 il n’ya rien à faire.

Après avoir créé avec succès une deuxième clé ssh, le système essaiera de trouver une clé ssh correspondante pour chaque connexion.

Pour être clair, vous pouvez créer une nouvelle clé avec ces commandes

# 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
GiorgosK

Vous pouvez créer un fichier de configuration nommé config dans votre dossier ~/.ssh. Il peut contenir:

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

Cela vous permettra de vous connecter à des machines comme celle-ci.

 ssh aws
1
Andrew Crowley

IMPORTANT: Vous devez démarrer ssh-agent

Vous devez démarrer ssh-agent (s'il ne s'exécute pas déjà) avant d'utiliser ssh-add comme suit:

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

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

Notez que la commande eval démarre l'agent sur GIT bash sur Windows. D'autres environnements peuvent utiliser une variante pour démarrer l'agent SSH.

1
danday74

Comme mentionné sur page du blog atlassian générer une config dans . Ssh , y compris le texte suivant:

#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

Ensuite, vous pouvez simplement valider avec le domaine de suffixe et, dans les projets, vous pouvez configurer les noms d’auteurs, etc. localement.

0
dgbt

Sur Centos 6.5 exécutant OpenSSH_5.3p1, OpenSSL 1.0.1e-fips, j'ai résolu le problème en renommant mes fichiers de clé de sorte qu'aucun d'entre eux ne porte le nom par défaut. Mon répertoire .ssh contient id_rsa_foo et id_rsa_bar mais pas id_rsa, etc.

0
Chris Owens