ssh-keygen
Генерация, управление и конвертация SSH-ключей
Описание
ssh-keygen — утилита из пакета OpenSSH для создания пар криптографических ключей, используемых при аутентификации SSH. Команда генерирует два файла: приватный ключ (остаётся только у вас, аналог пароля) и публичный ключ с расширением .pub (размещается на серверах в файле ~/.ssh/authorized_keys). Помимо генерации, ssh-keygen умеет управлять существующими ключами: менять passphrase, получать fingerprint, добавлять в known_hosts.
Современный рекомендуемый алгоритм — Ed25519 (эллиптическая криптография): короткие ключи, высокая скорость, отличная безопасность. Для совместимости со старыми системами используется RSA-4096. Алгоритм DSA официально устарел и не рекомендуется. ECDSA работает, но Ed25519 предпочтительнее.
Типичный рабочий процесс: сгенерировать пару ключей → скопировать публичный ключ на сервер через ssh-copy-id → подключаться без пароля. Для GitHub/GitLab: скопировать содержимое .pub-файла в настройки аккаунта раздел "SSH keys". Отдельные ключи для разных сервисов — хорошая практика безопасности.
Синтаксис
| Часть | Описание |
|---|---|
| -t тип | Алгоритм ключа: ed25519, rsa, ecdsa, dsa |
| -b биты | Длина ключа в битах (для RSA: минимум 2048, рекомендуется 4096) |
| -f файл | Путь к файлу приватного ключа (публичный создаётся рядом с суффиксом .pub) |
| -C строка | Комментарий в публичный ключ (обычно email или описание назначения) |
Флаги и опции
| Флаг | Описание |
|---|---|
| -t TYPE | Тип ключа: ed25519 (рекомендуется), rsa, ecdsa, dsa (устарел) |
| -b BITS | Размер ключа в битах. Для Ed25519 игнорируется (фиксированный). Для RSA: 2048 (мин) / 4096 (рекоменд) |
| -f FILE | Имя/путь файла для сохранения ключа. По умолчанию: ~/.ssh/id_ed25519 или id_rsa |
| -C COMMENT | Комментарий, добавляемый в публичный ключ. Не влияет на безопасность, удобен для идентификации |
| -N PASSPHRASE | Установить passphrase сразу (в скриптах); пустая строка "" = без passphrase |
| -p | Изменить (или добавить/удалить) passphrase существующего ключа без смены самого ключа |
| -l | Показать fingerprint ключа (отпечаток для идентификации) |
| -E HASH | Алгоритм хеширования fingerprint: sha256 (по умолчанию) или md5 |
| -v | Режим визуализации: показать ASCII-art "randomart" для fingerprint |
| -R HOSTNAME | Удалить все ключи указанного хоста из ~/.ssh/known_hosts |
| -y | Вывести публичный ключ из приватного файла (если потерян .pub) |
| -i | Импортировать ключ из другого формата (PKCS8, PEM) в OpenSSH-формат |
| -e | Экспортировать ключ в другой формат (RFC4716, PKCS8, PEM) |
| -q | Тихий режим: не выводить информационные сообщения |
Паттерны использования
Создать ключ Ed25519 (рекомендуется)
Современный алгоритм — короткий, быстрый, надёжный.
# Интерактивно (запросит путь и passphrase)
ssh-keygen -t ed25519 -C "viktor@work"
# Неинтерактивно (для скриптов)
ssh-keygen -t ed25519 -C "deploy-key" \
-f ~/.ssh/deploy_ed25519 -N ""
# Проверить созданные файлы
ls -la ~/.ssh/deploy_ed25519*
Создать ключ RSA-4096 (совместимость)
Для серверов, не поддерживающих Ed25519 (старые OpenSSH).
ssh-keygen -t rsa -b 4096 \
-C "user@example.com" \
-f ~/.ssh/id_rsa_github
# Публичный ключ для вставки в GitHub
cat ~/.ssh/id_rsa_github.pub
Скопировать публичный ключ на сервер
Установить ключ для беспарольного входа.
# Через ssh-copy-id (рекомендуется)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
# Вручную (если ssh-copy-id недоступен)
cat ~/.ssh/id_ed25519.pub | ssh user@server \
"mkdir -p ~/.ssh && chmod 700 ~/.ssh &&
cat >> ~/.ssh/authorized_keys &&
chmod 600 ~/.ssh/authorized_keys"
Проверить fingerprint ключа
Идентифицировать ключ по отпечатку.
# Fingerprint своего ключа ssh-keygen -l -f ~/.ssh/id_ed25519 # Fingerprint публичного ключа ssh-keygen -l -f ~/.ssh/id_ed25519.pub # С визуализацией (randomart) ssh-keygen -l -v -f ~/.ssh/id_ed25519.pub # SHA256 fingerprint (по умолчанию) ssh-keygen -l -E sha256 -f ~/.ssh/id_ed25519.pub
Сменить passphrase
Добавить или изменить защиту приватного ключа без пересоздания.
# Интерактивная смена passphrase
ssh-keygen -p -f ~/.ssh/id_ed25519
# Задать passphrase сразу
ssh-keygen -p -f ~/.ssh/id_ed25519 \
-P "old_passphrase" \
-N "new_passphrase"
# Убрать passphrase (оставить пустой)
ssh-keygen -p -f ~/.ssh/id_ed25519 -N ""
Удалить устаревший ключ хоста
Очистить known_hosts при смене сервера или пересоздании ключей.
# Удалить ключ конкретного хоста
ssh-keygen -R server.example.com
ssh-keygen -R 192.168.1.10
# Восстановить публичный ключ из приватного
ssh-keygen -y -f ~/.ssh/id_ed25519 \
> ~/.ssh/id_ed25519.pub
Советы и предупреждения
Приватный ключ без passphrase — это как пароль в открытом виде. Если файл ключа похитят, злоумышленник получит полный доступ ко всем серверам. Используйте
ssh-agent + ssh-add, чтобы не вводить passphrase при каждом подключении — это и удобно, и безопасно.
Создавайте отдельные пары ключей для GitHub, рабочего сервера, личного VPS и т.д. Это позволяет отозвать доступ к одному сервису, не затрагивая остальные. Используйте
-f ~/.ssh/github_ed25519 при генерации и настройте ~/.ssh/config с директивой IdentityFile.
После создания ключей проверьте права:
chmod 700 ~/.ssh, chmod 600 ~/.ssh/id_ed25519, chmod 644 ~/.ssh/id_ed25519.pub. SSH откажет в использовании ключа, если права слишком широкие (например, 644 на приватный ключ).
Файл без расширения
.pub — это приватный ключ, его нельзя никуда копировать, отправлять, добавлять в репозиторий. Публичный ключ (.pub) — безопасен для передачи, его и нужно добавлять в GitHub, на серверы, в CI/CD-переменные. Проверьте, что в .gitignore есть *.pem и id_* (без .pub).
Алгоритм DSA полностью устарел и отключён в современных версиях OpenSSH. RSA с длиной ключа менее 2048 бит считается небезопасным. Если в системе есть старые ключи типа
id_dsa — пересоздайте их как Ed25519 и обновите authorized_keys на всех серверах.