Настройка доступа по SSH к нескольким профилям на GitHub с одного компьютера
При любом сохранении данных из локального Git-репозитория в репозиторий на GitHub (например, при выполнении команды git push) сервер проводит аутентификацию пользователя, чтобы понять, кто именно к нему обращается. При этом можно каждый раз с клавиатуры вводить своё имя и пароль, под которыми мы регистрировались на GitHub, но гораздо удобнее один раз настроить аутентификацию по ключам SSH. После этого процедура проверки подлинности будет проходить незаметно для нас, никакие дополнительные пароли вводить не придётся.
Если вы работаете на GitHub только с одним профилем, то настроить аутентификацию по ключам SSH совсем несложно (далее мы подробно рассмотрим, как это делается). Но иногда бывает необходимо заходить в GitHub под разными пользователями (например, одна учётная запись для личных проектов, а другая – для рабочих). Как в этом случае избавиться от надоедливого ввода пароля при каждом сохранении изменений в удалённом репозитории?
В этой статье мы покажем, как настроить аутентификацию по SSH-ключам для работы с разными профилями на GitHub с одного и того же компьютера. Для этого необходимо сделать три шага:
1. Создать SSH-ключи и настроить доступ по ним к первой учётной записи на GitHub.
2. Создать SSH-ключи и настроить доступ по ним ко второй учётной записи на GitHub.
3. Настроить SSH на работу с разными ключами в зависимости от адреса GitHub-репозитория, к которому идёт обращение.
Шаг 1. Настраиваем доступ по SSH-ключам к первому профилю
SSH (Secure Shell) – это защищённый протокол для доступа к удалённым компьютерам, находящимся в сети. Подключившись к компьютеру по SSH, мы сможем работать в оболочке командной строки, запущенной на этом компьютере. Визуально это выглядит так, что мы работаем в окне терминала на своей машине, но по факту выполняем команды на другом компьютере, который физически может находиться на расстоянии тысяч километров от нас. Для проверки подлинности пользователя используются пары SSH-ключей:
— Закрытый ключ (private key) – это файл, который создаётся и хранится на локальном компьютере. Этот файл нельзя никому передавать, его содержимое ни в коем случае не должно попасть в чужие руки!
— Открытый ключ (public key) – это файл, генерируемый совместно с закрытым ключом, который можно свободно распространять.
Закрытый и открытый ключи соответствуют друг другу, как ключ и замок. Если информация зашифрована одним из этих ключей, то расшифровать её можно только с помощью другого ключа.
В случае с GitHub это работает так: закрытый ключ хранится на вашем компьютере, а содержимое открытого ключа регистрируется в вашем профиле на сервере GitHub . Когда серверу поступает запрос на изменение в репозитории, эти ключи сравниваются, и если они соответствуют друг другу, то аутентификация пользователя считается успешной.
Процесс настройки SSH-ключей выглядит практически одинаково для любой современной операционной системы (Windows 10, macOS, Linux), за исключением путей к домашнему каталогу пользователя. Мы будем работать в Windows 10, где путь к домашнему каталогу имеет вид C:\Users\имя_пользователя (этот путь хранится в переменной среды HOMEPATH).
Генерируем пару ключей на локальной машине
Сначала на своём компьютере сгенерируем пару из открытого и закрытого ключей. Для этого откроем стандартную командную строку Windows и выполним команду ssh-keygen (в устаревших версиях Windows данная команда может отсутствовать, в этом случае команду ssh-keygen нужно запустить в оболочке Git Bash, которая устанавливается на компьютер вместе с Git):
Здесь мы вводим имя файла, в котором будет сохранён новый ключ (файлы с SSH-ключами принято держать в директории .ssh в домашнем каталоге пользователя). По умолчанию предлагается имя id_rsa, мы оставим его, нажав
Как видим, утилита ssh-keygen создала директорию .ssh в домашнем каталоге пользователя (в нашем случае это пользователь с именем andrv) и запрашивает дополнительное ключевое слово passphrase – это пароль для повышенной защиты SSH-ключей. Мы оставим его пустым, дважды нажав
В результате в каталоге .ssh созданы два файла: id_rsa (закрытый ключ) и id_rsa.pub (открытый ключ):
Открытый ключ из файла id_rsa.pub мы должны зарегистрировать в своём профиле на GitHub. Посмотрим содержимое этого файла с помощью команды type:
Для того, чтобы записать публичный ключ на GitHub, нужно сохранить содержимое файла id_rsa.pub в буфере обмена. Для этого можно воспользоваться стандартной для Windows 10 утилитой clip, передавая ей в качестве входного потока нужный файл:
Другой вариант – открыть файл с ключом в Блокноте, выбрав его в Проводнике или выполнив команду notepad %HOMEPATH%\.ssh\id_rsa.pub, а там уже скопировать содержимое файла в буфер обмена.
Сохраняем открытый ключ в профиле на GitHub
Теперь содержимое файла id_rsa.pub, которое мы скопировали в буфер обмена, нужно сохранить в настройках своего профиля на GitHub.
Для этого зайдем на GitHub под своей учётной записью (в нашем примере это пользователь andpop), кликнем на треугольнике справа от своей аватарки в верхнем правом углу окна и в открывшемся списке выберем пункт Settings.
В открывшемся окне нужно выбрать пункт SSH and GPG keys:
Появится список SSH-ключей, которые мы регистрировали для нашей учётной записи ранее (их может быть несколько), и кнопка New SSH key для ввода нового ключа:
Для регистрации нового ключа нужно:
1. В поле Title ввести его название. Оно нужно только для информации о том, для какого компьютера вы добавили ключ, больше мы его нигде использовать не будем.
2. В поле Key вставить содержимое открытого ключа, который мы заранее сохранили в буфере обмена.
После нажатия кнопки Add SSH key GitHub может запросить ваш пароль для подтверждения регистрации нового ключа:
На этом настройка SSH-ключей для вашей первой учетной записи завершена, теперь изменения из локального репозитория будут сохраняться на GitHub без запроса имени и пароля пользователя.
Отметим, что при первом обращении к GitHub с использованием SSH-ключей в консоли вы получите такое сообщение:
The authenticity of host 'github.com (140.82.121.3)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Пугаться этого не стоит, дело в том, что при SSH-соединении не только сервер удостоверяется в подлинности клиента, но и клиент проверяет, знаком ли ему данный сервер, заходил ли он на него ранее. Поэтому при первом подключении к серверу GitHub нужно ответить yes, при этом уникальная комбинация символов, идентифицирующая сервер (RSA key fingerprint), сохранится на нашем компьютере, а сервер GitHub будет добавлен в список известных хостов. При всех последующих обращениях к GitHub этот вопрос задаваться не будет.
Шаг 2. Настраиваем ключи для второго профиля
Для второй учётной записи мы должны сгенерировать новую пару SSH-ключей. Для этого вновь воспользуемся командой ssh-keygen, указав другое имя файла для нового ключа (в нашем случае это id_rsa_work в той же директории .ssh домашнего каталога):
Теперь в каталоге %HOMEPATH%\.ssh у нас хранятся две пары SSH-ключей:
Новый публичный ключ, записанный в файле id_rsa_work.pub, нужно зарегистрировать в настройках второй нашей учётной записи на GitHub. Эта процедура полностью аналогична рассмотренной выше регистрации SSH-ключа из id_rsa_work.pub для первой учетной записи, поэтому подробно на ней мы останавливаться не будем.
Шаг 3. Настраиваем SSH на работу с двумя парами ключей
Итак, мы имеем две пары SSH-ключей для доступа к репозиториям двух пользователей GitHub:
— ключ id_rsa для личной учётной записи;
— ключ id_rsa_work для рабочей учётной записи.
Теперь в каталоге %HOMEPATH%\.ssh нужно создать конфигурационный файл с именем config и записать туда параметры подключения к серверу GitHub для каждого ключа:
# Личная учетка andpop на GitHub
Host github.com
HostName github.com
User git
AddKeysToAgent yes
IdentityFile C:\Users\andrv\.ssh\id_rsa
# Рабочая учетка andpop-mrsu на GitHub
Host github.com-work
HostName github.com
User git
AddKeysToAgent yes
IdentityFile C:\Users\andrv\.ssh\id_rsa_work
По этим параметрам клиентский SSH-агент определит, какой именно ключ нужно использовать при обращении к ресурсам, адрес которых содержит тот или иной хост.
Чтобы понять этот механизм, посмотрим, в каком формате задаётся путь к GitHub-репозиторию при его клонировании на локальный компьютер по SSH. Зайдём, например, в репозиторий Finansist пользователя andpop, нажмём на зеленую кнопку Code и выберем вкладку SSH:
Как видим, при обращении к этому репозиторию по протоколу SSH будет использоваться следующий адрес: [email protected]:andpop/Finansist.git.
Таким образом, при доступе по SSH адрес GitHub-репозитория имеет такую структуру:
git@хост:пользователь_GitHub/репозиторий.git
Если нам нужно работать с GitHub-репозиторием из первого профиля (пользователь andpop), то мы клонируем нужный репозиторий на локальный компьютер командой git clone, оставляя SSH-адрес без изменений:
git clone [email protected]:andpop/Finansist.git
При этом будет применен SSH-ключ id_rsa, заданный в конфигурационном файле %HOMEPATH%\.ssh\config для хоста github.com:
Host github.com
HostName github.com
User git
AddKeysToAgent yes
IdentityFile C:\Users\andrv\.ssh\id_rsa
Если же нам нужен репозиторий из второго профиля (пользователь andpop-mrsu), то при клонировании нужно в адресе репозитория к имени хоста github.com добавить префикс -work:
git clone [email protected]:andpop-mrsu/Finansist.git
В этом случае будет применен SSH-ключ id_rsa_work, заданный в конфигурационном файле %HOMEPATH%\.ssh\config для хоста github.com-work:
Host github.com-work
HostName github.com
User git
AddKeysToAgent yes
IdentityFile C:\Users\andrv\.ssh\id_rsa_work
Отметим, что адрес GitHub-репозитория, с которым связан локальный репозиторий, можно посмотреть с помощью команды git remote get-url origin. При необходимости этот адрес можно изменить командой git remote set-url origin.
Например, мы при клонировании репозитория Finansist из профиля пользователя andpop-mrsu забыли добавить префикс -work:
git clone [email protected]:andpop-mrsu/Finansist.git
Теперь при попытке «запушить» коммит в репозиторий пользователя andpop-mrsu будет применен не ключ id_rsa_work, а ключ id_rsa, который мы регистрировали для пользователя andpop. Возникнет ошибка:
ERROR: Permission to andpop-mrsu/Finansist.git denied to andpop.
fatal: Could not read from remote repository.
В этом случае нужно изменить адрес GitHub-репозитория, указав в качестве хоста github.com-work:
git remote set-url origin [email protected]:andpop-mrsu/Finansis.git
После этого доступ к GitHub-репозиторию будет получен и команда git push отработает корректно.
Итак, мы научились работать по протоколу SSH с двумя разными GitHub-профилями – теперь вы можете с одного компьютера делать изменения в личных и рабочих репозиториях, не отвлекаясь на ввод имени и пароля при каждом обращении к GitHub.