SSH ключи для Git

Настройка SSH-аутентификации для безопасного подключения к GitHub/GitLab без ввода пароля

Зачем нужно

  • Не вводить логин/пароль при каждом push/pull
  • Безопаснее HTTPS с паролем
  • Обязательно для многих рабочих процессов
  • Позволяет работать с несколькими аккаунтами

Где используется

  • Подключение к GitHub, GitLab, Bitbucket
  • Работа с приватными репозиториями
  • CI/CD системы для доступа к коду
  • Доступ к серверам через SSH

Предпосылки

Как работает SSH

[Ваш компьютер]                    [GitHub]
Приватный ключ    ←── пара ──→    Публичный ключ
(~/.ssh/id_ed25519)               (в настройках аккаунта)
     ↓
Подписывает запрос ──────────────→ Проверяет подпись
                                   ✓ Доступ разрешён
  • Приватный ключ — хранится ТОЛЬКО на вашем компьютере, никому не передаётся
  • Публичный ключ — загружается на GitHub, можно передавать свободно

Генерация SSH-ключа

Шаг 1: Проверить существующие ключи

ls -al ~/.ssh
# Если видите id_ed25519 и id_ed25519.pub — ключи уже есть

Шаг 2: Сгенерировать новый ключ

# Рекомендуемый алгоритм — Ed25519
ssh-keygen -t ed25519 -C "your_email@example.com"

# Если система не поддерживает Ed25519:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

Диалог генерации:

Generating public/private ed25519 key pair.
Enter file in which to save the key (~/.ssh/id_ed25519): [Enter — по умолчанию]
Enter passphrase (empty for no passphrase): [Рекомендуется ввести пароль]
Enter same passphrase again: [Повторить пароль]

Шаг 3: Запустить ssh-agent

# macOS/Linux
eval "$(ssh-agent -s)"
# Agent pid 12345

# Windows (Git Bash)
eval "$(ssh-agent -s)"

Шаг 4: Добавить ключ в ssh-agent

# macOS
ssh-add --apple-use-keychain ~/.ssh/id_ed25519

# Linux / Windows (Git Bash)
ssh-add ~/.ssh/id_ed25519

Добавление ключа на GitHub

Шаг 1: Скопировать публичный ключ

# macOS
pbcopy < ~/.ssh/id_ed25519.pub

# Linux
cat ~/.ssh/id_ed25519.pub | xclip -selection clipboard

# Windows (Git Bash)
cat ~/.ssh/id_ed25519.pub | clip

# Или просто вывести и скопировать вручную
cat ~/.ssh/id_ed25519.pub
# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG... your_email@example.com

Шаг 2: Добавить на GitHub

  1. GitHub → Settings → SSH and GPG keys
  2. New SSH key
  3. Title: "Мой ноутбук" (любое описание)
  4. Key type: Authentication Key
  5. Вставить публичный ключ
  6. Add SSH key

Проверка подключения

ssh -T git@github.com
# Hi username! You've been successfully authenticated, but GitHub
# does not provide shell access.

Если видите "Hi username!" — всё работает.

Переключение с HTTPS на SSH

# Проверить текущий remote
git remote -v
# origin  https://github.com/user/repo.git (fetch)

# Изменить на SSH
git remote set-url origin git@github.com:user/repo.git

# Проверить
git remote -v
# origin  git@github.com:user/repo.git (fetch)

Работа с несколькими аккаунтами

Файл ~/.ssh/config

# ~/.ssh/config

# Личный аккаунт
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_personal

# Рабочий аккаунт
Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_work

Использование

# Личный репозиторий
git clone git@github.com:personal/repo.git

# Рабочий репозиторий
git clone git@github-work:company/repo.git

Автозапуск ssh-agent

Windows (Git Bash) — добавить в ~/.bashrc

# ~/.bashrc
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=$(ssh-add -l >| /dev/null 2>&1; echo $?)

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

unset env

macOS — добавить в ~/.ssh/config

Host *
    AddKeysToAgent yes
    UseKeychain yes
    IdentityFile ~/.ssh/id_ed25519

Частые ошибки

  • Делиться приватным ключом — передавать можно ТОЛЬКО .pub файл
  • Забыть добавить ключ в ssh-agent — получите "Permission denied (publickey)"
  • Клонировать по HTTPS вместо SSH — тогда SSH-ключ не используется
  • Не поставить passphrase — без пароля кто угодно с доступом к файлу получит ваш ключ
  • Забыть перезапустить ssh-agent — после перезагрузки агент теряет ключи

Практика

  1. Проверьте есть ли у вас SSH-ключи (ls ~/.ssh)
  2. Сгенерируйте новый ключ Ed25519
  3. Добавьте публичный ключ на GitHub
  4. Проверьте подключение: ssh -T git@github.com
  5. Клонируйте репозиторий по SSH
  6. Сделайте push — убедитесь что пароль не запрашивается

Связанные темы

Ресурсы