Как создать много SSH-ключей

Если вы работаете с множеством GitHub или Bitbucket аккаунтов, то вам может понадобится создать несколько SSH-ключей.

1) Просмотр имеющихся SSH-ключей

Неплохо бы проверить (просто чтобы знать) есть ли у вас в системе уже сгенерированные SSH-ключи, для этого нужно просмотреть содержимое папки ~/.ssh:
$ ls -al ~/.ssh
# Lists the files in your .ssh directory, if they exist

2) Создание нового SSH-ключа

Для начала откроем Git Bash и создадим новый SSH-ключ:
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/personalid -C "personalid"

Вместо personalid может быть например, your_email@example.com.
Или вы можете указать имя в формате сервис-логин, например, github.com-activehacker или github.com-jexchan. Имя может быть любым, например, account-one или account-two. Главное требование это чтобы оно было friendly-name. Если у вас всего два аккаунта (личный и рабочий), то можно использовать personal и company соответственно, или personalid и workid, или personal.bitbucket.org и work.bitbucket.org.

Если не задавать имя файла, то SSH-ключ по умолчанию при использовании rsa сохранится по пути: /Users/you/.ssh/id_rsa. Могут быть и другие варианты, в зависимости от алгоритма: id_dsa.pub, id_ecdsa.pub, id_ed25519.pub.

Примеры имен файлов для опции -f:
  • ~/.ssh/id_rsa_activehacker
  • ~/.ssh/id_rsa_jexchan
  • ~/.ssh/key-one
  • ~/.ssh/key-two
  • ~/.ssh/private_ssh_file
  • ~/.ssh/id_rsa_personal
  • ~/.ssh/id_rsa_company

Также для защиты SSH-ключа вам нужно будет ввести секретную фразу (passphrase). В дальнейшем вам не придется вводить её каждый раз т.к. её запомнит утилита ssh-agent.

В результате выполнения этой команды вы должны получить пару public/private key. Пример:
Your identification has been saved in /Users/manthony/.ssh/personalid.
Your public key has been saved in /Users/manthony/.ssh/personalid.pub.

3) Настройка SSH конфигурации

Далее после того как все необходимые ключи созданы нужно отредактировать config-файл по пути  ~/.ssh/config.

Host workid
 HostName bitbucket.org
 IdentityFile ~/.ssh/workid
Host personalid
 HostName bitbucket.org
 IdentityFile ~/.ssh/personalid

После этого ссылка на репозиторий вида git@bitbucket.org:<accountname>/<reponame>.git преображается в ссылку вида git@alias:<accountname>/<reponame>.git.

Через опцию User можно прописать имя пользователя на удаленной машине в config-файл.

Host account-one
HostName server.example.com
User git
IdentityFile ~/.ssh/key-one

Host account-two
HostName server.example.com
User git
IdentityFile ~/.ssh/key-two

Тогда в ссылках не нужно будет в начале указывать git@.

$ git remote add one account-one:repository.git
$ git remote add two account-two:repository.git

4) Добавление SSH-ключа на хостинг проектов

Далее нужно добавить публичный ключ на хостинг. 
Под Git Bash его можно скопировать сразу в буфер обмена:
$ clip < ~/.ssh/id_rsa.pub
# Copies the contents of the id_rsa.pub file to your clipboard
В Linux его можно вывести на консоль и скопировать командой cat:
$ cat ~/.ssh/id_rsa.pub
А в Mac OS X можно сразу скопировать в буфер обмена с помощью команды pbcopy:
$ pbcopy < ~/.ssh/id_rsa.pub


5) Настройка ssh-agent для безопасного хранения и использования SSH-ключей

Далее нужно добавить ключ в ssh-agent. Сначала нужно убедиться, что ssh-agent запущен, для этого под Git Bash нужно выполнить команду:
$ ps | grep ssh-agent 
А под Mac OS X и Linux:
$ ps -e | grep [s]sh-agent 
Чтобы запустить ssh-agent под Git Bash нужно выполнить команду:
# start the ssh-agent in the background
$ eval "$(ssh-agent -s)"
Agent pid 59566
Он будет оставаться запущенным до тех пор пока вы не выйдите из своей учетной записи, или выключите компьютер или убьете процесс.

Просмотреть добавленные в ssh-agent ключи можно командой:
$ ssh-add -l 

Сам ключ добавляется командой:
$ ssh-add ~/.ssh/id_rsa
Ключи добавляются кратковременно и при перезапуске агента будут удалены.
Если нужно чтобы ssh-agent "забыл" ключ спустя какое-то время, то нужно использовать команду:
$ ssh-add -t <seconds>

Чтобы ssh-agent запускался автоматически надо в ~/.profile добавить:
env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; }

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

В данном скрипте команда ssh-add добавляет ключ, который расположен по пути по умолчанию ~/.ssh/id_rsa. Чтобы добавить свой ключ нужно написать 
ssh-add path/to/your/private/key
Тогда ssh-agent запросит пароль на добавление ключа.

ssh поддерживает добавление SSH-ключа к агенту при первом использовании. Для этого надо в файл ~/.ssh/config добавить строку:
AddKeysToAgent yes

6) Тестирование подключения

Для того чтобы протестировать подключение нужно дать команду:
ssh -T git@github.com
# Attempts to ssh to GitHub