Використання кількох загальнодоступних ключів SSH


95

У мене є особистий обліковий запис і обліковий запис компанії на Unfuddle. На Unfuddle ключів SSH можна використовувати тільки на одному обліковому записі, тому мені потрібно створити окремий ключ SSH на моєму ноутбуці для обох облікових записів. Я біг ssh-keygen -t rsa генерувати два ключі з різними іменами (особиста назва за замовчуванням, а компанія - {company} _rsa). Тепер проблема полягає в тому, що моя клавіша за замовчуванням використовується скрізь, і я не можу дізнатися, як вказати ключ для використання в Git для окремих репо.

Так що моє питання: Як я можу вказати ключ SSH для використання на основі репо-репо?

Я налаштував мій ssh_config (~ / .ssh / config), але він все одно не працює.

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 repo для репо на обліковому записі моєї компанії виглядає так:

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

Так що я не впевнений, що щось трапилося з моїм ssh config або моїм git config.


Конфігурація ssh виглядає правильно, я використовую подібну конфігурацію.
Paŭlo Ebermann

Відповіді:


108

Якщо у вас є активний ssh-агент що має ваш id_rsa клавіша завантажена, тоді проблема ймовірна ssh пропонує цей ключ. Можливо, обговорення приймає його для автентифікації (наприклад, у sshd ), але відхиляє її для авторизації доступу до репозиторіїв компанії (наприклад, у будь-якому внутрішньому програмному забезпеченні, яке вони використовують для авторизації, можливо, щось схоже на Gitolite). Можливо, є спосіб додати свій особистий ключ до облікового запису компанії (кілька людей не мають спільного доступу corp_rsa файли публічних і приватних ключів, чи вони?).


The 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
Якщо у вас є кілька облікових записів на одному піддомені Unfuddle (з різними ключами SSH), вам потрібно буде використовувати другий метод.
leolobato

Особистість Для мене була дуже важливою в моїй гітолітній установці, спасибі!
Koen.

1
Дивовижне це вирішує проблему, що всі мої ключі надсилаються до github. Тим не менш, на OS X я повинен вводити мою парольну фразу кожен раз. Чи є спосіб сказати тільки використовувати ключ, вказаний в config, але продовжувати використовувати ssh агент?
Drew

1
@Drew: Якщо ключ вже завантажений в агента, то команда повинна ще витягти його з агента. Ви впевнені, що ваш ключ попередньо завантажено? Перевірте з ssh-add -l перед використанням псевдоніма Git хоста. Також має бути присутній файл відкритого ключа ssh може розпізнати ключ, який ssh-агент зберігається. Ви можете відновити втрачене .pub файл з командою, подібною до ssh-keygen -f blah -y > blah.pub.
Chris Johnsen

Так, це там. Коли я видалив виклик IdentitiesOnly, він відправляв github 4 різних клавіш (включаючи правильний, без запиту про фразу). Коли я додаю виклик, він відправляє лише один ключ, але кожен раз запитує пароль. Навіть тоді, коли я скажу OSX, щоб зберегти значення фрази в її брелок.
Drew

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 repo.


Tass, не могли б ви переглянути мої зміни, зроблені вище? Я додав мій ssh_config та мій git config.

Host - це лише ідентифікатор - немає необхідності в повному імені домену. Це, ймовірно, створює деякі приховані помилки. Якщо ви змінили це, не потрібно писати повне ім'я в конфігурації git.

для gitorious, user = git і host gitorious.org: напр. git@gitorious.org: ~ revelut / qt / bruce-sandbox-qt.git Як ​​ви збігаєтеся з хостом у частині URL? (типово ~ revelut для мене)

@Tass, так що якщо я даю ім'я company_unfuddle до конфігурації SSH, чи повинен мій URL git @ company_unfuddle: {company} /overall.git? @Bruce - я не впевнений, що ви просите. Не могли б ви розширити трохи більше?

3

IdentityFile і IdentitiesТільки працюють добре. Що мене турбує, це не забувати використовувати різні імена хостів для підключення, і той факт, що переадресація агента все ще зберігає всі ключі, а це означає, що якщо віддалений хост буде скомпрометований, вони можуть використовувати будь-які мої ідентичності, поки я .

Нещодавно я почав використовувати:

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

це обгортка навколо ssh, це:

  • зберігає повністю окремий агент для кожного ідентифікованого ідентифікатора.
  • автоматично ділиться агентами через сесії входу, нічого не робити у вашому .bashrc.
  • завантажує агент і відповідні клавіші на вимогу при першому необхідності.
  • визначає, який агент використовувати на основі командного рядка ssh (ім'я хоста & amp; such) або поточний робочий каталог. Це особливо зручно, оскільки я, як правило, працюю з різних шляхів залежно від того, що я роблю.

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-agent -L | grep personal > ~/.ssh/personal_identity.pub
ssh-agent -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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.