Введение / Зачем это нужно
Работа с Git-репозиториями по протоколу HTTPS требует постоянного ввода логина и пароля (или токена). Это неудобно и небезопасно. SSH-ключи решают обе проблемы:
- Безопасность: Используется пара криптографических ключей вместо пароля. Приватный ключ хранится только у вас.
- Удобство: После однократной настройки
ssh-agentне нужно вводить никакие учетные данные при каждомgit push,git pullилиgit clone.
Это руководство предназначено для пользователей Linux (Ubuntu, Debian, Fedora, Arch и др.) и поможет настроить бесшовную и безопасную работу с любым Git-хостингом, поддерживающим SSH (GitHub, GitLab, Bitbucket, собственный сервер).
Требования / Подготовка
Перед началом убедитесь, что:
- У вас есть установленный Git (версии 2.30+). Проверить:
git --version. - У вас есть аккаунт на GitHub, GitLab или другом сервисе, куда вы планируете пушить код.
- У вас есть доступ к терминалу (консоли) Linux с правами вашего обычного пользователя.
- Пакет
openssh-clientустановлен. Обычно он есть по умолчанию. Проверить можно командой:
Если команда не найдена, установите пакет:ssh -V- Ubuntu/Debian:
sudo apt update && sudo apt install openssh-client - Fedora:
sudo dnf install openssh-clients - Arch:
sudo pacman -S openssh
- Ubuntu/Debian:
Пошаговая инструкция
Шаг 1: Сгенерируйте новую SSH-ключевую пару
Рекомендуется использовать современный и безопасный алгоритм ED25519. Если ваша система очень старая и не поддерживает его, используйте RSA (минимум 4096 бит).
- Откройте терминал.
- Выполните команду генерации. Вам будет предложено выбрать место сохранения файла (по умолчанию
~/.ssh/id_ed25519) и задать парольную фразу (passphrase).ssh-keygen -t ed25519 -C "your_email@example.com"-t ed25519— тип ключа.-C "your_email@example.com"— комментарий, обычно указывают email, привязанный к аккаунту на Git-хостинге. Это удобно для идентификации.
- Настройте парольную фразу (passphrase):
- Сильная парольная фраза (рекомендуется): Защитит ваш приватный ключ, если кто-то получит физический доступ к вашему диску. Вам нужно будет ввести её один раз при запуске
ssh-agent. - Пустая парольная фраза: Ключ не будет защищен паролем. Удобно для автоматизации, но менее безопасно. Нажимайте
Enterдважды, чтобы оставить поле пустым.
В результате в директории~/.ssh/появятся два файла:id_ed25519— приватный ключ. НИКОМУ НЕ ПОКАЗЫВАТЬ.id_ed25519.pub— публичный ключ. Его вы будете загружать на сервер.
- Сильная парольная фраза (рекомендуется): Защитит ваш приватный ключ, если кто-то получит физический доступ к вашему диску. Вам нужно будет ввести её один раз при запуске
Шаг 2: Запустите и добавьте ключ в ssh-agent
ssh-agent — это программа-посредник, которая хранит ваш разблокированный приватный ключ в памяти и подписывает запросы от вашего имени. Это избавляет от необходимости вводить парольную фразу при каждой операции с Git.
- Запустите агент (в большинстве современных дистрибутивов он запускается автоматически при входе в систему, но лучше убедиться):
eval "$(ssh-agent -s)"
Вывод должен быть примерно таким:Agent pid 12345. - Добавьте ваш приватный ключ в агент:
ssh-add ~/.ssh/id_ed25519
Если вы задали парольную фразу, система запросит её сейчас. После успешного добавления вы увидите сообщениеIdentity added: /home/username/.ssh/id_ed25519 (your_email@example.com).
Шаг 3: Скопируйте публичный ключ в буфер обмена
Вам нужно передать содержимое файла ~/.ssh/id_ed25519.pub (целиком, включая ssh-ed25519 ... comment) в настройки вашего аккаунта на Git-хостинге.
Используйте команду cat для вывода и перенаправление вывода в буфер обмена (или скопируйте вручную):
# Для систем с xclip (Ubuntu/Debian: sudo apt install xclip)
cat ~/.ssh/id_ed25519.pub | xclip -selection clipboard
echo "Публичный ключ скопирован в буфер обмена."
# Альтернатива: просто выведите на экран и скопируйте мышкой
cat ~/.ssh/id_ed25519.pub
Шаг 4: Добавьте публичный ключ в аккаунт сервиса
Процесс почти идентичен для GitHub, GitLab и других сервисов.
Для GitHub:
- В правом верхнем углу нажмите на аватар → Settings.
- В меню слева выберите SSH and GPG keys.
- Нажмите New SSH key.
- В поле Title дайте ключу осмысленное имя (например, "Ноутбук - Ubuntu 22.04").
- В поле Key вставьте содержимое из буфера обмена (то, что вы скопировали на предыдущем шаге).
- Нажмите Add SSH key. Может потребоваться ввести пароль от аккаунта для подтверждения.
Для GitLab:
- Нажмите на аватар → Preferences.
- В меню слева выберите SSH Keys.
- В поле Key вставьте ключ. Поле Title заполните по желанию.
- Нажмите Add key.
Шаг 5: Протестируйте подключение
Перед тем как клонировать или работать с репозиториями, проверьте, что аутентификация проходит успешно.
Для GitHub:
ssh -T git@github.com
Для GitLab (gitlab.com):
ssh -T git@gitlab.com
Для GitLab (самохост):
ssh -T git@<ваш-домен-гитлаба>
- При первом подключении вы увидите предупреждение о fingerprint хоста. Согласитесь, набрав
yes. - Успешный результат выглядит примерно так:
Или для GitLab:Hi <username>! You've successfully authenticated, but GitHub does not provide shell access.Welcome to GitLab, @username!
Если вы видите сообщение Permission denied (publickey), вернитесь к шагу 2 и проверьте, что ключ добавлен в ssh-agent (ssh-add -l), и что вы скопировали публичный ключ (.pub), а не приватный.
Проверка результата
Теперь попробуйте клонировать любой публичный репозиторий по его SSH-URL (а не HTTPS!). Например:
git clone git@github.com:FixPedia/example-repo.git
Процесс должен пройти без запросов пароля или токена. Если клонирование прошло успешно, и вы можете делать git push в свои репозитории — настройка завершена!
Возможные проблемы
1. Ошибка Permission denied (publickey) при тесте или клонировании
- Причина: Сервер не видит ваш ключ или
ssh-agentне предлагает его. - Решение:
- Проверьте, что ключ добавлен в агент:
ssh-add -l. Если список пуст или ключа нет — добавьте заново:ssh-add ~/.ssh/id_ed25519. - Убедитесь, что вы загрузили публичный ключ (
id_ed25519.pub) в настройки аккаунта на сервере (GitHub/GitLab). - Проверьте, что в
~/.ssh/config(если он есть) нет ошибочных настроек для хостаgithub.comилиgitlab.com.
- Проверьте, что ключ добавлен в агент:
2. Неправильные права на файлы в ~/.ssh/
- Причина: SSH очень строго относится к правам доступа. Приватный ключ не должен быть доступен на запись для других пользователей.
- Решение: Выполните команды:
chmod 700 ~/.ssh chmod 600 ~/.ssh/id_ed25519 chmod 644 ~/.ssh/id_ed25519.pub
3. Проблемы с ssh-agent после перезагрузки
- Причина: Агент завершает работу при выходе из системы.
- Решение: Настройте автоматический запуск
ssh-agentи добавление ключа при старте сессии. Часто это делается через файл~/.bashrcили~/.zshrc:
После добавления выполните# Автозапуск агента, если он не запущен if ! pgrep -u "$USER" ssh-agent > /dev/null; then eval "$(ssh-agent -s)" fi # Добавление ключа, если он еще не добавлен ssh-add -l > /dev/null || ssh-add ~/.ssh/id_ed25519 2>/dev/nullsource ~/.bashrc(или перезайдите в систему).
4. Сервер использует нестандартный порт SSH (не 22)
- Причина: Некоторые корпоративные или самохостенные Git-серверы используют порт, отличный от 22 (например, 2222).
- Решение: Настройте SSH для конкретного хоста через конфигурационный файл
~/.ssh/config:
Затем используйте в URL короткое имя хоста:Host gitlab-company HostName gitlab.yourcompany.com Port 2222 User git IdentityFile ~/.ssh/id_ed25519_companygit@gitlab-company:group/project.git.