Git: настройка SSH-ключей для подключения к внешним репозиториям

14 марта 2022
Подключаться к удалённым репозиториям Гитлаба (Gitlab) можно двумя способами:

1) По HTTPS, каждый раз вводя логин и пароль пользователя.
Данный способ неудобен и отнимает время.


2) С помощью SSH-ключей.
Способ удобный, но требует единоразовой настройки.

Далее описывается процесс настройки SSH-ключей.

Шаг 1. Создание ключа

Для генерации будем использовать алгоритм ED25519. Более подробно о поддерживаемых алгоритмах можно узнать из официальной документации Гитлаба https://docs.gitlab.com/user/ssh/

Открываем консоль Гита и вводим команду (вместо фразы Ключ для test.ru можно указать любой текстовый комментарий):
ssh-keygen -t ed25519 -C "Ключ для test.ru"

Далее Гит спросит в какой файл нужно сохранить ключ и предложит стандартный путь («Enter file in which to save the key (/c/Users/Владимир/.ssh/id_ed25519)»). Наш ключ будет храниться по адресу C:\OpenServer\domains\test.ru\keys\test1. Указываем адрес создаваемого файла и нажимаем Enter.

Затем Гит попросит придумать и ввести защитную фразу / пароль («Enter passphrase (empty for no passphrase)»). Я ничего не указываю и сразу нажимаю Enter. На следующий вопрос о повторе защитной фразы так же нажимаем Enter.

Ключ создан.


Теперь в папке C:\OpenServer\domains\test.ru\keys\ появились два файла:
  • test1.pub — файл с публичной частью ключа (публичный ключ). Публичный ключ указывается в настройках Гитлаба.
  • test1 — файл с приватной частью ключа (приватный ключ). Приватный ключ остаётся храниться на вашем компьютере.


Шаг 2. Указываем публичный ключ на стороне Gitlab

В Гитлабе любо сразу заходим в раздел «SSH-ключи» (SSH-Keys), находящийся по адресу /-/user_settings/ssh_keys
Либо открываем пользовательское меню и нажимаем на пункт «Персональные настройки» (Preferences).


Далее в левом меню кликаем на пункт «SSH-ключи» (SSH-Keys), а после открытия страницы ключей нажимаем на кнопку «Добавить новый ключ» (Add new key).


На открывшейся странице будет находиться форма добавления ключа, заполняем поля:
  • В поле «Ключ» (Key) указываем публичный ключ, т.е. вставляем содержимое файла test1.pub;
  • В поле «Заголовок» (Title) указываем название ключа (можно ввести любой текст);
  • В поле «Дата истечения» (Expiration date) убираем дату и делаем его пустым. Это нужно, чтобы сделать ключ бессрочным.

После заполнения полей нажимаем кнопку «Добавить ключ» (Add key).


Публичный ключ в Gitlab добавлен.


Шаг 3. Указываем ключ в SSH-агенте

Непосредственную работу с ключами выполняет специальная программа ssh-agent. Чтобы программа знала о существовании нашего ключа, мы должны ей сообщить о нём. Кроме того, в момент использования консоли Гита программа SSH-агент может быть вовсе не запущена. Поэтому сначала запускаем агента, а потом сообщаем ему о ключе.

Вводим в консоли Гита команду, запускающую SSH-агента:
eval $(ssh-agent -s)

Затем вводим команду, указывающую SSH-агенту расположение ключа
ssh-add C:/OpenServer/domains/test.ru/keys/test1

В ответ консоль сообщит, что ключ добавлен («Identity added»).


Теперь проверим соединение с внешним репозиторием Gitlab:
$ ssh -T git@ваш-репозиторий-на-gitlab.ru

В случае успешного соединения получим ответ Welcome to GitLab.


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

Шаг 4. Автоматизация запуска SSH-агента и указания ключей

Теперь нужно в файле запуска Git Bash прописать запуск утилиты SSH-agent и добавление ключа. В директории установки Git Bash находим и открываем файл \etc\bash.bashrc (в моём случае полный путь выглядит так: C:\Program Files\Git\etc\bash.bashrc).

Затем в конец файла добавляем скрипт (не забудьте вместо C:/OpenServer/domains/test.ru/keys/test1 указать свой путь к к файлу закрытого ключа, на нижнем скриншоте показал стрелочками место внесения изменений. И будьте внимательны со слешами):
######################################## ЗАПУСК SSH-АГЕНТА: НАЧАЛО ########################################
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 C:/OpenServer/domains/test.ru/keys/test1
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add C:/OpenServer/domains/test.ru/keys/test1
fi

unset env
######################################## ЗАПУСК SSH-АГЕНТА: КОНЕЦ ########################################

Итоговый файл выглядит так:


Готово, настройка SSH-ключей выполнена.

Шаг 5. Перенастройка подключений к внешним репозиториям с HTTPS на SSH

Если адреса ваших внешних репозиториев указаны через HTTPS, то вам нужно изменить их на SSH. Посмотреть адреса удалённых репозиториев можно с помощью команды:
git remote -v

Установить новый адрес репозитория можно следующими способами:
  1. Изменить URL репозитория, используя нижнюю команду.
    Способ неудобен тем, что наверняка потребуется решать конфликты.
    #Тут git@mmgit.ru:main/test1.git это ssh-путь к вашему удалённому репозиторию
    git remote set-url origin git@mmgit.ru:main/test1.git
  2. Снача удалить связь с внешнего репозиторием, а потом добавить новую связь.
    Способ неудобен тем, что тоже наверняка потребуется решать конфликты.
    #Удаляем связь с репозиторием
    $ git remote remove origin
    
    #Добавляем новую связь
    $ git remote add origin git@mmgit.ru:main/test1.git
  3. Удалить локальный репозиторий и создать новый, скопировав данные с внешнего репозитория.
    Способ удобен тем, что не требует разрешать конфликты.
    $ git clone git@mmgit.ru:main/test1.git .

На этом всё :)