Git: настройка SSH-ключей для подключения к внешним репозиториям
14 марта 2022
Подключаться к удалённым репозиториям Гитлаба (Gitlab) можно двумя способами:
1) По HTTPS, каждый раз вводя логин и пароль пользователя.
Данный способ неудобен и отнимает время.

2) С помощью SSH-ключей.
Способ удобный, но требует единоразовой настройки.
Далее описывается процесс настройки SSH-ключей.
Открываем консоль Гита и вводим команду (вместо фразы Ключ для 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\ появились два файла:

Либо открываем пользовательское меню и нажимаем на пункт «Персональные настройки» (Preferences).

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

На открывшейся странице будет находиться форма добавления ключа, заполняем поля:
После заполнения полей нажимаем кнопку «Добавить ключ» (Add key).

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

Вводим в консоли Гита команду, запускающую SSH-агента:
Затем вводим команду, указывающую SSH-агенту расположение ключа
В ответ консоль сообщит, что ключ добавлен («Identity added»).

Теперь проверим соединение с внешним репозиторием Gitlab:
В случае успешного соединения получим ответ Welcome to GitLab.

Ключ добавлен, но мы замучаемся каждый раз в консоли вводить команды на запуск SSH-агента и добавление ключа, нужно этот процесс автоматизировать.
Затем в конец файла добавляем скрипт (не забудьте вместо C:/OpenServer/domains/test.ru/keys/test1 указать свой путь к к файлу закрытого ключа, на нижнем скриншоте показал стрелочками место внесения изменений. И будьте внимательны со слешами):
Итоговый файл выглядит так:

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