SSH-ключи: ed25519 вместо RSA
При работе с GitHub, GitLab или любым другим хостингом Git вам нужна аутентификация. Когда вы делаете git push, сервер должен знать «это действительно Иван Петров, а не злоумышленник». Способов два: HTTPS с паролем (или токеном) и SSH с ключом. Этот урок — про второй. SSH удобнее: настроили один раз, и всё работает без ввода пароля.
После урока у вас будет: сгенерированный SSH-ключ ed25519 (современный стандарт), он добавлен в ssh-agent и в GitHub-аккаунт, и команда git push работает без ввода паролей.
Зачем SSH-ключи
Когда вы делаете git clone [email protected]:user/repo.git, протокол SSH. Когда git clone https://github.com/user/repo.git, протокол HTTPS. С точки зрения Git операции одинаковые. Отличие в аутентификации.
SSH удобнее. Один раз настроили — и все операции с GitHub проходят без ввода паролей. Безопаснее, потому что приватный ключ никогда не покидает вашу машину.
Что такое SSH-ключ
SSH использует асимметричную криптографию. У вас два файла:
- Приватный ключ — большое число, хранится у вас на машине, никогда никому не показывается
- Публичный ключ — производный от приватного, можно делиться, отдаётся серверу
Когда вы подключаетесь по SSH, сервер посылает вам случайный challenge. Вы подписываете его приватным ключом. Сервер проверяет подпись публичным. Если подпись валидна — это вы.
Гениальность: ваш приватный ключ никогда не передаётся по сети. Только подписи. Перехватить трафик и притвориться вами невозможно (без приватного ключа подпись не сделать).
ed25519 vs RSA: какой алгоритм
Раньше стандартом был RSA 2048 (потом 4096). Современный стандарт — ed25519 (Edwards-curve, эллиптическая криптография). В чём разница:
Что выбрать в 2026 году? Однозначно ed25519. Никаких причин использовать RSA, если у вас не легаси-сервер на старом OpenSSH < 6.5 (2014 год — таких уже нет). GitHub, GitLab, Bitbucket — все поддерживают ed25519 с 2017-2018 годов.
Генерация ключа
Команда:
ssh-keygen -t ed25519 -C "[email protected]"
Разбор:
-t ed25519— тип ключа-C "[email protected]"— комментарий (обычно email), помогает идентифицировать ключ, особенно если у вас несколько
Программа задаст три вопроса:
Enter file in which to save the key (/Users/ivan/.ssh/id_ed25519): [Enter]
Enter passphrase (empty for no passphrase): [пароль или Enter для пустого]
Enter same passphrase again: [пароль ещё раз]
Пустой passphrase — удобно (не вводить при каждом подключении), но менее безопасно. Если ваш ноутбук украдут — у вора будет доступ к вашему GitHub. Passphrase — это второй фактор. На macOS и Linux passphrase легко кешируется через ssh-agent + Keychain, поэтому реально вводите редко. Рекомендую ставить.
После выполнения у вас в ~/.ssh/ появится два файла:
ls -la ~/.ssh/
# id_ed25519 — приватный ключ (НИКОМУ не показывайте)
# id_ed25519.pub — публичный ключ (можно делиться)
Содержимое публичного ключа:
cat ~/.ssh/id_ed25519.pub
# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGxV6... [email protected]
Одна строка. Это и есть то, что вы дадите GitHub.
Добавление в ssh-agent
ssh-agent — фоновый процесс, который держит расшифрованный приватный ключ в памяти, чтобы не вводить passphrase при каждом подключении.
macOS
# Запустить ssh-agent (обычно уже запущен)
eval "$(ssh-agent -s)"
# Добавить ключ с автоматическим запоминанием passphrase в Keychain
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
Для постоянного эффекта добавьте в ~/.ssh/config:
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
После этого passphrase будет запрошен один раз при первом использовании, дальше macOS Keychain хранит его.
Linux
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-agent держит ключ до выхода из сессии. Для постоянности используйте keychain (утилита, не путать с macOS Keychain) или настройте автозапуск agent в .bashrc / .zshrc.
WSL2 / Windows
Если в WSL2 — работает как Linux. Если используете Git for Windows — там встроенный OpenSSH:
# В PowerShell
Start-Service ssh-agent
ssh-add C:\Users\Name\.ssh\id_ed25519
Добавление публичного ключа в GitHub
- Скопируйте содержимое
id_ed25519.pubв буфер:
# macOS
pbcopy < ~/.ssh/id_ed25519.pub
# Linux (нужен xclip или wl-copy)
xclip -selection clipboard < ~/.ssh/id_ed25519.pub
# Просто посмотреть и скопировать руками
cat ~/.ssh/id_ed25519.pub
- На GitHub: Settings -> SSH and GPG keys -> New SSH key
- Title: что-нибудь узнаваемое, например «MacBook Pro M3 2025»
- Key type: Authentication Key
- Key: вставьте содержимое
- Add SSH key (потребует подтверждения паролем)
На GitLab аналогично: Preferences -> SSH Keys -> Add new key.
Проверка подключения
ssh -T [email protected]
При первом подключении SSH попросит подтвердить fingerprint GitHub-сервера:
The authenticity of host 'github.com (140.82.121.3)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Этот fingerprint — публично известный отпечаток ключа GitHub-серверов. Сверьтесь с https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints — там список актуальных. На май 2026:
- ED25519:
SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU - RSA:
SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s
Если совпадает — yes, Enter. Дальше:
Hi ivan-petrov! You've successfully authenticated, but GitHub does not provide shell access.
Это и есть «всё работает». Вы успешно аутентифицировались. Команда git push теперь будет работать молча.
Сообщение «GitHub does not provide shell access» — это нормально. SSH-протокол по умолчанию открывает shell, но GitHub не пускает в shell — он только обрабатывает Git-команды. Вы аутентифицировались, на этом успех.
~/.ssh/config — настройка множественных хостов
Если у вас несколько GitHub-аккаунтов (личный и рабочий), или вы работаете и с GitHub, и с GitLab — ~/.ssh/config облегчает жизнь.
# ~/.ssh/config
# Личный GitHub
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
AddKeysToAgent yes
UseKeychain yes
# Рабочий GitHub (используем алиас github-work)
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
AddKeysToAgent yes
UseKeychain yes
# Корпоративный GitLab
Host gitlab.bigcorp.com
HostName gitlab.bigcorp.com
User git
Port 22
IdentityFile ~/.ssh/id_ed25519_work
Использование:
# Личный
git clone [email protected]:ivan-personal/repo.git
# Рабочий — используем алиас github-work
git clone git@github-work:bigcorp/internal-repo.git
Удобно для людей с несколькими работами / контрактами / open-source.
Если что-то пошло не так
Permission denied (publickey)
Самая частая ошибка. Возможные причины:
- Публичный ключ не добавлен на GitHub. Проверьте Settings -> SSH and GPG keys.
- Используется не тот ключ. Проверьте:
ssh-add -lпоказывает текущие ключи в агенте. - Файл ключа имеет неправильные права.
Права должны быть строго:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 644 ~/.ssh/config
SSH откажется использовать ключ, если права слишком открыты (например, 644 на приватный ключ). Это защита от того, что другой пользователь на машине прочитает ваш ключ.
Debug подключения
Если непонятно, что не так:
ssh -vT [email protected]
Флаг -v (verbose) показывает каждый шаг handshake. Можно увидеть, какой ключ Git пытается использовать, что говорит сервер.
Попробуй сам
- Сгенерируйте ed25519-ключ (если ещё не сделали):
ssh-keygen -t ed25519 -C "ваш[email protected]"
- Посмотрите публичный ключ:
cat ~/.ssh/id_ed25519.pub
-
Добавьте на GitHub (Settings -> SSH and GPG keys -> New SSH key).
-
Проверьте подключение:
ssh -T [email protected]
- Если получилось «Hi username!» — поздравляю, SSH работает. В следующих модулях будем клонировать репозитории через SSH.
SSH в глубину: ключи, конфиг, туннели chmod: права доступа в числах и буквах