Лучший способ использовать несколько закрытых ключей SSH на одном клиенте


874

Я хочу использовать несколько закрытых ключей для подключения к разным серверам или различным частям одного и того же сервера (я использую системное администрирование сервера, администрирование Git и обычное использование Git на одном и том же сервере). Я попытался просто сложить ключи в id_rsaфайлах безрезультатно.

Видимо, простой способ сделать это - использовать команду

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

Это довольно громоздко.

Любые предложения о том, как сделать это немного проще?


1
Я написал эту статью , в которой подробно рассматриваются различные конфигурации и их достоинства / недостатки.
Раффи

Ответы:


1237

Из моего .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

И так далее.


25
Спасибо, Рэндал! Я покопался в .ssh / config и нашел это: github.com/guides/multiple-github-accounts Указал мне в правильном направлении.
Джастин

6
Это было очень полезно (в дополнение к stackoverflow.com/a/3828682/169153 ). Если вы хотите использовать ключи замазки, следуйте этому документу здесь: blog.padraigkitterick.com/2007/09/16/…
Urda

2
Я нашел этот пост очень полезным. Одна ошибка, которую я допустил при создании файла конфигурации, заключалась в том, что я поместил файл .txt в папку .ssh вместо выполнения команды «touch» для создания файла конфигурации.
M_x_r

53
Обратите внимание, что вы также можете указать несколько IdentityFileзаписей для одного и того же Host, которые затем пробуются по порядку при подключении.
13

12
Используйте IdentitiesOnly yesдля предотвращения ~ / .ssh / id_rsa или любых других идентификаторов. (Это было первоначально редактирование)
user3338098

372

Вы можете указать ssh попробовать несколько ключей подряд при подключении. Вот как:

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

Таким образом, вам не нужно указывать, какой ключ работает с каким сервером. Он просто будет использовать первый рабочий ключ.

Кроме того, вы могли бы ввести фразу-пароль, только если данный сервер готов принять ключ. Как видно выше, ssh не пытался запрашивать пароль, .ssh/id_rsaдаже если он у него был.

Конечно, он не превосходит конфигурацию для каждого сервера, как в других ответах, но по крайней мере вам не нужно будет добавлять конфигурацию для всех и каждого сервера, к которому вы подключаетесь!


13
Это фантастическое решение для задаваемого вопроса, но не вполне соответствует потребностям, которые задал вопрос задающему. Для меня это было совершенно правильное решение, и оно полностью соответствует потребности в «Лучшем способе использования нескольких закрытых ключей SSH на одном клиенте».
Уэйд

2
Похоже, это не работает под объявлением хоста в конфигурационном файле
Максим Лузик,

30
Это не очень хорошо работает с git, так как если у вас есть два ключа развертывания github, первый в списке действителен и будет работать, но затем github будет жаловаться, что хранилище не совпадает.
Адам Рейс

1
Если SFTP / целевой сервер имеет политики безопасности, которые блокируют учетную запись (скажем, после трех неудачных попыток подключения), это не приведет к блокировке учетной записи. Попытка подключения, но с файлом «неправильного ключа»
alchemist.gamma

7
Имейте в виду, если у вас есть что-то вроде fail2ban на этих серверах. Вы можете оказаться в одной из этих тюрем ... из-за неудачных попыток, сгенерированных другими ключами ...
Piccolo

254

Ответ от Рэндал Шварц почти помог мне весь путь. У меня другое имя пользователя на сервере, поэтому мне пришлось добавить ключевое слово User в мой файл:

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

Теперь вы можете подключиться, используя friendly-name:

ssh friendly-name

Другие ключевые слова можно найти на странице справки OpenSSH . ПРИМЕЧАНИЕ. Некоторые из перечисленных ключевых слов уже могут присутствовать в вашем файле / etc / ssh / ssh_config .


Если я не ошибаюсь пользователя, которого вы обычно указываете непосредственно в URL при соединении с user @ host
a1an

3
Я предпочитаю также использовать ключевое слово «Порт». Еще одно интересное ключевое слово - StrictHostKeyChecking.
Итан,

122

Предыдущие ответы правильно объяснили способ создания файла конфигурации для управления несколькими ключами SSH. Я думаю, что важная вещь, которую также необходимо объяснить, - это замена имени хоста псевдонимом при клонировании репозитория .

Предположим, имя пользователя вашей учетной записи GitHub - abc1234 . И предположим, что ваша личная учетная запись GitHub называется jack1234

И предположим, что вы создали два ключа RSA, а именно id_rsa_company и id_rsa_personal . Итак, ваш файл конфигурации будет выглядеть так:

# 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

Теперь, когда вы клонируете репозиторий (с именем demo) из учетной записи компании GitHub, URL-адрес репозитория будет выглядеть примерно так:

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

Теперь, делая это git clone, вы должны изменить вышеуказанный URL хранилища следующим образом:

git@company:abc1234/demo.git

Обратите внимание, что теперь github.com заменяется псевдонимом «company», как мы определили в файле конфигурации.

Аналогично, вы должны изменить клонированный URL-адрес хранилища в личной учетной записи в зависимости от псевдонима, указанного в файле конфигурации.


10
Хотелось бы, чтобы этот ответ прозвучал более одного раза ... это правильный способ решения проблемы, и он безопаснее и быстрее, чем другие варианты. Также более масштабируемый (позволяет определять разные ключи для одного и того же имени хоста)
guyarad

4
Не тратьте больше времени, это ответ. Большое спасибо.
Луис Миланезе

2
Мне бы очень хотелось, чтобы я нашел этот ответ раньше ... но лучше поздно, чем никогда, Большое спасибо!
Хильди

2
Отличное объяснение! Работает идеально для меня. И если вы забыли клонировать репо с псевдонимом, вы можете впоследствии отредактировать удаленный URL-адрес источника.
tkahn

1
только обратите внимание, потому что файл конфигурации должен быть (chmod 600)
Christiano Matos

106
ssh-add ~/.ssh/xxx_id_rsa

Убедитесь, что вы проверили это перед добавлением с:

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

Если у вас есть проблемы с ошибками, иногда помогает изменение безопасности файла:

chmod 0600 ~/.ssh/xxx_id_rsa

4
Это наиболее емкое и элегантное решение на мой взгляд. Работал как шарм!
артур

@Bobo, можешь ли ты поместить его в свой bashrc или bash_profile (или как там эквивалент Mac)?
T0xicCode

6
+1 для chmod 0600 - проблемы с разрешениями не позволяли мне подключиться
amacy

Работал как шарм для меня (и не забывайте о 0600 химикатов).
Дмитрий Униченко

1
Пришел из Ubuntu на Mac, и это было именно то, что мне нужно.
Hariom

42
  1. Сгенерируйте ключ SSH:

    $ ssh-keygen -t rsa -C <email1@example.com>
    
  2. Создайте еще один ключ SSH :

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

    Теперь в каталоге должно быть два открытых ключа ( id_rsa.pub , accountB.pub ) ~/.ssh/.

    $ ls -l ~/.ssh     # see the files of '~/.ssh/' directory
    
  3. Создайте файл конфигурации ~/.ssh/configсо следующим содержимым:

    $ 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. Клон со defaultсчета.

    $ git clone git@bitbucket.org:username/project.git
    
  5. Клон с accountBучёта.

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

Смотрите больше здесь


24

Я бы согласился с Туомасом об использовании ssh-agent. Я также хотел добавить второй закрытый ключ для работы, и этот урок работал для меня как очарование.

Шаги, как показано ниже:

  1. $ ssh-agent bash
  2. $ ssh-add /path.to/private/key например ssh-add ~/.ssh/id_rsa
  3. Подтвердить $ ssh-add -l
  4. Проверьте это, $ssh -v <host url>например,ssh -v git@assembla.com

4
Пользуясь ssh-agentгодами, я недавно переключился на использование Gnome gnome-keyringв моем i3wm. Причина проста: менеджер ключей Gnome автоматически обрабатывает добавление и удаление ключей ssh ​​без необходимости помнить об этом ssh-add. Кроме того, предоставив мне один пароль для их разблокировки (и тайм-аут на указанное время, для безопасности). Каждому свое. Так как я использую настройки gnome в Arch, он был подключен к моей настройке. Если вы анти-гном, игнорируйте этот комментарий.
eduncan911

@ eduncan911, я согласен, что gnome-keyring может быть полезен, но на самом деле он не обрабатывает ключи ed25519, так что для меня это не стартер. Обновление: я вижу по wiki.archlinux.org/index.php/GNOME/… теперь он использует системный ssh-agent, так что это больше не проблема.
Брайан Минтон

15

Я столкнулся с этой проблемой некоторое время назад, когда у меня было две учетные записи Bitbucket и мне нужно было хранить отдельные ключи SSH для обеих. Это то, что сработало для меня.

Я создал две отдельные конфигурации ssh следующим образом.

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

Теперь, когда мне пришлось клонировать репозиторий из моей рабочей учетной записи - команда была следующей.

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

Мне пришлось изменить эту команду, чтобы:

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

Точно так же команду клона из моего личного аккаунта пришлось изменить на

git clone git @ personal .bitbucket.org: имя / personalproject.git

Перейдите по этой ссылке для получения дополнительной информации.



11

Теперь, с последней версией Git, мы можем указать sshCommand в конфигурационном файле Git для репозитория:

  [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

Вы можете создать файл конфигурации с именем configв вашей ~/.sshпапке. Может содержать:

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

Это позволит вам подключаться к таким машинам

 ssh aws

Какую форму принимает idFile? Абсолютный путь. Можете ли вы привести пример
Питер Мортенсен

1

ВАЖНО: Вы должны запустить ssh-agent

Вы должны запустить ssh-agent (если он еще не запущен) перед использованием ssh-add следующим образом:

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

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

Обратите внимание, что команда eval запускает агент в Git Bash в Windows. Другие среды могут использовать вариант для запуска агента SSH.


1

На Ubuntu 18.04 (Bionic Beaver) делать нечего.

После успешного создания второго ключа SSH система попытается найти соответствующий ключ SSH для каждого соединения.

Просто чтобы прояснить, вы можете создать новый ключ с помощью этих команд:

# 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

Несколько пар ключей на GitHub

1.0 SSH файл конфигурации

1.1 Создать ~ / .ssh / config

1.2 chmod 600 ~ / .ssh / config ( должен )

1.3 Введите в файл следующее:

Домашняя пицца

HostName github.com

PreferredAuthentications publickey # необязательно

IdentityFile ~ / .ssh / privatekey1

Случай A: Свежий новый клон Git

Используйте эту команду для Git clone:

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

Примечание: Если вы хотите изменить имя хоста «pizza» в .ssh / config в будущем, перейдите в клонированную папку Git, отредактируйте строку URL файла .git / config (см. Пример B)

Случай B: уже есть папка Git clone

2.1 Перейдите в клонированную папку, а затем перейдите в папку .git.

2.2 Редактировать файл конфигурации

2.3 Обновите URL со * старого на новый :

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

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


1

Для меня единственным рабочим решением было просто добавить это в файл ~/.ssh/config:

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

your_ssh_keyбез каких-либо расширений. Не используйте .pub.


0

На CentOS 6.5 с запущенными OpenSSH_5.3p1 и OpenSSL 1.0.1e-fips я решил проблему, переименовав свои ключевые файлы, чтобы ни у одного из них не было имени по умолчанию.

Мой каталог .ssh содержит id_rsa_foo и id_rsa_bar, но не id_rsa и т. Д.


А как ключи привыкают? Есть ли автоопределение?
Робш

См. Ответ Рэндала Шварца о том, как правильно выбрать ключ для данного хоста stackoverflow.com/questions/2419566/…
Крис Оуэнс,

Да, это делает это более явным. Даже использование этой -iопции может привести к чему-то вроде no such identity: /home/embo/.ssh/id_rsa: No such file or directory.
Питер Мортенсен

0

Как уже упоминалось на странице блога Atlassian , создайте файл конфигурации в папке .ssh , включая следующий текст:

#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

Затем вы можете просто оформить заказ с суффиксным доменом, а в рамках проектов вы можете настроить имена авторов и т. Д. Локально.


0

Вот решение, которое я использовал, вдохновленное ответом Саджиб-хана . Конфигурация по умолчанию не установлена; это мой личный кабинет на GitLab а другой указанный - мой аккаунт компании. Вот что я сделал:

Сгенерируйте ключ SSH

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

Изменить конфигурацию SSH

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

Удалить кэшированные ключи SSH

ssh-add -D

Попробуй это!

ssh -T git@company.gitlab.com

Добро пожаловать в GitLab, @ hugo.sohm!

ssh -T git@gitlab.com

Добро пожаловать в GitLab, @HugoSohm!

Используй это!

Корпоративный аккаунт

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

Личная / учетная запись по умолчанию

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

Вот источник, который я использовал.


0

Мне нравится подход, чтобы установить следующее в файле ~ / .ssh / config:

# Configuration 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 repository works and sometimes the
# other depending on which key is used first.
#  AddKeysToAgent yes

# I only use my private id file so all private
# repositories don't need the environment variable
# `GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa"` to be set.
  IdentityFile ~/.ssh/id_rsa

Затем в своем репозитории вы можете создать .envфайл, который будет содержать sshкоманду для использования:

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

Если затем вы используете, например, dotenv, переменная окружения среды экспортируется автоматически, и все равно, вы можете указать ключ, который вы хотите для каждого проекта / каталога. Кодовая фраза запрашивается только один раз, поскольку она добавляется в цепочку для ключей.

Это решение прекрасно работает с Git и предназначено для работы на Mac (благодаря UseKeychain).


-1

Вы можете попробовать этот пакет sshmulti npm для поддержки нескольких ключей SSH.


Я настоятельно рекомендую не использовать npm для чего-либо подобного. У него был каскад зависимостей, который, при кратком рассмотрении, включает ряд разработчиков-одиночек, пакеты нескольких лет. Сама страница sshmulti npm объявляет, что она не проверена.
Джек Уэйси
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.