linux ssh-network

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". Отдельные ключи для разных сервисов — хорошая практика безопасности.

Синтаксис

ssh-keygen [опции] # Основные режимы: ssh-keygen -t тип [-b биты] [-f файл] [-C комментарий] # генерация ssh-keygen -p [-f файл] # смена passphrase ssh-keygen -l [-f файл] # fingerprint ключа ssh-keygen -R хост # удалить из known_hosts
ЧастьОписание
-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
Приватный ключ без 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 и RSA-1024 устарели
Алгоритм DSA полностью устарел и отключён в современных версиях OpenSSH. RSA с длиной ключа менее 2048 бит считается небезопасным. Если в системе есть старые ключи типа id_dsa — пересоздайте их как Ed25519 и обновите authorized_keys на всех серверах.