Использование нескольких открытых ключей SSH

97

У меня есть личный аккаунт и корпоративный аккаунт на Unfuddle. В разделе «Развернуть» ключи SSH могут использоваться только для одной учетной записи, поэтому мне нужно создать отдельный ключ SSH на моем ноутбуке для обеих учетных записей. Я побежал, ssh-keygen -t rsaчтобы сгенерировать два ключа с разными именами (personal - это имя по умолчанию, а company - {company} _rsa). Проблема сейчас в том, что кажется, что мой ключ по умолчанию используется везде, и я не могу узнать, как указать ключ для использования в Git для отдельных репозиториев.

Итак, мой вопрос: как мне указать ключ SSH для использования в режиме репо-репо?

Я установил свой ssh_config (~ / .ssh / 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

Мой конфигурационный файл репозитория Git для репо в учетной записи моей компании выглядит так:

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

Поэтому я не уверен, что что-то не так с моей конфигурацией ssh ​​или моей конфигурацией git.

Дейв Лонг
источник
Ваша конфигурация ssh выглядит правильно, я использую аналогичную конфигурацию.
Паŭло Эберманн

Ответы:

109

Если у вас есть активный ssh-agent , в который id_rsaзагружен ваш ключ, проблема, вероятно, заключается в том, что ssh сначала предлагает этот ключ. Unfuddle, вероятно, принимает его для аутентификации (например, в sshd ), но отклоняет его для авторизации доступа к репозиториям компании (например, в любом внутреннем программном обеспечении, которое они используют для авторизации, возможно, в чем-то похожем на Gitolite). Возможно, есть способ добавить ваш личный ключ в корпоративную учетную запись (несколько человек не используют одни corp_rsaи те же файлы открытого и закрытого ключей, не так ли?).


IdentitiesOnly .ssh/configКлючевое слово конфигурации может использоваться для ограничения ключи, SSH предложения на удаленный SSHD только те , которые указаны с помощью IdentityFileключевых слов (т.е. он будет отказаться от использования каких - либо дополнительных клавиш , которые происходят для загрузки в активную SSH-агента ).

Попробуйте эти .ssh/configразделы:

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

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

Затем используйте URL-адреса Git, подобные этим:

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

Если вы хотите в полной мере воспользоваться этим .ssh/configмеханизмом, вы можете указать свое собственное имя хоста и изменить имя пользователя по умолчанию:

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

Затем используйте URL-адреса Git, подобные этим:

uf-mine:{personalaccount}/my-stuff.git
uf-comp:{companyaccount}/their-stuff.git
Крис Джонсен
источник
7
Если у вас есть несколько учетных записей в одном поддомене Unuddle (с разными ключами SSH), вам нужно будет использовать второй метод.
leolobato
IdentitiesOnly было важно для меня в моей настройке Gitolite, спасибо!
Коен.
1
Круто, это исправляет проблему с отправкой всех моих ключей на github. Тем не менее, на OS X я должен вводить мой пароль каждый раз. Есть ли способ сказать, использовать только ключ, указанный в конфигурации, но продолжать использовать агент SSH?
Дрю
1
@Drew: Если ключ уже загружен в агент, команда все равно должна извлечь его из агента. Вы уверены, что ваш ключ предварительно загружен? Проверьте, ssh-add -lпрежде чем использовать псевдоним хоста Git. Также должен присутствовать файл открытого ключа, чтобы ssh мог распознать ключ, который хранит ssh-agent . Вы можете восстановить потерянный .pubфайл с помощью команды, как ssh-keygen -f blah -y > blah.pub.
Крис Джонсен
Да, это там. Когда я удалил вызов IdentitiesOnly, он отправляет github 4 разных ключа (в том числе правильный без запроса пароля). Когда я добавляю вызов, он отправляет только один ключ, но каждый раз запрашивает пароль. Даже когда я говорю OSX сохранить значение ключевой фразы в его цепочке для ключей.
Дрю
3

man ssh_config

Что-то вроде

Host personal_repo
  User personal
  IdentityFile .ssh/personal_rsa

Host company_repo
  User company
  IdentityFile .ssh/company_rsa

И использовать в personal_repoкачестве хоста в вашем git-репо.

Reactormonk
источник
ТАСС, не могли бы вы просмотреть мои изменения, сделанные выше? Я добавил свой ssh_config и мой конфиг git.
Hostэто просто идентификатор - не нужно полное доменное имя. Это, вероятно, создает некоторые скрытые ошибки. Если вы измените это, вам не нужно указывать полное имя в вашем git config.
для gitorious: user = git и хост gitorious.org: например, git@gitorious.org: ~ revelut / qt / bruce-sandbox-qt.git Как вы соотносите в своем хосте часть URL? (обычно ~ для меня)
@ Так что, если я задаю имя company_unfuddle для конфигурации SSH, должен ли мой URL быть git @ company_unfuddle: {company} /overall.git? @ Брюс - я не уверен, что ты спрашиваешь. Не могли бы вы расширить еще немного?
3

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

Я недавно начал использовать:

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

это обертка вокруг ssh, это:

  • хранит совершенно отдельного агента для каждой индивидуальности, которую вы определяете.
  • автоматически обменивается агентами между сеансами входа в систему, ничего не делать в вашем .bashrc.
  • загружает агент и соответствующие ключи по требованию, когда они вам нужны в первый раз.
  • определяет, какой агент использовать на основе командной строки ssh (имя хоста и т. д.) или вашего текущего рабочего каталога. Это особенно удобно, так как я склонен работать по-разному, в зависимости от того, что я делаю.
MarkMo
источник
0

Вот правильный способ, если вы хотите использовать ssh agent:

# 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

Объяснение: если у вас есть закрытый ключ в каталоге ~ / .ssh, ssh-agent не будет использоваться. Поэтому мы создаем открытый ключ под другим именем, так что ssh вынужден использовать ssh-agent. Это также помогает, если у вас нет доступа к закрытым ключам (например, переадресация агента ssh)

Vanuan
источник
это может быть ssh-add -L, нет ssh-agent.
Ives
@ives спасибо, исправлено
Вануан